Laufzeitfehler

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Laufzeitfehler

Beitrag von Cool-Tuc »

Hallo alle,

ich erstelle ein neue Projekt. Nun lade ich mir eine Form aus einem anderen Projekt. Während des Startens des neuen (alten) Forms gibts allerdings einen gravierenden Fehler:

Code: Alles auswählen

...exception-klasse External sigsegv...
Kann mir jemand erklären, wo das her kommt. Ist mir bisher immer aufgefallen, falls ich Forms aus anderen Projekten wiederverwenden möchte.....es hilft nur, das gewünschte Form komplett neue nachzubauen.....

danke

Udo

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Laufzeitfehler

Beitrag von theo »

Das liegt wahrsch. daran, dass die Form nirgends created wurde.
Schau dir mal "Projekt" -> ".lpr - Datei anzeigen" an.
Dort siehst du

Code: Alles auswählen

 
Application.CreateForm(TForm1, Form1);             
 
So etwas müsste man auch mit der neuen TForm machen.
Es muss nicht unbedingt in der lpr sein.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Laufzeitfehler

Beitrag von Michl »

Ich denke, du hast vergessen, die Form zu createn. Sprich, wenn du die Form per Hand kopierst, musst du sie dann auch per Hand in dein Projekt einbinden.

Also:
- öffne deine Projekt-Datei (unter: Projekt -> .lpr-Datein anzeigen)
- jetzt kannst du deine Unit eintragen und die Form "per Hand" createn, zB wenn deine kopierte Form "Form2" heist:

Code: Alles auswählen

program project1;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1, Unit2    // Hier die Unit einfügen !!!
  { you can add units after this };
 
{$R *.res}
 
begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);  //Hier deine Form createn !!!
  Application.Run;
end.
[Edit] Huch, Theo war schneller

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Re: Laufzeitfehler

Beitrag von Cool-Tuc »

Hallo ihr beiden,

super, hat funktioniert. Ich war davon ausgegangen, wenn ich eine Form über "Projektinstpector -> Datei hinzufügen" gehen, wird diese Form automatisch (und komplett) in das Projekt integriert...
Muss ich immer den manuellen Weg gehen, wenn ich so etwas vorhabe?

danke

Udo

wp_xyz
Beiträge: 5142
Registriert: Fr 8. Apr 2011, 09:01

Re: Laufzeitfehler

Beitrag von wp_xyz »

Ich bin überhaupt kein Fan von der automatischen Erzeugung von Formularen, weil damit alle Formulare, auch wenn sie gar nicht benötigt werden, im Speicher herumhängen. Wenn ich ein neues Formular zum Projekt hinzufüge, gehe ich gleich in den Dialog "Projekt Optionen" / "Formulare" und entferne es aus der Liste der automatisch erzeugten Formulate. Wenn ich das Formular dann benötige, meist durch einen Button- oder Menü-Click, erzeuge ich es zur Laufzeit, z.B.

Code: Alles auswählen

 
procedure TForm1Button1Click(Sender: TObject);
begin
  if Form2 = nil then
    Form2 := TForm2.Create(Application);  // oder TForm2.Create(self);
  Form2.Show;
end;
 
Oder bei modalen Dialogen lohnt es sich, das Formular nach dem Schließen gleich wieder zu zerstören:

Code: Alles auswählen

 
procedure TForm1Button1Click(Sender: TObject);
var
  F: TForm2;
begin
  F := TForm2.Create(nil);
  try
    // Die Controls auf TForm2 mit Daten aus der Anwendung befüllen
    if F.ShowModal = mrOK then
      // Die Controls auf TForm2 auslesen und an die Anwendung weitergeben
  finally
    F.Free;
  end;
end;
 

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Laufzeitfehler

Beitrag von Christian »

nochn Tipp:

Code: Alles auswählen

 
procedure TMyForm.Execute;
begin
  if not Assigned(Self) then begin
    Application.CreateForm(TfMyForm,fMyForm);
    Self := fMyForm;
  end;
  Showmodal;
end;
 
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten