我在 Delphi 中有一个带有网格的应用程序。
我需要创建另一个应用程序,它应该
a) 从网格中读取数据 b) 将数据写入网格中,
即模拟人类用户的动作。
为了从表中读取数据,我使用以下代码:
Procedure TForm1.Button1Click(Sender: TObject);
type
PForm = ^TForm;
PClass = ^TClass;
var
formPtr : PForm;
I: Integer;
msg : string;
windowHandle : HWND;
begin
windowHandle := FindWindow('TForm1', 'FORMSSSSS');
formPtr := PForm(GetVCLObjectAddr(windowHandle) + 4);
if (not Assigned(formPtr)) then Exit;
for I := 0 to formPtr^.ControlCount - 1 do // Error
begin
msg := msg + formPtr^.Controls[i].Name;
if formPtr^.Controls[i].Name = 'StringGrid1' then
begin
msg := TStringGrid(formPtr^.Controls[i]).Cells[1, 1];
end;
end;
ShowMessage(msg);
end;
function GetVCLObjectAddr(AHandle: HWND): DWORD;
var
pid: DWORD;
begin
pid := 0;
GetWindowThreadProcessId(AHandle, pid);
if (pid =0) then
begin
Result := 0;
Exit;
end;
Result := GetPropW(AHandle, PWideChar(WideString(Format('Delphi%.8X', [PID]))))
end;
在带有“错误”注释的行中,出现以下问题:
Project Project1.exe 引发异常类 EAccessViolation,并带有消息“模块 'Project1.exe' 中地址 0046C8C3 的访问冲突”。读取地址 01262984'。
当我在该行上放置一个断点并检查“Watches”选项卡中表达式“formPtr^”的值时,我收到“Inaccessible value”消息。
应该如何修改代码以便能够从网格中读取数据?
升级版:
如果我将代码更改为下面给出的版本,内存问题就会消失。但是出现了另一个问题——控制计数等于零。
Procedure TForm1.Button1Click(Sender: TObject);
var
formPtr : TForm;
I: Integer;
msg : string;
windowHandle : HWND;
begin
windowHandle := FindWindow('TForm1', 'FORMSSSSS');
formPtr := TForm(GetVCLObjectAddr(windowHandle) + 4);
if (not Assigned(formPtr)) then Exit;
for I := 0 to formPtr.ControlCount - 1 do
begin
msg := msg + formPtr.Controls[i].Name;
if formPtr.Controls[i].Name = 'StringGrid1' then
begin
msg := TStringGrid(formPtr.Controls[i]).Cells[1, 1];
end;
end;
ShowMessage(msg);
end;