首页 > 解决方案 > 应用程序在目标计算机上产生异常

问题描述

我有一个简单的应用程序使用它:

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 的帮助),我得到了这个:

在此处输入图像描述

这是我查找来电者的时候:

在此处输入图像描述

标签: delphifiremonkeydelphi-10.3-rio

解决方案


F7which 使用调试器启动您的项目,这将启用“搜索”菜单下的“转到地址”选项。用它来查找地址$0094B0F7。可以选择阅读手册中有关调试的更多信息,以了解如何将程序运行到失败的地步。


推荐阅读