お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"兄弟コンポの一括リネーム"

この発言に対し以下のコメントが寄せられています
#01413 tach さん RE:兄弟コンポの一括リネーム
#01414 tach さん RE:兄弟コンポの一括リネーム

こんにちは tachです。 Mes17#312 かつぽーさんの発言から思いついたものです。 利用法はソースの先頭にあります。 あまり利用価値無いかも(-_-;) ---------------以下ソース----------- unit CompoRen; { コンポーネントエディタを利用して、  設計時に兄弟コンポの一括リネームを行う  使用法: eg. Edit1..Edit9の内、Edit5..Edit9を UserName1..UserName5に 変更する場合。 TargetName = 'Edit5' NewName = 'UserName' StartNo = 1 RepCount = 5 を設定した後このコンポーネントをダブルクリックする またはポップアップメニューから 'Rename XXXX'を選択する tach YIU01245 } interface uses Classes, SysUtils, DsgnIntf, Dialogs; type TCompoRenamer = class(TComponent) private FTargetName: String; FNewName: String; FStartNo: Integer; FRepCount: Integer; procedure SetTargetName(AName: String); procedure DoRename; public constructor Create(AOwner: TComponent); override; function CanRename: boolean; published property TargetName: String read FTargetName write SetTargetName; property NewName: String read FNewName write FNewName; property StartNo: Integer read FStartNo write FStartNo; property RepCount: Integer read FRepCount write FRepCount; end; TCompoRenamerEditor = class(TComponentEditor) public procedure ExecuteVerb(Index: Integer); override; function GetVerb(Index: Integer): String; override; function GetVerbCount: Integer; override; procedure Edit; override; end; procedure Register; implementation procedure Register; begin RegisterComponents('samples', [TCompoRenamer]); RegisterComponentEditor(TCompoRenamer, TCompoRenamerEditor); end; { Utils } type { エラー復帰時のリストで使用 } PPairedNames = ^TPairedNames; TPairedNames = record OldName, NewName: String; end; TPairedNameList = class(TList) function Add(AOld, ANew: String): Integer; function PairNames(Index: Integer): PPairedNames; procedure Clear; override; end; function TPairedNameList.Add(AOld, ANew: String): Integer; var P: PPairedNames; begin New(P); P.OldName := AOld; P.NewName := ANew; Result := Inherited Add(P); end; procedure TPairedNameList.Clear; var i: Integer; begin for i := Count - 1 downto 0 do begin DisPose(Items[i]); Items[i] := nil; end; inherited; end; function TPairedNameList.PairNames(Index: Integer): PPairedNames; begin Result := Items[Index]; end; constructor TCompoRenamer.Create(AOwner: TComponent); begin Inherited; FStartNo := 1; end; function TCompoRenamer.CanRename: boolean; begin Result := (FTargetName <> '') and (FNewName <> '') and (Owner <> nil) and (Owner.FindComponent(FTargetName) <> nil); end; procedure TCompoRenamer.DoRename; const EMessages: Array[0..1] of String = ('OldName must have format NameXX. XX:Number', 'Can''t Find Component: %s'); var i, N, Len, Count: Integer; OldNameBody, OldName, NewName: String; Compo: TComponent; List: TPairedNameList; begin if csDesigning in ComponentState then begin { 名前のチェック } i := 1; Len := Length(FTargetName); while i <= Len do begin if FTargetName[i] in ['0'..'9'] then break else if i = Len then raise Exception.Create(EMessages[0]); Inc(i); end; { ここもチェック } Count := i; while Count < Len do begin if not (FTargetName[Count] in ['0'..'9']) then raise Exception.Create(EMessages[0]); Inc(Count); end; List := TPairedNameList.Create; // エラー時復帰用 try Count := StrToInt(PChar(FTargetName) + i - 1); OldNameBody := Copy(FTargetName, 1, i - 1); N := FStartNo; try for i := Count to Count + FRepCount - 1 do begin OldName := OldNameBody + IntToStr(i); NewName := FNewName + IntToStr(N); Compo := Owner.FindComponent(OldName); if (Compo <> nil) then begin Compo.Name := NewName; Inc(N); List.Add(OldName, NewName); end else raise Exception.CreateFmt(EMessages[1], [OldName]); end; except for i := List.Count - 1 downto 0 do begin with List.PairNames(i)^ do begin Compo := Owner.FindComponent(NewName); if (Compo <> nil) then Compo.Name := OldName; end; end; raise; end; finally List.Free; end; end; end; procedure TCompoRenamer.SetTargetName(AName: String); begin if (AName <> FTargetName) and (Owner <> nil) and (Owner.FindComponent(AName) <> nil) then FTargetName := AName; end; function TCompoRenamerEditor.GetVerb(Index: Integer): String; begin if (Component as TCompoRenamer).CanRename then Result := 'Rename: ' + (Component as TCompoRenamer).FTargetName else Result := 'Can''t Rename'; end; function TCompoRenamerEditor.GetVerbCount: Integer; begin Result := 1; end; procedure TCompoRenamerEditor.ExecuteVerb(Index: Integer); begin Edit end; procedure TCompoRenamerEditor.Edit; begin ShowMessage('Edit Start'); (Component as TCompoRenamer).DoRename; ShowMessage('Edit End'); end; end.  Original document by tach 氏 ID:(YIU01245)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum