【发布时间】:2020-09-13 17:40:49
【问题描述】:
我有一个使用它的简单应用:
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 的帮助),我得到了这个:
这是我查找来电者的时候:
【问题讨论】:
-
您的代码中只是有一个错误。你需要调试。
-
“FMX 有什么依赖的,所以我必须在目标系统上安装它吗?”不,你可以很容易地通过简单的“你好,世界!”自己发现这一点。 FMX 应用程序并在第二台机器上运行它! :)
-
这个错误真的可能在任何地方。但只是一个非常非常疯狂的猜测:您是否使用了正确的
EnumWindowsProc调用约定? -
您需要在地址前加上一个“$”,因为地址是十六进制格式。
-
代码
TFormBorder.GetSupported在FMX.Forms.pas中。您现在可以在该函数的第一行放置一个普通断点。当执行在那里停止时,查看CallStack窗口(IDE 中的左上角)您是如何到达这一点的。调用堆栈是颠倒的,执行顺序是从低行到高行。祝你好运!
标签: delphi firemonkey delphi-10.3-rio