在MDI程序中动态生成的窗体的EDIT组件之间如何传递值?(50)

  • 主题发起人 主题发起人 zyr76
  • 开始时间 开始时间
Z

zyr76

Unregistered / Unconfirmed
GUEST, unregistred user!
在MDI程序中,通过菜单动态生成了窗体f1,里面有个Edit1,在Edit1的KeyPressDown事件下动态生成了窗体f2,里面有个Edit2,在Edit2输入一些信息后退出f2,怎么把Edit2.text的值赋值给Edit1.text,如果是赋值给主窗体这个代码很简单,可是着这么实现,当在窗体f2中引用窗体f1的单元后,在f2退出窗体事件下这样写报错:f1.Edit1.Text:=Edit2.Text;说是引用地址违反,急等!
 
用全局变量阿!
 
// 在 f1 里面调用procedure TForm1.Edit1KeyPressDown(...);var ReturnValue: string;begin if ... then if ModalOpenShow(ReturnValue) then Edit1.Text := ReturnValue;end;
 
以上方法都不可取.正确的方法应该是使用事件属性:TSetEditValue = procedure(Value: string) of Object;TForm1中 public procedure SetEdit(Value: string); 实现中写明: Edit1.Text := Value;TForm2中 FReturnValue: TSetEditValue; //私有 public property ReturnValue: TSetEditValue read FReturnValue write FReturnValue;procedure TForm2.Edit1KeyPressDown(...);begin if Assigned(FReturnValue) then FReturnValue(TEdit(Sender).Text); end; 创建Form2时,指明 Form2.ReturnValue := Form1.SetEdit; 就可以了
 
谢谢两位老大的帮助,但是我是希望在f2的Edit2.text值改变时,退出f2后能把Edit2.text的值赋值给Edit1.text,而不是在Edit1.text中调用Edit2.text的值,必须从f2到f1,因为一开始不知道用户在Edit2.text输入的值是多少?
 
全局变量根本不行,编译通过可是没有值传回
 
关键的问题是不能从f2中直接引用f1中的Edit1,也就是这样写f1.Edit1.Text:=Edit2.Text不对,可能是动态生成的f1名字不是f1,就是改成f1也不对,好像不是很复杂,可是却没有简单的方法,请赐教
 
我的这个程序必须写在f2中,不能在f1中实现,因为一开始不知道用户在Edit2.text输入的值是多少,请问这么办?
 
请各位回答问题时注意下方向问题,必须从f2传回f1,程序必须在f2的退出事件下实现
 
class function ModalOpenShow(var/out Edit2Value: string): Boolean;这个写法有问题编译通不过呀?
 
看来楼主太菜,无法理解我的方法。你自己折腾去吧。。。我没兴趣教小学生认字
 
smlabc,试了一下确实不好用,TSetEditValue = procedure(Value: string) of Object;写在哪呀?“创建Form2时,指明 Form2.ReturnValue := Form1.SetEdit; 就可以了”是不是在procedure TForm2.FormCreate(Sender: TObject);begin Form2.ReturnValue := Form1.SetEdit;end;这个意思呀?把你的程序贴出来不就好了吗?何必我们去猜。
 
来自:zyr76, 时间:2009-1-10 9:56:16, ID:3939284class function ModalOpenShow(var/out Edit2Value: string): Boolean;这个写法有问题编译通不过呀? ---------------------------------------------->>>"var/out" 表示 用其中一个即可 把 Edit2Value 传 f1 中了, 给你回答问题, 真是有点费劲 , 你见过 "var/out" 这样的语法吗?
 
// 对 f2 的调用, 实现下面这个类方法即可, 跟 f1 是否动态创建没关系吧!!TForm2 = class(TForm)// ...public class function ModalOpenShow(var(或用out) Edit2Value: string): Boolean;end;// 实现class TForm2.ModalOpenShow(var(或用out) Edit2Value: string): Boolean;begin with Self.Create(nil) do try Result := ShowMoadal; if Result then Edit2Value := Edit2.Text; finally Free; end;end;
 
创建Form2时,指明 Form2.ReturnValue := Form1.SetEdit; 就可以了Form2 := TForm2.Create(nil);Form2.ReturnValue := Form1.SetEdit;Form2.Show;以上代码本来就是要保证最小耦合的,不可能让两个子窗口包含对方(users);
 
还是给你写出来吧~~~~~.unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Edit1: TEdit; procedure Edit1KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);var ResultValue: string;begin if Key = #13 then begin ResultValue := Edit1.Text; if TForm2.Execute(ResultValue) then Edit1.Text := ResultValue; end;end;end.// Form2unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm2 = class(TForm) Edit2: TEdit; btnOK: TButton; btnCancel: TButton; procedure btnOKClick(Sender: TObject); private { Private declarations } public { Public declarations } // 类方法 class function Execute(var Edit2Value: string): Boolean; end;//var// Form2: TForm2;implementation{$R *.dfm}{ TForm2 }class function TForm2.Execute(var Edit2Value: string): Boolean;begin with Self.Create(nil) do try Edit2.Text := Edit2Value; // TForm1 中传过来的值 Result := (ShowModal = mrOK); // 单击的是 "确定" if Result then begin Result := not SameText(Edit2.Text, Edit2Value); if Result then // Edit2.Text 与传进来的值 Edit2Value 不同 (即有修改) Edit2Value := Edit2.Text; end; finally Free; end;end;procedure TForm2.btnOKClick(Sender: TObject);begin ModalResult := mrOK;end;end.
 
接受答案了.
 
后退
顶部