//注入宿主程序,获取DBGrid实例 
        DBGrid := TDBGrid(FindControl(CurrentThreadId,ListHandle));
         DataSet:= DBGrid.DataSource.DataSet;         if DataSet.RecordCount = 0 then
            begin             sm:= split(s.Strings[1],'<m>');
             for I:=0 to sm.Count -1 do
                begin                case I of
                    0: begin
                          DataSet.Append;
                          sleep(10);
                          SendMessage(ListHandle,WM_SETFOCUS,0,0);
                          sleep(10);
                          SendMessage(ListHandle,WM_KEYDOWN,VK_DOWN,0);//DBGrid 向下键增加一条记录
                          sleep(10);
                          end;
                    1: begin
                           DataSet.Append;
                           sleep(10);
                           SendMessage(ListHandle,WM_SETFOCUS,0,0);
                           sleep(10);
                           SendMessage(ListHandle,WM_KEYDOWN,VK_DOWN,0);
                           sleep(10);
                        end;
                    else begin
                          SendMessage(ListHandle,WM_SETFOCUS,0,0);
                          sleep(10);
                          SendMessage(ListHandle,WM_KEYDOWN,VK_DOWN,0);
                          sleep(10);
                        end;                    end;                    DataSet.Edit;
                    SendMessage(ListHandle,WM_SETFOCUS,0,0);
                    DataSet.FieldByName('名称').AsString:= smf.Strings[0];
                    PostMessage(ListHandle,WM_CHAR,13,0);
                    sleep(50);
                    SendMessage(ListHandle,WM_SETFOCUS,0,0);
                    DataSet.FieldByName('数量').AsString:='1';
                    PostMessage(ListHandle,WM_CHAR,13,0);
                    sleep(50);
                    SendMessage(ListHandle,WM_SETFOCUS,0,0);
                    DataSet.FieldByName('单价').AsString:= smf.Strings[1];
                    PostMessage(ListHandle,WM_CHAR,13,0);
                    sleep(50);
                 end;因为宿主程序,加入一个名称后,要调出一些内容,加入单价和数量后,也要计算,我只能简单的把数据赋值,计算还是给宿主程序来做,
程序做出来了,就是不稳定,时好是坏,有的时候,宿主崩溃,看看那有写错。

解决方案 »

  1.   

    这些sleep并不准确,宿主程序或许要经过某些复杂的运算时间会比较长
    但你已经又开始SendMessage下一消息过去了,错误真的不可预料
      

  2.   

    你应该是下钩子,监视某个API,再跳转到你的代码吧?
    若出现程序崩溃,地址错误。很可能是钩子写得有问题。
      

  3.   

    对于程序中的Sleep方式,只可能造成数据的逻辑问题。
      

  4.   

    我也怀疑这个问题,我赋值后,宿主程序要计算,不等待,宿主程序一定要崩掉的。有什么好的办法,
    DataSet.DisableControls;

    DataSet.EnableControls;
    宿主程序就不计算了,数据一定不全,我也没宿主程序得源代码。
      

  5.   

    在PostMessage之后,立马调用APPlication.ProcessMessages
      

  6.   

    APPlication.ProcessMessages 方法可以,在停留一会,看看有没有好的办法,再给分,谢谢。
      

  7.   

    还有个问题,赋值
    DataSet.FieldByName('名称').AsString:= '';
    DataSet.FieldByName('名称').Value:= '';
    DataSet.FieldByName('名称').Text:= '';
    DBGrid.Fields[0]).AsString:= '';
    一共六种赋值方式。
    用哪个好?