delphi - 应用程序在目标计算机上产生异常
问题描述
我有一个简单的应用程序使用它:
uses
System.SysUtils, System.Types, System.UITypes, System.Classes,
Winapi.Windows, System.Variants, FMX.DialogService, TLHelp32,
PlayForm, FMX.Platform, FMX.Media, FMX.Types, FMX.Controls, FMX.Forms,
FMX.Graphics, FMX.Dialogs, FMX.Layouts, FMX.StdCtrls, System.IOUtils,
FMX.Controls.Presentation, FMX.Colors, FMX.Edit, FMX.Objects, FMX.ListBox;
然后它被编译并复制到另一台计算机上,它会产生这个错误:
Exception EAccessViolation in module Kvigraonica.exe at 0054B0F7.
Access violation at address 0094B0F7 in module 'Kvigraonica.exe'. Read of address 0000000C.
OnCreate 事件是这样的:
procedure TfrmMain.FormCreate(Sender: TObject);
var
i: Integer;
begin
try
TDialogService.PreferredMode := TDialogService.TPreferredMode.Platform;
if tfile.Exists(System.SysUtils.GetCurrentDir + '\team-a.jpg') then
begin
imgTeamA.LoadFromFile(System.SysUtils.GetCurrentDir + '\team-a.jpg');
imgTeamA.TagString := System.SysUtils.GetCurrentDir + '\team-a.jpg';
end;
if tfile.Exists(System.SysUtils.GetCurrentDir + '\team-a.png') then
begin
imgTeamA.LoadFromFile(System.SysUtils.GetCurrentDir + '\team-a.png');
imgTeamA.TagString := System.SysUtils.GetCurrentDir + '\team-a.png';
end;
if tfile.Exists(System.SysUtils.GetCurrentDir + '\team-a.gif') then
begin
imgTeamA.LoadFromFile(System.SysUtils.GetCurrentDir + '\team-a.gif');
imgTeamA.TagString := System.SysUtils.GetCurrentDir + '\team-a.gif';
end;
if tfile.Exists(System.SysUtils.GetCurrentDir + '\team-b.jpg') then
begin
imgTeamB.LoadFromFile(System.SysUtils.GetCurrentDir + '\team-b.jpg');
imgTeamB.TagString := System.SysUtils.GetCurrentDir + '\team-b.jpg';
end;
if tfile.Exists(System.SysUtils.GetCurrentDir + '\team-b.png') then
begin
imgTeamB.LoadFromFile(System.SysUtils.GetCurrentDir + '\team-b.png');
imgTeamB.TagString := System.SysUtils.GetCurrentDir + '\team-b.png';
end;
if tfile.Exists(System.SysUtils.GetCurrentDir + '\team-b.gif') then
begin
imgTeamB.LoadFromFile(System.SysUtils.GetCurrentDir + '\team-b.gif');
imgTeamB.TagString := System.SysUtils.GetCurrentDir + '\team-b.gif';
end;
except on E: Exception do
ShowMessage(e.Message);
end;
end;
我有一个计时器:
procedure TfrmMain.tmr1Timer(Sender: TObject);
begin
try
if (cbbTeamA.Items.Count = 1) then
begin
EnumWindows(@EnumWindowsProc, LPARAM(cbbTeamA));
end
else
if (cbbTeamA.Items.Count = 0) or ((cbbTeamA.Selected <> nil) and (cbbTeamA.Selected.Index = 0)) then
begin
cbbTeamA.Clear;
cbbTeamA.Items.AddObject('Izaberite VLC player Ekipu A', TObject(0));
cbbTeamA.ItemIndex := 0;
EnumWindows(@EnumWindowsProc, LPARAM(cbbTeamA));
end;
if (cbbTeamB.Items.Count = 1) then
begin
EnumWindows(@EnumWindowsProc, LPARAM(cbbTeamB));
end
else
if (cbbTeamB.Items.Count = 0) or ((cbbTeamB.Selected <> nil) and (cbbTeamB.Selected.Index = 0)) then
begin
cbbTeamB.Clear;
cbbTeamB.Items.AddObject('Izaberite VLC player za Ekipu B', TObject(0));
cbbTeamB.ItemIndex := 0;
EnumWindows(@EnumWindowsProc, LPARAM(cbbTeamB));
end;
except on E: Exception do
ShowMessage(e.Message);
end;
end;
我有更多的事件和程序,但这里我放了我认为最重要的那些。现在,即使我注释掉所有事件和过程,我仍然有同样的错误:
Exception EAccessViolation in module Kvigraonica.exe at 0054B0F7.
Access violation at address 0094B0F7 in module 'Kvigraonica.exe'. Read of address 0000000C.
FMX 有什么依赖的,所以我必须将它安装在目标系统上吗?
更新
我发现问题出在我正在使用的样式书中。
我遵循了@StijnSanders 的建议(也有@TomBrunberg 的帮助),我得到了这个:
这是我查找来电者的时候:
解决方案
按F7which 使用调试器启动您的项目,这将启用“搜索”菜单下的“转到地址”选项。用它来查找地址$0094B0F7
。可以选择阅读手册中有关调试的更多信息,以了解如何将程序运行到失败的地步。
推荐阅读
- c++11 - 排列组合c++逻辑错误
- python - 带有 Pandas 数据框千位分隔符的 XlsxWriter
- sql-server - Pentaho 无法连接到 SQL Server 2017
- c++ - C++:构建选项“-j”是什么意思?
- python - 在python中将矩阵的值更改为高于阈值
- python - 在python中迭代一维数组的每个元素
- python - 如何从树中删除 NavigableString?
- laravel - 存储在 AWS 存储桶中的文件只有在用户登录 Laravel 应用程序时才能下载。不是直接访问 URL
- java - Java 数组元素和内存可见性问题
- angular - Angular 8 - 如果构建失败则停止服务