Pascal:项目提升外部:与 Form 交互时的 SIGSEGV

Pascal: Project raising External: SIGSEGV when interacting with Form

假设一个项目中有3个表单(Form1、Form2、Form3)。 Form1 上有一个按钮,其 OnClick 事件设置为 Form2.Show。此代码执行完美,但是如果 Form2 的代码尝试调用 Form3.Show,则项目会引发一个 EXTERNAL: SIGSEGV 指向 Customform.inc

Project project1 raised exception class 'External: SIGSEGV'

In file '.\include\customform.inc' at line 2196:

Visible := True;

这正是我的项目正在发生的事情。所有表格均已正确创建和声明,并且单位链接完美。编译顺利,没有任何错误或警告。

所以不可能让第三形态可见。但是我发现每一种交互都会导致 External: SIGSEGV 错误指向随机的代码片段,这些代码可以编译并且 运行 就好了。我就是想不通错误的根源。

如果我尝试在没有调试器的情况下执行我的项目,我会收到访问冲突错误。失败代码:

procedure TWarForm.FormCreate(Sender: TObject);
Begin
   Form3.Show;
end;

来自

unit work;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, BGRAFlashProgressBar, AuthUnit;

type

  { TWarForm }

  TWarForm = class(TForm)
    ArcaneDustIMG: TImage;
    ProgressBar: TBGRAFlashProgressBar;
    ArcaneEDT: TEdit;
    GoldEDT: TEdit;
    GoldIMG: TImage;
    Label1: TLabel;
    Wallpaper: TImage;
    procedure FormCreate(Sender: TObject);
    procedure WallpaperMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure WallpaperMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure WallpaperMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  WarForm: TWarForm;
  MouseIsDown: Boolean;
  PX, PY: Integer;

implementation

{$R *.lfm}

{ TWarForm }

procedure TWarForm.WallpaperMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then begin
    MouseIsDown := True;
    PX := X;
    PY := Y;
  end;
end;

procedure TWarForm.FormCreate(Sender: TObject);
Begin
   Form3.Show;
end;

procedure TWarForm.WallpaperMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MouseIsDown then begin
    SetBounds(WarForm.Left + (X - PX), WarForm.Top + (Y - PY), WarForm.Width, WarForm.Height);
  end;
end;

procedure TWarForm.WallpaperMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MouseIsDown:=False;
end;

end.
   

您必须手动创建表格或在 IDE

中将它们设置为 "auto create"

要手动创建它们,只需稍微更改您的代码即可:

 TWarForm = class(TForm)
    ArcaneDustIMG: TImage;
    ProgressBar: TBGRAFlashProgressBar;
    ArcaneEDT: TEdit;
    GoldEDT: TEdit;
    GoldIMG: TImage;
    Label1: TLabel;
    Wallpaper: TImage;

    Form2: TForm2; // insert Form2
    Form3: TForm3; // and Form3

    procedure FormCreate(Sender: TObject);
    procedure WallpaperMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure WallpaperMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure WallpaperMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { private declarations }
  public
    { public declarations }
  end;

  ..

  procedure TWarForm.FormCreate(Sender: TObject);
  Begin
    Form3 := TForm3.Create(Self);
    Form3.Show;
  end;    

如果这样做,请不要忘记在应用程序执行结束时调用 Form3.Free。