我现在有一个MDI主窗体,还有一个MDI字窗体,
在这个子窗体上又建了一个窗体,怎么将新建的窗体中的值传给MDI子窗体form1 主窗体
form2 子窗体
form3 新窗体新窗体中
procedure TForm3.Button1Click(Sender: TObject);
begin
form2.edit1.text:='aaaaaaaaa';
end;
会提示
access violation at address 00571baa in module 'client.exe'.read of address 0000032c.
在这个子窗体上又建了一个窗体,怎么将新建的窗体中的值传给MDI子窗体form1 主窗体
form2 子窗体
form3 新窗体新窗体中
procedure TForm3.Button1Click(Sender: TObject);
begin
form2.edit1.text:='aaaaaaaaa';
end;
会提示
access violation at address 00571baa in module 'client.exe'.read of address 0000032c.
类似于bean里的get和set的思想。不然通过全局变量传也可以
begin
with TForm3.create(nil) do
begin
try
ShowModal;
finally
Result := s; // 新窗体的值
Free;
end;
end;uses unit3;form2.edit1.text := form3create;
ControledMDi:=MDIFORM1;
...
in MDIFORM2.button1的onclidk事件;
TMDIFORM(ControledMDI).lable1.caption; 网上找到的答案,但是我试了不成功var
ControledMDi:TFORM;
begin
ControledMDi:=Form2;
TForm2(ControledMDI).LabeledEdit17.text:='aaaaaaaaaa';
end;
begin
Memo3.Lines.Add(Trim(LOV_Result));
with TDM.cds_Public do
begin
close;
CommandText :=' SELECT MB001 FROM INVMB WHERE MB001 LIKE :MB001 ORDER BY MB001';
params.ParamByName('MB001').AsString := fmpubLOV.edFind.text;
open;
end;
end;
Form2:=Tform2.Create(Self);
Form2.Show;
Form2:=Tform2.Create(Self);
Form2.Show;----------------------------
with FrmClass.Create(self) do
begin
FormStyle:=fsMDIChild;
WindowState:=wsMaximized;
Show;
end;你好,已经是全局变量了
一\过程
在form的public段,声明procedure 或function 主窗体调用子窗体的实例的pcocedure或 function传参数.如 TForm3 中定义 procedure SendString( value :string;otherform :Tform);procedure Tform3.SendString( value :string;otherform :Tform);
begin
if assign(otherform) then
begin
Tform2(otherform).edit1.text:= value ;
end;
end;
另一种是在 publice 段声明 property 属性 Property otherform :Tform seng get .............
Form2:=Tform2.Create(Self);
Form2.Show;------------------------------
声明的是全局变量
with Tform2.Create(Self) do 这样创建能传递给全局变量(form2)吗?
应该Form2:=Tform2.Create(Self);
Form2.FormStyle:=fsMDIChild;
Form2.WindowState:=wsNormal;
Form2.Show;
另外还是楼上的网友们说的,跨越类操作的应该还是调用被操作类的方法,不应该直接对被操作类里面的变量、子类进行操作,这样有点越权了吧?
但还有个问题
要将Form2:=Tform2.Create(Self);
Form2.FormStyle:=fsMDIChild;
Form2.WindowState:=wsNormal;
Form2.Show; 改成一个显示Form的函数怎么做,以上两种方法都不行procedure TForm_Client.ShowForm(FrmClass:TForm);
begin
FrmClass:=TForm.Create(Self);
FrmClass.FormStyle:=fsMDIChild;
FrmClass.WindowState:=wsMaximized;
FrmClass.Show;
end;
procedure TForm_Client.ShowForm(ShowForm:TFormClass);
var
MyForm:TForm;
begin
MyForm:=ShowForm.Create(self);
MyForm.FormStyle:=fsMDIChild;
MyForm.WindowState:=wsMaximized;
MyForm.Show;
end;
//无法传递给全局变量
比较麻烦一些,要注册窗体类,然后按字符串查找类名,再创建窗体,最后将创建的窗体给全局变量form就行了
这是创建窗体的函数,现在返回的是窗体的handle,你自己改成返回窗体类的吧
传进去的参数是窗体类名,且这些类名必须在初始化的时候注册,要不然找不到
function TfrmMain.SetForm(frmClassName: string): THandle;
var
frmcls: Tformclass;
cc: TPersistentclass;
frm: Tform;
i: Integer;
begin
Result := 0;
try
cc := Getclass(frmClassName);
frmcls := TFormClass(cc);
except end;
for i := 0 to MDIChildCount - 1 do
begin
if UpperCase(frmClassName) = UpperCase(MDIChildren[i].ClassName) then
begin
MDIChildren[i].BringToFront;
Exit;
end;
end; frm := frmcls.create(self);
case frm.FormStyle of
fsMDIChild:
begin
frm.show;
Result := frm.Handle;
end;
fsNormal:
begin
frm.ShowModal;
Result := frm.Handle;
FreeAndNil(frm);
end;
end;
end;