孫フォームからのクラスの呼び出しについて


じゅじ  2010-12-11 00:49:19  No: 39699

親フォーム(OForm)から
KForm1、KForm2を呼びます。
KForm1、KForm2それぞれからMForm(孫フォーム)を呼び出したときに
どちらの子フォームから呼び出されたか判断し、親フォームで生成したクラスを使用したいのですが、考えがまとまらずなかなかうまくできません。

やりたいことは
OForm(OFormClass)で生成された  KFormClass1とKFormClass2をMFormで参照します。
OFormClass.KFormClass1.StringGridとすれば
OFormClass.KFormClass1のStringGridを参照できるのですが。
MFormの中でKFormClass1とKFormClass2から呼び出されたものかを判断し、
OFormClass.KFormClass○として扱いたいです。

KFormClass1とKFormClass2それぞれでOFormClass.StringGridをMFormに渡してしまえばできるのですが、もっとスマートな方法はありますか?

OwnerとかParentとか駆使したのですが、検討つきませんでした。
よろしくお願いします。


じゅじ  2010-12-11 00:58:37  No: 39700

すいません、訂正します。

> KFormClass1とKFormClass2それぞれでOFormClass.StringGridをMFormに
> 渡してしまえばできるのですが、もっとスマートな方法はありますか?
とかきましたが、

KForm1とKForm2それぞれでOFormClass.KFormClass1.StringGrid,
OFormClass.KFormClass2.StringGridをMFormに渡せばできる
の間違いでした。
わかりづらい記述ですいません。

よろしくお願いします。


通りすがり  2010-12-11 01:34:28  No: 39701

KForm1,KForm2はどちらも同じクラスなのでしょうか?

type 
 TKForm1 = class(TForm)
 TKForm2 = class(TForm)

こういう状況なら

if AOwner is TKForm1 then
begin
  TKForm1(AOwner).StringGrid
end else
if AOwner is TKForm2 then
begin
  TKForm1(AOwner).StringGrid
end;
  
のようにアクセスできます。OwnerでもParentでも判定方法は同じです。

こういった判定が使えない場合

var
  KForm1:TForm
  KForm2:TForm

どちらも TForm だったりするなら
Tag を使うという手もあります。

TForm 生成時に TForm.Tag に クラスに応じて 値を割り振っておけば
MForm で Tag を読み出せばどちらなのかわかりますが
共通でないプロパティやメソッドに関しては、型がわからないので読み出せません。

case TForm(AOwner).Tag of
  1:  TForm(AOwner).StringGrid < エラー
end;

他にはTFormにもある ComponentsやControlsプロパティが使えます。

for i:=0 to Owner.ControlsCount-1 do
begin
  if Owner.Controls[i] is TStringGrid then
  begin
     TStringGrid(Owner.Controls[i]).xxx := xxx;
  end;
end;


KHE00221  2010-12-11 04:51:39  No: 39702

こんなのを作って

unit Unit1;

interface

uses
   Forms,Grids;

type

   TForm = class(Forms.TForm)
   public
     StringGrid: TStringGrid;
   end;

implementation

end.

子・孫の uses 上 Forms の後ろに登録し、

子で

procedure TKForm1.FormCreate(Sender: TObject);
begin
    StringGrid := StringGrid1;
end;

procedure TKForm2.FormCreate(Sender: TObject);
begin
    StringGrid := StringGrid1;
end;

としておけば

孫から

procedure TMForm1.Button1Click(Sender: TObject);
begin
    TForm(Owner).StringGrid.Cells[1,1] := 'AAA';
end;

こんな感じでアクセスできる


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加