DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: bluewind23
今日帖子: 0
在线用户: 4
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2024/7/6 11:22:58
标题:
A窗口怎么实时更新B窗口的控件内容? 浏览:650
加入我的收藏
楼主: 比如,A窗口中有stringgrid控件,B窗口是搜索查询信息的窗口,当B窗口输入查询条件并点击查询后B窗口依旧在,A窗口中显示定位到符合条件的记录上,还可以点下一个(类似于office里的查找功能)。在B窗口还存在时还可以点击或者操作A窗口中的内容。
请问,这两个窗口是怎么实现?
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/7/6 13:17:42
1楼: 你在 a 里面写代码:b.xxx

在B里面写代码:

function b.xxx(): boolean;
begin
  你想要干嘛就干嘛
end;
----------------------------------------------
-
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2024/7/6 14:00:35
2楼: 直接访问预定方法函数,或者发消息,那边接收
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2024/7/6 18:19:15
3楼: pcplayer,您好,这样报内存错误。

A窗口中:
function TBasicInfo_Goods_List_Fm.GridFind(iRow: Integer): Boolean;
begin
  AdvStringGrid1.SetFocus;
  AdvStringGrid1.SelectedRow[iRow];
end;

B窗口中:
implementation
uses BasicInfo_Goods_List;
{$R *.dfm}

procedure TGoodsTableFind_Fm.Button1Click(Sender: TObject);
begin
  //查找
  BasicInfo_Goods_List_fm.GridFind(strtoint(Edit1.Text));
  //BasicInfo_Goods_List_Fm.AdvStringGrid1.SelectedRow[5];
end;

报错:Access violation at address 00F69FF7 in module 'XXXXXX.EXE' Read of Address 000000404

请指教!
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/7/6 18:43:23
4楼: 1. BasicInfo_Goods_List_fm 还没创建,对象还不存在?

2. 设置断点,单步跟踪,看看是哪句导致异常。

3. 在 TBasicInfo_Goods_List_Fm 里面添加一个按钮,去执行 GridFind 方法,看看会不会异常。

总之,异常不要紧,要紧的是如何定位到是哪句代码触发异常。
----------------------------------------------
-
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2024/7/6 19:38:43
5楼: 在 TBasicInfo_Goods_List_Fm 里面添加一个按钮,去执行 GridFind 方法,结果是正确的。
是在BasicInfo_Goods_List_fm中按Menu创建的TGoodsTableFind_Fm

procedure TBasicInfo_Goods_List_Fm.N2Click(Sender: TObject);
var GoodsTableFind_Fm:TGoodsTableFind_Fm;
begin
  //查找
    GoodsTableFind_Fm:=TGoodsTableFind_Fm.Create(self);
    GoodsTableFind_Fm.Show;
end;
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2024/7/6 20:59:17
6楼: 在B窗口中:
procedure TGoodsTableFind_Fm.Button1Click(Sender: TObject);
begin
  //查找
  BasicInfo_Goods_List_fm.GridFind(strtoint(Edit1.Text));
end;

调用A窗口(BasicInfo_Goods_List_fm)的函数GridFind

在A窗口中:
function TBasicInfo_Goods_List_Fm.GridFind(iRow: Integer): Boolean;
begin
  AdvStringGrid1.SetFocus;
  AdvStringGrid1.ClearRowSelect;
  AdvStringGrid1.Row:=iRow;
  AdvStringGrid1.GotoCell(2,iRow);
end;
调试过程中,参数iRow 能获得从B窗口中传递过来的值;但是执行到第一条代码的时候就提示访问错误,是不是,不允许外部窗口调用或者访问窗口中的控件?
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/7/6 21:23:22
7楼: 你多半是没有创建 GoodsTableFind_Fm 就开始调用它的方法:BasicInfo_Goods_List_fm.GridFind(strtoint(Edit1.Text));

你首先要创建:

GoodsTableFind_Fm:=TGoodsTableFind_Fm.Create(self)

然后才能调用它的方法:
BasicInfo_Goods_List_fm.GridFind(strtoint(Edit1.Text));
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/7/6 21:24:37
8楼: 如果你已经创建了那个 Form 但在执行 AdvStringGrid1.SetFocus; 时出错,

可能原因:那个 Form 本身没有被 Show 出来,没有 Focus ?
----------------------------------------------
-
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2024/7/6 21:43:36
9楼: A窗口跟B窗口都show出来了

B窗口是A窗口中按菜单点击事件中Create出来的,B窗口show出来后,按B窗口中的Button1单击事件中调用A窗口的GridFind函数,把参数传递到A窗口,然后根据参数改变A窗口中stringgrid的选中行数。

应该是B窗口不能访问A窗口的内存区域,导致不能对A窗口中的控件进行操作。但是又该如何处理呢?
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/7/7 1:08:13
10楼: 不要瞎猜,不是什么 B 窗口不能访问 A 窗口的内存区域,没这种事情。

出现异常,就是你调用了不存在的东西。比如,你在 B 窗口调用 A 窗口,而这个时候 A 窗口还没创建,还不存在。

当然,具体到你的问题,你说 A,B 窗口都已经 show 出来了。照理是存在的。那不管是在 A 窗口里面调用 B 的方法,还是 B 窗口里面调用 A 的方法,都没有问题。

注意你的概念:没有B窗口不能访问A窗口这种概念。都是代码,只不过你的代码刚好是写在 B 窗口的单元里面而已。对于代码来说,能不能调用,只有一件事:是否看得见对方,也就是代码作用域的问题。只要你编译能通过,那就说明没问题。

当然,说复杂一点,还有个多线程的问题。但我假设你这里没有多线程问题。你就是 B 窗口里面有个按钮,点这个按钮,调用 A 窗口的一个方法。只要编译能通过,就没有什么能不能的问题。

其实你还可以试试,逐行屏蔽代码,看看究竟哪行代码出问题。比如,把:
AdvStringGrid1.SetFocus;

屏蔽掉。
----------------------------------------------
-
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2024/7/7 10:52:45
11楼: pcplayer,只要把A窗口中方法中的涉及到控件的代码注释掉就不会报错。
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 jwj76 (禁卫) ▲△△△△ -
普通会员
2024/7/7 11:24:05
12楼: 1、在A窗口中显示B窗口,前提是B窗口设置成自动创建窗体。
uses
  B窗口; 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;//显示B窗口
end;
2、在B窗口中引用A窗口
implementation
uses
  Amain;  
3、在B窗口中加更新A窗口的内容
procedure TForm2.FormCreate(Sender: TObject);
begin
  Self.FormStyle:=fsStayOnTop;
end; 

procedure TForm2.Button1Click(Sender: TObject);
begin
  Form1.Edit1.Text:='新内容';//更新A窗口中的控件内容
  Form1.Edit1.SetFocus;//焦点到A窗口更新控件上
//由于前面设置B窗口Self.FormStyle:=fsStayOnTop; 所有B窗口还在A前面显示,但可以操作A窗口的内容
end; 

以上是Lazarus的源,Delphi应该也是一样的。
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2024/7/7 11:40:58
13楼: setfocus需要窗口被创建,且显示,并且可以拥有焦点才不会报错。
你可以在调用前先判断一次。
if (xxx.canfocus()) xxx.setfocus();
另外,strtoint如果出现非数字的字符也会报错,你可以改用strtointdef。
但,你的av错误肯定是调用了未创建的对象导致,你可以把相关代码切片贴出来看看再说。
----------------------------------------------
--
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/7/7 13:07:33
14楼: 13楼,所以我才说他应该把 SetFocus 屏蔽掉再看效果嘛。
----------------------------------------------
-
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2024/7/7 16:04:26
15楼: procedure TForm2.Button1Click(Sender: TObject);
begin
  Form1.Edit1.Text:='新内容';//更新A窗口中的控件内容
  Form1.Edit1.SetFocus;//焦点到A窗口更新控件上
//由于前面设置B窗口Self.FormStyle:=fsStayOnTop; 所有B窗口还在A前面显示,但可以操作A窗口的内容
end; 

这个好
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2024/7/9 10:13:20
16楼: 这不是数据库的工作吗? 
显示前读取数据库...
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行30.27344毫秒 RSS