親フォーム(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とか駆使したのですが、検討つきませんでした。
よろしくお願いします。
すいません、訂正します。
> KFormClass1とKFormClass2それぞれでOFormClass.StringGridをMFormに
> 渡してしまえばできるのですが、もっとスマートな方法はありますか?
とかきましたが、
KForm1とKForm2それぞれでOFormClass.KFormClass1.StringGrid,
OFormClass.KFormClass2.StringGridをMFormに渡せばできる
の間違いでした。
わかりづらい記述ですいません。
よろしくお願いします。
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;
こんなのを作って
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;
こんな感じでアクセスできる
ツイート | ![]() |