关于手动创建窗口的问题,有点难(200分)

  • 主题发起人 主题发起人 element
  • 开始时间 开始时间
E

element

Unregistered / Unconfirmed
GUEST, unregistred user!
我在开发中需要手动创建若干窗口
创建方法:
procedure TForm1.Button2Click(Sender: TObject);
begin
With TForm2.Create(self) do
Caption:=IntToStr(Skip);
end;
问题:
我想找到创建后的一个Form2并且修改它里面Edit1.Text的值。
 
直接可以吧。form2有name,直接调form2.edit1.text就可以吧
或者,findwindows('tform','form2')得到handle,在用controls[0] as Tedit就ok了
 
对于这类窗体,用窗体名称肯定是不行的。
你可以派生这样一个类:
TMyForm = class(TForm)
public
constructor Create(AOwner: TComponent
ID: Longint)
reintroduce;
...
end;

或者在窗口内部加一个 ID 属性,道理是一样的。这种情况下,可以借助
Tag 属性。

然后在每次创建 TMyForm 的实例时,赋值 ID 于不同的值。
然后在遍历窗口时,不仅判断 AnyForm 的 ClassName = 'TMyForm',
而且要判断 ID 是否是你想要的窗口标识。

在 MDI 窗口中,这是最好的解决办法,可以唯一确定窗口。
 
可以这样
procedure TForm1.Button2Click(Sender: TObject);
var
Fm:TForm2;
begin
Fm:=TForm2.Create(self);
Fm.Caption:=IntToStr(Skip);
Fm.Edit1.Text:='abc';
......
end;

(你给的代码也太少了,你这样创建窗口有问题,因为没有办法释放创建的窗口,用动态数组
好些)
 
ddev:
你能说的明白一点吗?
能给一段程序吗?
 
好吧,下面是一个例子:

1、完成基类
TMyForm = class(TForm)
private
FID: Longint;
public
constructor Create(AOwner: TComponent
ID: Longint)
reintroduce;
...
public
property ID: Longint read FID;
end;

constructor TMyForm.Create(AOwner: TComponent
ID: Longint);
begin
inheirted Create(AOwner);
FID := ID;
end;
-----------------------------
2、创建窗体Form1,Delphi 默认的窗体父类是 TForm,改为 TMyForm,直接手工改就是了。
TForm1 = class(TMyForm)
...
end;

3、使用窗体
var MyForm: TMyForm;
MyForm := TMyForm.Create(Application, 1);

4、查找窗体:写一个函数:
bool __fastcall IsInheritObject(TObject* AObject, String AClassName)
{
if (AObject == Null) return False;

TClass AClass;
String ClassName;
bool result = false;

AClass = AObject->ClassType()
while (AClass->ClassParent() != NULL)
{
AClass = AClass->ClassParent()
ClassName = AClass->ClassName();
if (stricmp(ClassName.c_str(), AClassName.c_str()) == 0)
{
result = TRUE;
break;
}
}

return result;
}

然后遍历窗口,先判断该窗体是否 TMyForm 类型,如果是,继续判断ID是否是
你想要的 ID 就行了。
var
F: TMyForm;

if IsInheritObject(AnyForm, 'TMyForm') then
begin
F := AnyForm as TMyForm;
if F.ID = your_id then
begin
...
end;
end;
--------------------------------------------------------------
给你个我程序中用到的现成例子吧:

class TCommandForm : public TForm
{
typedef Forms::TForm inherited;

protected:
DYNAMIC void __fastcall DoClose(TCloseAction &Action);

public:
__fastcall TCommandForm(TComponent*);
virtual void __fastcall DoUpdateCommand(int, int&){};
virtual void __fastcall DoExecuteCommand(int, int){};
};

class TDocumentForm : public TCommandForm
{
typedef TCommandForm inherited;

private:
int FAttachHandle;
int FDocumentID;
bool FReadOnly;
bool FModified;

public:
__fastcall TDocumentForm(int, int);

public:
__property int AttachHandle = {read = FAttachHandle};
__property int DocumentID = {read = FDocumentID};
__property bool ReadOnly = {read = FReadOnly, write = FReadOnly};
__property bool Modified = {read = FModified, write = FModified};
};


TDocumentForm 就是你要看的东西。
__fastcall TCommandForm::TCommandForm(TComponent* AOwner) : TForm(AOwner)
{
}

void __fastcall TCommandForm::DoClose(TCloseAction &Action)
{
Action = caFree;
inherited::DoClose(Action);
};
//---------------------------------------------------------------------------
__fastcall TDocumentForm::TDocumentForm(int dwAttachHandle, int dwDocumentID)
: TCommandForm(Application)
{
FAttachHandle = dwAttachHandle;
FDocumentID = dwDocumentID;

FReadOnly = false;
FModified = false

};
//---------------------------------------------------------------------------
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
628
import
I
后退
顶部