喫茶XRAYトップページ

[▲前のスレッド]

[6943] ボタンを押してFormShowメソッドを呼び出すときの引数返信 削除
2013/5/8 (水) 20:10:30 taki
マスターすみません。
また教えてください。

フォームに配置したボタンを押してフォームのFormshowメソッドを呼び出す時、
FormShowの引数が空だと「実パラメータが足りません」とコンパイラに叱られます。

FormShow(Sender);とかFormShow(Self);とすると動きますが、
どちらが望ましいのでしょうか。

FormにLabelとButtonを1個ずつ配置して実験してみました。
コード(一部抜粋)は以下の通りです。

procedure TForm1.Button1Click(Sender: TObject);
begin
  label1.Caption := '';
  FormShow(Sender);    //   TButton
//  FormShow(Self);    //   TForm1
//  FormShow(nil);     //   例外クラスEAccessViolation
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  label1.Caption := Sender.ClassName;
  beep;
end;

結果は、
プログラムを実行すると、ビープ音がして、ラベルにTForm1と表示されます。
その後、それぞれのコードでボタンを押すと、
FormShow(Sender);ならビープ音がして、ラベルにTButtonと表示されます。
FormShow(Self);ならビープ音がして、ラベルにTForm1と表示されます。
FormShow(nil);は例外クラスEAccessViolationが発生しました。

「動けば正義」ならどっちでもいいのでしょうか。


[6945] Re:ボタンを押してFormShowメソッドを呼び出すときの引数返信 削除
2013/5/9 (木) 00:28:30 Harry
はじめまして。
マスターさんではありませんが、比較的に得意分野ですので私が。

>FormShow(nil);は例外クラスEAccessViolationが発生しました。
これは label1.Caption := Sender.ClassName; のうち、
Sender.ClassNameの部分が結果としてnil.ClassNameになってしまうからですね。
つまりnilを渡すこと自体は問題ないですけど、それをどう使うかで例外となります。

>「動けば正義」ならどっちでもいいのでしょうか。
もちろんです。イベントハンドラと言っても、単なるメソッドに過ぎません。
というか、もっと暴挙に出ても平気です。
こんなことしてもOK。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Self.FormShow(TObject(PChar('Button1Clickから来ました!')));
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  if Sender=Form1 then begin
    Label1.Caption:=Sender.ClassName;
  end else begin
    Label1.Caption:=PChar(Sender);
  end;
end;


以上、偉そうに解説してみました。

[6946] Re2:ボタンを押してFormShowメソッドを呼び出すときの引数返信 削除
2013/5/9 (木) 08:50:46 taki
▼ Harryさん

> マスターさんではありませんが、比較的に得意分野ですので私が。

ありがとうございます。

> これは label1.Caption := Sender.ClassName; のうち、
> Sender.ClassNameの部分が結果としてnil.ClassNameになってしまうからですね。
> つまりnilを渡すこと自体は問題ないですけど、それをどう使うかで例外となります。


なるほど。受け取った側の問題ですか。
 
> >「動けば正義」ならどっちでもいいのでしょうか。
> もちろんです。イベントハンドラと言っても、単なるメソッドに過ぎません。


元々がTForm1のメソッドなので、TForm1が返るFormShow(Self)にします。

> もっと暴挙に出ても平気です。
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
>   Self.FormShow(TObject(PChar('Button1Clickから来ました!')));
> end;
>
> procedure TForm1.FormShow(Sender: TObject);
> begin
>   if Sender=Form1 then begin
>     Label1.Caption:=Sender.ClassName;
>   end else begin
>     Label1.Caption:=PChar(Sender);
>   end;
> end;
>


↑試してみました。
TObjectに型キャストしたら文字列だって渡すことができるのですね。


[6947] Re3:ボタンを押してFormShowメソッドを呼び出すときの引数返信 削除
2013/5/9 (木) 09:23:21 taki
どうでもいい事なのですが。
どうしてこんな質問をしたのか簡単に説明します。

今、引数に文書ファイル名を渡してその文書ファイルを
表示するプログラムを作っています。

文書ファイルを表示するコードはForm1.FormShowメソッドに
書いたのですが、フォント名やフォントサイズをユーザーが
自由に変更できる機能が必要になりました。

Form1に変更のボタンを配置し、ShowModalでForm2を表示し、
そこでフォントの変更をできるようにしました。

Form2が閉じられても、そのままではフォントの変更は当然
画面に表示されません。
そこで、再度FormShowを実行する必要があったのです。

なにせ、両端揃えや禁則処理、1ページに収めるための行数の
計算など、ごちゃごちゃと書いたので一つの手続きにまとめる
のが難しかったのです。

これで、なんとかなりそうです。(^_^)


[6948] Re4:ボタンを押してFormShowメソッドを呼び出すときの引数返信 削除
2013/5/9 (木) 21:19:28 Harry
結局ポインタとかIntegerとか、ほぼ何でもTObjectにキャストして渡せると思います。

>TObjectに型キャストしたら文字列だって渡すことができるのですね。
留意しなければならないのは、「メモリが確保されてる有効なポインタ」でないと、
渡された先で使えない、ということです。

まあ実際こんなことしないと思いますが、念のため。


>Form2が閉じられても、そのままではフォントの変更は当然
>画面に表示されません。
>そこで、再度FormShowを実行する必要があったのです。

うーん私が思うに、ダミーの引数を必要とするFormShowを呼ぶのはちょっと変な感じがします。
別の手続きを新設して、そこにFormShowに書いてある表示関係のコードを一切合財すべて
移してしまうのが普通かなーと。
それをFormShowから呼んだり、ShowModal後に呼んだりする、と。

模式的には以下のような感じです。

procedure TForm1.FormShow(Sender: TObject);
begin
  Hyouji();
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Hyouji();
end;

procedure TForm1.Hyouji();
begin
  Self.Tag:=Self.Tag+1;
  Label1.Caption:=Format('%d回目の表示', [Self.Tag]);
end;


[6949] Re5:ボタンを押してFormShowメソッドを呼び出すときの引数返信 削除
2013/5/9 (木) 22:32:19 taki
▼ Harryさん

> >そこで、再度FormShowを実行する必要があったのです。
> うーん私が思うに、ダミーの引数を必要とするFormShowを呼ぶのはちょっと変な感じがします。
> 別の手続きを新設して、そこにFormShowに書いてある表示関係のコードを一切合財すべて
> 移してしまうのが普通かなーと。
> それをFormShowから呼んだり、ShowModal後に呼んだりする、と。


やはり、そうですか。
全て移せるか・・・移せるはずですよね。
それでやってみます。

ありがとうございます。


[6950] Re6:ボタンを押してFormShowメソッドを呼び出すときの引数返信 削除
2013/5/9 (木) 22:44:13 taki
▼ Harryさん

あっさりとできました。
ありがとうございました。


[6952] Re7:ボタンを押してFormShowメソッドを呼び出すときの引数返信 削除
2013/5/9 (木) 23:49:49 Harry
▼ takiさん
> あっさりとできました。

それはよかったー、です。


ところで私も今日知ったのですが、マスターを呼んでも、もう出てきてはくれないようです。
詳しくは別スレッドにて。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82