- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用 Delphi 编写的遗留应用程序,需要构建一个机制
来自/到 TStringGrid 的数据。
我没有该应用程序的源代码,没有自动化接口(interface),供应商也不太可能提供该接口(interface)。
因此我创建了
DLL 2 可以访问旧应用程序内的 TStringGrid 实例,读取单元格值并将其写入调试日志。
阅读效果很好。但是,当我尝试使用类似
的调用将数据写入网格单元时realGrid.Cells[1,1] := 'Test';
发生访问冲突。
代码如下:
procedure DllMain(reason: integer) ;
type
PForm = ^TForm;
PClass = ^TClass;
PStringGrid = ^TStringGrid;
var
[...]
begin
if reason = DLL_PROCESS_ATTACH then
begin
handle := FindWindow('TForm1', 'FORMSSSSS');
formPtr := PForm(GetVCLObjectAddr(handle) + 4);
if (not Assigned(formPtr)) then
begin
OutputDebugString(PChar('Not assigned'));
Exit;
end;
form := formPtr^;
// Find the grid component and assign it to variable realGrid
[...]
// Iterate over all cells of the grid and write their values into the debug log
for I := 0 to realGrid.RowCount - 1 do
begin
for J := 0 to realGrid.ColCount - 1 do
begin
OutputDebugString(PChar('Grid[' + IntToStr(I) + '][' + IntToStr(J) + ']=' + realGrid.Cells[J,I]));
// This works fine
end;
end;
// Now we'll try to write data into the grid
realGrid.Cells[1,1] := 'Test'; // Crash - access violation
end;
end; (*DllMain*)
如何将数据写入 TStringGrid 而不会出现访问冲突问题?
最佳答案
这种方法根本行不通。目标可执行文件中有两个 VCL 实例。一份由目标应用程序拥有,一份由 DLL 拥有。这一个 VCL 实例太多了。如果使用完全相同版本的 Delphi 来构建目标应用程序和 DLL,您也许可以摆脱这种情况。
但是,您仍然有两个堆管理器在起作用。并且您的代码在不同的 VCL 实例之间传递堆分配的内存。您将在一个堆中分配并在另一堆中取消分配。这是行不通的,并且会导致访问冲突。
您正在将 DLL 堆中分配的字符串传递给使用目标应用程序堆的字符串网格对象。那是行不通的。
我认为,当 DLL 代码尝试释放由目标应用程序的堆管理器分配的 Cells[i,j]
的先前值时,就会发生访问冲突。
基本上你所尝试的方法是行不通的。您可以找到目标应用程序的 TStringGrid.SetCell
实现的地址,并伪造对其的调用。但您还需要找到目标应用程序的 GetMem
、FreeMem
等实现,并确保从 DLL 跨越到目标应用程序的所有动态内存都已分配并由目标应用程序的堆释放。你将有一份非常出色的工作来完成这项工作。当然,如果目标应用程序和 DLL 都使用共享内存管理器,那么您也许能够使这种方法发挥作用。
更简单的是伪造键盘输入。我个人会探讨使用 AutoHotKey 的可行性。
关于delphi - 从外部应用程序将数据写入 Delphi TStringGrid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12454732/
我正在尝试为 TStringGrid 创建一个列编辑器(显示/隐藏列)。编辑器是一个包含列表框、标签和按钮的面板。我想直接在我的 TStringGrid 控件中创建此编辑器。 网格: type TA
我写的一段代码有一些问题。我正在使用 TStringGrid 来绘制座位图。 它应该做的是用列向下的字母和行的数字标记 fixedcol 和 fixedrow。 我的问题是我不知道如何更改我的代码,以
题: 任何人都可以在任何地方指向一篇文章或代码示例,以了解如何 在 TStringGrid 中提供编辑和范围选择? 是的,我知道有第三方网格可以做到这一点,但它是 令人沮丧的是内置网格缺乏这种基本功能
此链接/图片显示了我试图使用 TStringGrid 实现的目标。 此链接/图片显示了我下面的代码所产生的结果。 unit Unit1; interface uses Windows, Messa
我有一个包含 10 列的 TStringGrid。添加 500 行大约需要 2 秒。这是正常表现吗? 我觉得有点慢。 我正在从数据库查询中获取数据。如果我循环查询但不将结果写入 StringGrid,
我正在运行时从 CSV 文件向字符串网格添加多行,但是 StringGrid 在更新时似乎会闪烁很多,我认为会有一个 beginupadate/Endupdate 命令来停止此操作。但是我找不到它。有
我正在 Borland C++Builder IDE 中工作,使用 VCL 控件。我试图让 TStringGrid 组件根据不同形式的用户输入向下滚动到一行并突出显示该行。我已完成突出显示部分,但我不
下面是一个简单的 Delphi 表单应用程序的代码,该应用程序设置超出包含单元格的指定 TStringGrid 范围的单元格值。 运行程序并单击显示表单上的结果网格,当计数器i超过 1 时,应该会生成
是否可以将箭头指针添加到 Delphi 7 中的 String Grind 中?您知道我的意思,您可以在 DBGrid 的左侧看到箭头指针。 最佳答案 是的,但不是自动的。您需要手动显示三角形。您可以
我想为TStringGrid实现FillCell过程。我想用某种颜色填充特定单元格,但仅当未选择该单元格(行)时才可以。 procedure TMyStrGrid.FillCell(Rect: TRe
我开始学习德尔福。所以我决定从头开始编写一个像 MS Excel 这样的应用程序。在一个新的 Form1 中,我确实放置了一个仅包含 1 页的 TPageControl 组件。在那个页面中,我确实放了
我正在按照此 video 制作一个简单的数据库应用程序。当我使用 TStringGrid 而不是视频中所述的 TGrid 时,就会出现问题,因为我没有它。我有一个导航器并将所有数据加载到 TStrin
如何自动调整 TStringGrid 行 (DefaultRowHeight) 的大小以匹配所使用字体的高度?我做了类似的事情 Grid.DefaultRowHeight:= Grid.Canvas.
我有一个用 Delphi 编写的遗留应用程序,需要构建一个机制 阅读和 写作 来自/到 TStringGrid 的数据。 我没有该应用程序的源代码,没有自动化接口(interface),供应商也不太可
我担心这可能是一个“一根绳子有多长”的问题,但想知道是否有人有一些硬数据或建议。 我有一个 TStringGrid,它可能有 3,600 行,也许更多,我们还不确定。由于显示器显然没有足够的空间,因此
我的 StringGrid 有 2 列:Player 和 Scores。我必须根据玩家的得分对该表进行排序。 情况就是这样。我尝试过使用 StringGrid3.SortColRow(true, 1)
我在谷歌上搜索并找到了很多建议,但这些建议似乎已经有好几年了,而且没有任何帮助。 我有一个包含 8 列的字符串网格,一旦我获得超过几百行,就需要 2 秒多的时间来填充(我使用 GetTickCount
我将复选框 (TCheckBox) 放置在第一列的字符串网格 (TStringGrid) 中。复选框显示良好,位置正确,并且在将鼠标悬停在其上方时通过发光来响应鼠标。然而,当我单击它们时,它们不会切换
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的表单上有一个 TStringGrid 对象,它有 1 个固定列和 1 个固定行。我希望当用户单击该行中的任何单元格时能够选择对象上的整行。此选择还必须对用户可见(我希望该行更改颜色)。 编辑:已将
我是一名优秀的程序员,十分优秀!