导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2020/11/19 14:53:49
标题:
加入我的收藏
楼主:
如图所示,有没有人能给个demo或者指导一下,万分感谢。
此帖子包含附件: 大小: 99.2K
----------------------------------------------
-QQ:1379585
作者:
2020/11/19 15:38:45
1楼:
implementation uses uForm2 ... if Form2.showmodal form1.addr = Form2.var....
----------------------------------------------
-
作者:
2020/11/19 15:54:31
2楼:
楼上的兄弟,方便写个示例吗?
----------------------------------------------
-QQ:1379585
作者:
2020/11/19 16:02:46
3楼:
楼主这个08年注册的账号,是被盗了吗??
----------------------------------------------
--
作者:
2020/11/19 16:16:23
4楼:
class function EditForm(str:string):string; { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin ModalResult := 1; end; class function TForm2.EditForm(str:string):string; begin try Form2 := TForm2.Create(nil); Form2.Edit1.Text:=str; if Form2.ShowModal = 1 then Result:=Form2.Edit1.Text else Result:=''; finally FreeAndNil(Form2); end; end; ///////// procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text:=TForm2.EditForm(Edit1.Text); end;
----------------------------------------------
-
作者:
2020/11/19 16:33:27
5楼:
我相信,楼主一定会说,谢谢 4楼兄弟,能不能再详细点?
----------------------------------------------
(C)(P)Flying Wang
作者:
2020/11/19 16:47:28
4楼:
先把楼主问题归纳一下: 1. 有一个 Form1, 上面有个按钮,点这个按钮,弹出一个输入界面; 2. 弹出的那个输入界面,用一个 Form2 来实现。 3. 在弹出的输入界面上做了一些操作后,关闭这个界面,回到原来的 Form1,程序继续往下执行,可以获得之前用户在那个输入界面上输入的值。 ---------- 这个应该是用 Delphi 经常会用到的操作。属于入门级的问题。 1. 假设 Form1 对应的是 Unit1.pas; Form2 对应的是 Unit2.pas; 2. 按照 1 楼的正确写法,要在 Unit1 里面,uses Unit2; 才能在 Form1 的代码里面调用到 Unit2 以及 Form2 的相关代码。这个 uses unit2 可以写在 Unit1 的接口部分的 uses 里面,也可以按照 1 楼的写法,写在 implementation 底下。写在这两个地方有区别,这里暂时不解释,反正都能用。 3. 在 Form1 的按钮 OnClick 的地方,写 1 楼的代码可以把 Form2 显示出来。也就是 Form2.ShowModal; 4. Show 和 ShowModal 的区别是,ShowModal 以后,Form1 里面的代码就停下来了,一直等待 Form2 关闭才会继续往下执行。Show 则不是。 Do something.... Form2.Show; Do another thing... 上述代码,Form2 显示出来后,无需用户做任何操作,后面那一行 do another thing... 会立即被执行。 Do something... Form2.ShowModal; Do another thing... 上述代码,Form2 弹出来以后,只要它没有被用户关闭,后面的 Do another thing... 是不会被执行的。这个其实可以自己写点代码来测试就知道了。 5. 用户关闭 Form2 以后,如何知道用户是【同意】Form2 的操作还是不同意? 5.1. 在 Form2 上面放 2 个按钮;一个按钮是 【取消】,一个按钮是 【确定】 5.2. 选中取消按钮,在属性面板上,找到 ModalResult 这个属性,默认是 mrNone,下来,选择 mrCancel; 5.2. 选择【确定】按钮,把 ModalResult 属性修改为 mrOK; 5.3. 上述两个按钮,设置了 ModalResult 以后无需写任何代码,用户点了它,Form2 会自动关闭。 6. 在 Form1 的 Button 的 OnClick 里面写的代码大概是这样: if Form2.ShowModal = mrOK then begin //用户点了 确定后会执行到这里 MyUserName := Form2.EditUserName.Text; end else begin //用户点了取消以后会执行这里 end; 上面的代码,你已经可以获得用户在 Form2 的 EditUserName 这个 TEdit 里面输入的字符串了。 7. 还有个问题:面向对象。在读 Form2 的用户输入值的时候,直接读 Form2.EditUserName.Text 不符合面向对象的概念。简单这样写程序能运行,但程序做大了代码多了,以后想要修改的时候, 会比较麻烦。这里应该给 Unit2 的 public 里面,增加一行代码: property MyUserName: string read GetMyUserName; 增加了一个属性。然后按 Ctrl+Shit+C 让 Delphi IDE 帮我们自动填补剩下的代码框架,也就是 GetMyUserName 函数的代码框架。它会自动出现: function GetMyUserName: string; begin end; 然后在上述代码框架里面写:Result := EditUserName.Text; 最后,在 Form1 里面,要获得用户输入,则是:MyUserName := Form2.MyUserName; 上述做法似乎多写了一些代码,但是,将来如果你的 UserName 的输入不是靠 EditUserName 而是依靠其它方法,在所有各种调用 Form2 来获得 UserName 的地方都不用修改。否则假设你有 10 个 Form 都调用了 Form2 来获得 UserName 则你需要修改 10 个地方,改漏一个地方,可能就是一个潜在的隐患。很多 BUG 就是这么来的。这也是面向对象要解决的问题。 8. 我记得楼主或者是别人前些天问了一个同样的问题。问题是遇到异常。其实遇到异常,通常就是访问了不存在的东西。比如调用 Form2.ShowModal 的时候,Form2 的实例根本不存在,或者说 Form2 没有被创建。或者在读用户输入的数据 MyUserName := Form2.MyUserName 的时候,Form2 不存在,可能之前创建了,但这个时候 Form2 已经被释放了。 8.1. 通常如果你有一个 Form2,Delphi 程序在启动的时候已经被自动创建了,比如看工程文件: program testShowModal; uses Vcl.Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}; {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.Run; end. 上述代码,Form2 已经被创建了。 更高级的玩法,是这里不创建 Form2,需要的地方再创建,用完即释放。这样比较节约系统资源。那么,可能需要这样来写: if not Assign(Form2) then Form2 := TForm2.Create(Application); //首先判断 Form2 的实例是否存在,不存在则创建它。 try if Form2.ShowModal = mrOK then begin MyUserName := Form2.MyUserName; end; finally Form2.Free; Form2 := nil; end; 最后,楼主说的,这个 Form2 在其它界面也可以调用这个需去,既然你在 Form1 里面可以调用它,在其它界面调用它,方法相同啊。
----------------------------------------------
-
作者:
2020/11/20 9:20:02
6楼:
不好意思,昨天忙没回复,感谢楼上几位,我先照着试试,消化一下,如果有不懂的地方再请教。
----------------------------------------------
-QQ:1379585
作者:
2020/11/20 10:02:34
7楼:
我先参照4楼兄弟的方法实现了我的需求,等我消化一下再试试另一个兄弟的方法,代码如下 class function Tfdzlr.EditForm(Str: String): string; var ls_dz:string; begin try fdzlr:=Tfdzlr.Create(nil); if fdzlr.ShowModal =1 then begin ls_dz:= fdzlr.RzComboBox1.Text+fdzlr.RzComboBox2.Text+fdzlr.RzComboBox3.Text+ fdzlr.RzComboBox4.Text+fdzlr.RzComboBox5.Text+fdzlr.Rzedit1.text; Str:=ls_dz; Result:=Str; end else Result:=''; finally FreeAndNil(fdzlr); end; end;
此帖子包含附件: 大小: 14.7K
----------------------------------------------
-QQ:1379585
作者:
2020/11/20 10:43:00
8楼:
感谢pcplayer的帮助,因为我本人只是做一些delphi老程序的维护工作,大学也不是学计算机的,delphi基本是自学,所以基础知识很差,遇到问题只好来这里请教,请各位见谅。
----------------------------------------------
-QQ:1379585
作者:
2020/11/20 10:49:44
9楼:
会 DELPHI 的 找不到工作。不会的硬要去学。 关键是 你学会了,一样找不到工作。
----------------------------------------------
(C)(P)Flying Wang
作者:
2020/11/20 11:29:46
10楼:
楼上的兄弟,我是有工作的,不需要找。我这不是软件公司,只是小企业的一些软硬件日常维护。
----------------------------------------------
-QQ:1379585
作者:
2020/11/20 11:54:45
11楼:
你要是 雇一个 DELPHI 开发。就能节约很多时间。你自己也能做你原本应该做的。 还能增加一个就业。还能购买一个正版。让 EMB 多活一天。
----------------------------------------------
(C)(P)Flying Wang
作者:
2020/11/20 13:26:46
12楼:
t
----------------------------------------------
--
作者:
2020/11/20 15:45:20
13楼:
谢谢bahamut8348,代码我收下了,十分感谢您的帮助。
----------------------------------------------
-QQ:1379585
作者:
2020/11/20 16:44:58
14楼:
做程序的维护,也要把它搞懂,不要别人给一段代码能运行就算了。 我也不是学计算机专业的。Delphi 也都是自学的。
----------------------------------------------
-
作者:
2020/11/23 16:53:49
15楼:
谢谢pcplayer,这几天忙得四脚朝天,像我们这种小公司打杂的,只要跟电脑扯得上丁点关系的都是我的活,见笑了。
----------------------------------------------
-QQ:1379585