用了sendmesge更新VCL控件还是出错,贴出代码~~!!!!!

搞定Delphi 2015-12-19 11:27:51
RT,有时弹出“Invalid pointer operation“,有时主界面卡一会儿后直接退出,郁闷~~!!求大神帮我看看是哪里错了,谢谢!

代码如下:



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Grids, AdvObj, BaseGrid, AdvGrid;

const
WM_UPDATEDATA = WM_USER + 100;//自定义的消息,利用此消息来实现对GUI的更

type
TForm1 = class(TForm)
StartThreads: TButton;
advstrngrd1: TAdvStringGrid;
StopThreads: TButton;

//GUI更新的消息处理函数声明
procedure WMUpdateData(var msg : TMessage);message WM_UPDATEDATA;
procedure StartThreadsClick(Sender: TObject);
procedure StopThreadsClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses
Unit2;

{$R *.dfm}
//消息函数定义
procedure TForm1.WMUpdateData(var msg : TMessage);
begin
Self.advstrngrd1.Cells[msg.WParam,msg.LParam]:=neirong;
Sleep(0);
end;

procedure TForm1.StartThreadsClick(Sender: TObject);
begin
qidongxc();
end;

procedure TForm1.StopThreadsClick(Sender: TObject);
begin
zhongzhixc();
end;

end.



线程代码:



unit Unit2;

interface

uses
Classes,Messages,Windows,SysUtils,Dialogs;//添加的使用文件

var
neirong:string;
hThread:THandle;
xianchengID:DWORD;
procedure qidongxc();
function MyThreadFun(p: Pointer): Integer; stdcall;
procedure zhuchengxu();
procedure zhongzhixc();

implementation

uses Unit1;

procedure qidongxc();
begin
hThread := CreateThread(nil, 0, @MyThreadFun, nil, 0, xianchengID);
end;

procedure zhongzhixc();
begin
TerminateThread(hThread,0);
end;

function MyThreadFun(p: Pointer): Integer; stdcall;
begin
zhuchengxu();
Result := 0;
end;

procedure zhuchengxu();
label kaishi;
var
i,j,k,t:Integer;
begin
kaishi:;
try
for j := 1 to 8 do
begin
for i:=1 to 18 do
begin
neirong:='行'+IntToStr(i)+',列'+IntToStr(j);
SendMessage(Form1.Handle,WM_UPDATEDATA,j,i);
Sleep(0);
end;
end;
Sleep(0);
for k := 1 to 8 do
begin
for t:=1 to 18 do
begin
neirong:='';
SendMessage(Form1.Handle,WM_UPDATEDATA,k,t);
Sleep(0);
end;
end;
except
//ShowMessage('循环出错');
end ;
goto kaishi;
end;

end.


...全文
410 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
搞定Delphi 2015-12-21
  • 打赏
  • 举报
回复
引用 11 楼 pathletboy 的回复:
打包最简工程直接放上来吧,不一定是你所贴代码问题。
打包文件:http://pan.baidu.com/s/1brm0m6 非常感谢
pathletboy 2015-12-21
  • 打赏
  • 举报
回复
引用 10 楼 a80141783 的回复:
[quote=引用 9 楼 jankercsdn 的回复:] tms控件还是比较常用的,没碰到你说的问题。再查查你的程序
请问下你用的是哪个版本的控件,还有就是你有没有修改过你用的那个控件的源码啊?我都是按照你上面发的代码弄的,运行大概半个小时左右就会消失,特别是鼠标对程序进行点击、选择 单元格的时候容易出错,表格的可编辑是关闭状态的[/quote] 打包最简工程直接放上来吧,不一定是你所贴代码问题。
搞定Delphi 2015-12-21
  • 打赏
  • 举报
回复
引用 9 楼 jankercsdn 的回复:
tms控件还是比较常用的,没碰到你说的问题。再查查你的程序
请问下你用的是哪个版本的控件,还有就是你有没有修改过你用的那个控件的源码啊?我都是按照你上面发的代码弄的,运行大概半个小时左右就会消失,特别是鼠标对程序进行点击、选择 单元格的时候容易出错,表格的可编辑是关闭状态的
搞定Delphi 2015-12-21
  • 打赏
  • 举报
回复
把我的代码改成BeginThread后,也没有问题了,而且,我delphi用的是TMS6.02.0的版本,XE8用的是TMS7.5.3.1,现在都不出问题了。
pathletboy 2015-12-21
  • 打赏
  • 举报
回复
引用 28 楼 a80141783 的回复:
[quote=引用 27 楼 pathletboy 的回复:] BeginThread其实只是对CreateThread很简单的封装,你可以ctrl+鼠标左键,点击BeginThread直接看代码
好的,那你觉得我写的那个代码为什么会出现那样的奇怪的问题呢?[/quote] 主要我这边错误没法重现,不知道到底什么情况,你先把你代码改BeginThread试试
搞定Delphi 2015-12-21
  • 打赏
  • 举报
回复
引用 27 楼 pathletboy 的回复:
BeginThread其实只是对CreateThread很简单的封装,你可以ctrl+鼠标左键,点击BeginThread直接看代码
好的,那你觉得我写的那个代码为什么会出现那样的奇怪的问题呢?
pathletboy 2015-12-21
  • 打赏
  • 举报
回复
引用 25 楼 a80141783 的回复:
[quote=引用 24 楼 pathletboy 的回复:] 那你再试试这个 http://pan.baidu.com/s/1dDJWvyp
测试了几个小时,这个也不会退出,是不是因为线程类调用的就是BeginThread?[/quote] BeginThread其实只是对CreateThread很简单的封装,你可以ctrl+鼠标左键,点击BeginThread直接看代码
搞定Delphi 2015-12-21
  • 打赏
  • 举报
回复
引用 24 楼 pathletboy 的回复:
那你再试试这个 http://pan.baidu.com/s/1dDJWvyp
测试了几个小时,这个也不会退出,是不是因为线程类调用的就是BeginThread?
搞定Delphi 2015-12-21
  • 打赏
  • 举报
回复
看来以后要多看看各位大神的源码了,看了你的几个源码,学到了很多东西。
pathletboy 2015-12-21
  • 打赏
  • 举报
回复
引用 23 楼 a80141783 的回复:
[quote=引用 22 楼 pathletboy 的回复:] 你试试我写的。 http://pan.baidu.com/s/1mhhyCB2
你这个确实不会退出。。。莫非用线程类比API要稳定吗[/quote] 那你再试试这个 http://pan.baidu.com/s/1dDJWvyp
搞定Delphi 2015-12-21
  • 打赏
  • 举报
回复
引用 22 楼 pathletboy 的回复:
你试试我写的。 http://pan.baidu.com/s/1mhhyCB2
你这个确实不会退出。。。莫非用线程类比API要稳定吗
pathletboy 2015-12-21
  • 打赏
  • 举报
回复
引用 21 楼 a80141783 的回复:
好的,感谢2位关注我的问题,我安装一个你这个版本的 试试,测试完我跟帖报告哈
你试试我写的。 http://pan.baidu.com/s/1mhhyCB2
搞定Delphi 2015-12-21
  • 打赏
  • 举报
回复
好的,感谢2位关注我的问题,我安装一个你这个版本的 试试,测试完我跟帖报告哈
搞定Delphi 2015-12-21
  • 打赏
  • 举报
回复
能否说下您的TMS版本?我下载一个试试
pathletboy 2015-12-21
  • 打赏
  • 举报
回复
引用 19 楼 a80141783 的回复:
能否说下您的TMS版本?我下载一个试试
v6.0.2.0
pathletboy 2015-12-21
  • 打赏
  • 举报
回复
引用 17 楼 a80141783 的回复:
改了还是不行。。。。
没办法,我这边重现不了错误,挂随便点点,挂了近1个小时,都没问题。
搞定Delphi 2015-12-21
  • 打赏
  • 举报
回复
改了还是不行。。。。
pathletboy 2015-12-21
  • 打赏
  • 举报
回复
procedure zhuchengxu();
label
  kaishi;
var
  i, j, k, t: Integer;
  wp, lp, wp1, lp1: LongInt;
  ij,ii: Integer;
begin
  ij := Form1.advstrngrd1.ColCount - 1;
  ii := Form1.advstrngrd1.RowCount - 1;
  while True do
  begin
    try
      for j := 1 to ij do
      begin
        for i := 1 to ii do
        begin
          wp := MakeLong(j, i);
          neirong := '行' + IntToStr(i) + ',列' + IntToStr(j);
          lp := Integer(neirong);
          SendMessage(Form1.Handle, WM_UPDATEDATA, wp, lp);
          Sleep(0);
        end;
      end;
      Sleep(0);
      for k := 1 to ij do
      begin
        for t := 1 to ii do
        begin
          wp1 := MakeLong(k, t);
          neirong := '';
          lp1 := Integer(neirong);
          sendMessage(Form1.Handle, WM_UPDATEDATA, wp1, lp1);
          Sleep(0);
        end;
      end;
    except
      on E: exception do
      begin
        showmessage(e.message);    {e.message返回异常字符串}
        ShowMessage('循环出错');
      end;
    end;
  end;
end;
这样改了试试
搞定Delphi 2015-12-21
  • 打赏
  • 举报
回复


你看,又出来了。。。
搞定Delphi 2015-12-21
  • 打赏
  • 举报
回复
引用 13 楼 pathletboy 的回复:
你这份代码,点一次开始,测试了30多分钟没有问题,请问你点了几次开始?
我点了一次开始,本机是WIN764位的系统, TMS版本是:TMS Component Pack 7.5.3.1 D5 - XE8 用delphi和X8都测试过,都会自动消失的,,莫非是人品问题。。。
加载更多回复(10)

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧