DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: monica9612
今日帖子: 0
在线用户: 3
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
2020/11/19 14:53:49
标题:
求助,窗体信息传递的问题。 浏览:1491
加入我的收藏
楼主:
按此在新窗口浏览图片
如图所示,有没有人能给个demo或者指导一下,万分感谢。
此帖子包含附件:
JPEG 图像
大小:99.2K
----------------------------------------------
-QQ:1379585
作者:
男 dlfsystem (dlfsystem) ★☆☆☆☆ -
盒子活跃会员
2020/11/19 15:38:45
1楼: implementation
uses uForm2
...

  if Form2.showmodal 
    form1.addr = Form2.var....
----------------------------------------------
-
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
2020/11/19 15:54:31
2楼: 楼上的兄弟,方便写个示例吗?
----------------------------------------------
-QQ:1379585
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2020/11/19 16:02:46
3楼: 楼主这个08年注册的账号,是被盗了吗??
----------------------------------------------
--
作者:
男 liyunqiu120 (黑发) ▲▲△△△ -
普通会员
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;
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2020/11/19 16:33:27
5楼: 我相信,楼主一定会说,谢谢 4楼兄弟,能不能再详细点?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
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 里面可以调用它,在其它界面调用它,方法相同啊。
----------------------------------------------
-
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
2020/11/20 9:20:02
6楼: 不好意思,昨天忙没回复,感谢楼上几位,我先照着试试,消化一下,如果有不懂的地方再请教。
----------------------------------------------
-QQ:1379585
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
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;
此帖子包含附件:
JPEG 图像
大小:14.7K
----------------------------------------------
-QQ:1379585
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
2020/11/20 10:43:00
8楼: 感谢pcplayer的帮助,因为我本人只是做一些delphi老程序的维护工作,大学也不是学计算机的,delphi基本是自学,所以基础知识很差,遇到问题只好来这里请教,请各位见谅。
----------------------------------------------
-QQ:1379585
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2020/11/20 10:49:44
9楼: 会 DELPHI 的 找不到工作。不会的硬要去学。
关键是 你学会了,一样找不到工作。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
2020/11/20 11:29:46
10楼: 楼上的兄弟,我是有工作的,不需要找。我这不是软件公司,只是小企业的一些软硬件日常维护。
----------------------------------------------
-QQ:1379585
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2020/11/20 11:54:45
11楼: 你要是 雇一个 DELPHI 开发。就能节约很多时间。你自己也能做你原本应该做的。
还能增加一个就业。还能购买一个正版。让 EMB 多活一天。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2020/11/20 13:26:46
12楼: t
此帖子包含附件:bahamut8348_20201120132646.rar 大小:5.6K
----------------------------------------------
--
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
2020/11/20 15:45:20
13楼: 谢谢bahamut8348,代码我收下了,十分感谢您的帮助。
----------------------------------------------
-QQ:1379585
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/11/20 16:44:58
14楼: 做程序的维护,也要把它搞懂,不要别人给一段代码能运行就算了。

我也不是学计算机专业的。Delphi 也都是自学的。
----------------------------------------------
-
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
2020/11/23 16:53:49
15楼: 谢谢pcplayer,这几天忙得四脚朝天,像我们这种小公司打杂的,只要跟电脑扯得上丁点关系的都是我的活,见笑了。
----------------------------------------------
-QQ:1379585
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行130.8594毫秒 RSS