2016-01-28 1 views
0

Предположим, что есть три формы в проекте (Form1, Form2, Form3). Form1 имеет кнопку на нем с событием OnClick, установленным на Form2.Show. Этот код выполняет отлично, однако если код Form2 в пытается вызвать Form3.Show, то проект поднимает ВНЕШНИЙ: SIGSEGV указывает на Customform.incПаскаль: сборка проекта Внешняя: SIGSEGV при взаимодействии с формой

project1 Проект поднял класс исключения «Внешний: SIGSEGV»

В файле ' . \ include \ customform.inc 'по строке 2196:

Видимый: = 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. 
+0

Вы уверены, что 'Form3' был инициализирован до создания' TWarForm'? В вашем описании говорится, что вы получаете сообщение об ошибке при попытке сделать показ формы одним нажатием кнопки, но ваш код пытается показать форму во время создания другой формы (основной формы?). – lurker

+0

Delphi не поднимает SIGSEGV, поэтому это не связано с Delphi, и у Pascal нет форм или обработчиков событий. Я удалил неподходящие теги. Не используйте случайные теги, которые не относятся к вашему вопросу, чтобы привлечь внимание; используйте теги, которые действительно применимы к вашему сообщению. Кроме того, ваш код является неполным. У вас нет единицы в предложении uses для Form3, которое я вижу. Где вы создаете 'Form3'? Если вы установите разбивку на строке 'Form3.Show', что скажет отладчик, когда вы оцениваете' Form3'? –

ответ

1

Вы должны создавать формы либо в ручную или установить их на «автоматическое создание» в вашем IDE

создать их в ручную просто изменить код немного :

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 в го конец вашего исполнения приложения.

Смежные вопросы