初心者なのですが
たとえば、Edit1 〜 Edit9 までのすべてにおいて同一の処理をしたいとき
いちいち
procedure Tfrm1.Edit1Change(Sender: TObject);
begin
TEdit(Sender).SelectAll;
end;
っていうのを1〜9まで作らなくてはならないのでしょうか?
あと、実行した直後に処理をさせる等は可能なのでしょうか?
Edit1〜Edit9までのOnChangeイベントに、Edit1Changeを設定するだけです。
オブジェクトインスペクタでも設定できますし、FormCreateなどで、
Edit1.OnChange := Edit1Change;
Edit2.OnChange := Edit1Change;
Edit3.OnChange := Edit1Change;
・・・とするのでもよいですし。
> あと、実行した直後に処理をさせる等は可能なのでしょうか?
「何を」実行した直後に「何の」処理をさせたいのでしょうか。
>にしの 様
ありがとうございます。
元となるファイル名を持っておいて、作ったexeファイルを実行した直後に比較するとかです。
今は他のボタンにまぎれさせてその処理をやっているもので・・・
う〜ん、上の文章、閼伽さんが第三者になったつもりで読んで理解できます?
私には何がやりたいのか理解できないのですが・・・。
このアプリケーションは、EXEを作成するアプリケーションなのでしょうか。
それで、以前アプリケーションが出力したEXEと、現在出力したEXEがバイナリ比較で同じかどうかを見ると言うことでしょうか?
それとも、Edit1〜Edit9にはファイル名が入力されており、それぞれが同じファイル名かどうかを、OnChangeイベントで確認したいということでしょうか?
申し訳ありません・・・・説明下手なもので
えっとですね、処理内容なんですけれども
まず、アプリケーションが起動した時にファイル名の比較をして
ないなら新規に、あるならカウントアップしてリネームという事をしています
Edit1 〜 9 の方は、そのファイルに書き込む内容で
全体に共通として
・空欄の時はエラー
現在は
if edit1.Text <> '' then
edit2.Enabled := true
else
edit2.Enabled := false;
という風にして個別に処理をしているので、簡略化できないものか
・フォーカスが行ったら全選択
という事なのですが・・・本当説明が下手で申し訳ありません・・・
> 現在は
> if edit1.Text <> '' then
> edit2.Enabled := true
> else
> edit2.Enabled := false;
これは、OnChangeで行っているのでしょうか。
例えば、
edit1.Text := 'aaa'
edit2.Text := 'bbb'
edit3.Text := 'ccc'
とあったとき、edit1.Textが空になると、edit2.Textは入力不可になりますが、Edit3は入力可能なままです。
これは意図した動きでしょうか?
空欄がエラーというのは、ファイルに書き込むときだけチェックすればよいのかと思いますが。
> ・フォーカスが行ったら全選択
AutoSelectプロパティがTrueなら、フォーカスすると全選択状態になりますよ。
# バージョンによってないのかも。こちらDelphi7Pro
それと、最初に書かれている
> あと、実行した直後に処理をさせる等は可能なのでしょうか?
これは、EXEを実行した直後に、保存ファイルを特定し、存在したら連番でリネームしたい、ということですよね。
すでにリネーム処理は出来ていると言うことでしょうか。
出来ているのであれば、EXEを実行した直後に発生するイベントとしては、メインフォームに設定しているフォームのOnCreateイベントです。
ここに書けばよろしいかと思います。
よく見たらこのコード、
> procedure Tfrm1.Edit1Change(Sender: TObject);
> begin
> TEdit(Sender).SelectAll;
> end;
例で挙げただけですよね?
OnChangeでSelectAllすると、連続入力すると1文字しか入りませんよ。
いちいち、矢印キーか、マウスでキャレット位置を移動する必要があります。
>これは、OnChangeで行っているのでしょうか。
>例えば、
>edit1.Text := 'aaa'
>edit2.Text := 'bbb'
>edit3.Text := 'ccc'
>とあったとき、edit1.Textが空になると、edit2.Textは入力不可になりますが、>Edit3は入力可能なままです。
>これは意図した動きでしょうか?
初期値をFalseにしてOnChangeで処理してます
>ファイルに書き込むときだけチェックすればよいのかと
それも考えたんですが・・・どちらの方がよいのでしょうか?
>例で挙げただけですよね?
今はそのコードで全選択させています
バージョン古くてAutoSelectが無いもので・・・
>起動時〜
ぉぉ〜
まさにそれでしたっありがとうございますっ
AutoSelectプロパティないですか。
それならば、OnEnterイベントはありませんか?
こちらでその処理をしておけば、フォーカスが当たったときに全選択、となりますよ。
↑の追加ですが
procedure Tfrm1.Edit1Change(Sender: TObject);
begin
if edit1.Text <> '' then
edit2.Enabled := true
else
edit2.Enabled := false;
end;
procedure Tfrm1.Edit2Change(Sender: TObject);
begin
if edit2.Text <> '' then
edit3.Enabled := true
else
edit3.Enabled := false;
end;
という風に一つ一つコードを書いてます
TabOrderプロパティが連続しているのであれば、以下のようにして1つのイベントでできます。
TagプロパティとFindControlを組み合わせればTabOrderに関係なく、もう少し簡単になりますが、過去ログに出ているので割愛。
思いつきで作ってみました。FindNextControlがprotectedだったので、GetTabOrderListから取得するようにしました。
Edit1〜Edit9までが、連続したTabOrderで、Edit9でのチェックは無しということで組んであります。
procedure TForm1.EditChange(Sender: TObject);
var
CurCtrl: TEdit;
NextCtrl: TWinControl;
List: TList;
Index: Integer;
begin
CurCtrl := Sender As TEdit;
if CurCtrl.Name = 'Edit9' then
begin
end
else
begin
List := TList.Create;
try
GetTabOrderList(List);
if List.Count > 0 then
begin
Index := List.IndexOf(CurCtrl);
Inc(Index);
if Index = List.Count then Index := 0;
NextCtrl := List[Index];
if NextCtrl Is TEdit then
begin
NextCtrl.Enabled := CurCtrl.Text <> '';
end;
end;
finally
List.Free;
end;
end;
end;
詳しい解説ありがとうございまいした
後は上のソースを自分の環境に合わせていじってみようと思いますっ
ツイート | ![]() |