External: SIGSEGV bei Datenübergabe in eine Textbox

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DOS
Beiträge: 18
Registriert: Mi 13. Dez 2017, 21:04
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

External: SIGSEGV bei Datenübergabe in eine Textbox

Beitrag von DOS »

Mich treiben die wagen Fehlermeldungen von Lazarus mal wieder in den Wahnsinn ^^

Also bei diesem Code:

Code: Alles auswählen

procedure loadDatei();
Var
  dOF : TextFile;
  eData : String;
begin
  AssignFile(dOF, Form1.kDatenb.datei);
  try
    Reset(dOF);
    ReadLn(dOF,eData);
    Form2.LiD.Text := 1;
    ReadLn(dOF,eData);
    Form2.CheckBox1.Checked := StrToBool(eData);
    ReadLn(dOF,eData);
    Form2.LiD1.Text := eData;
    ReadLn(dOF,eData);
    Form2.DateEdit1.Text:= eData;
    ReadLn(dOF,eData);
    Form2.LiD3.Text := eData;
    ReadLn(dOF,eData);
    Form2.ComboBox1.Text := eData;
    ReadLn(dOF,eData);
    Form2.LiD4.Text := eData;
    ReadLn(dOF,eData);
    Form2.LiD5.Text := eData;
    Repeat
     ReadLn(dOF,eData);
     Form2.Memo1.Lines.add(eData);
    until EOF(dOF);
    Close(dOF);
  finally
  end;
end;         


Diese Funktion löst folgenden Fehler aus:

Projekt Test hat Exception-Klasse »External: SIGSEGV« ausgelöst.

In Datei 'unit2.pas' in Zeile 87:
Form2.LiD.Text := eData;


Ich kann diese Zeile Auskommentieren, es kommt immer wieder dieser Fehler, selbst wenn ich die Variable gegen einen normalen String Text 'Test' austausche.

Wo ist da mein Fehler?

Verwende Lazarus 1.8.4 rUnversioned directory FPC 3.0.4 x86_64-linux-gtk2

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

Re: External: SIGSEGV bei Datenübergabe in eine Textbox

Beitrag von Michl »

Ins Blaue geraten existiert Form2 noch nicht (wurde noch nicht erstellt).

Teste mal, ob sie existiert:

Code: Alles auswählen

procedure loadDatei();
Var
  dOF : TextFile;
  eData : String;
begin
  if not Assigned(Form2) then begin
    ShowMessage('Form2 existiert nicht');
    Exit;
  end;
  AssignFile(dOF, Form1.kDatenb.datei);
  try
    Reset(dOF);
    ReadLn(dOF,eData);
    Form2.LiD.Text := 1;
    ReadLn(dOF,eData);
    Form2.CheckBox1.Checked := StrToBool(eData);
    ReadLn(dOF,eData);
    Form2.LiD1.Text := eData;
    ReadLn(dOF,eData);
    Form2.DateEdit1.Text:= eData;
    ReadLn(dOF,eData);
    Form2.LiD3.Text := eData;
    ReadLn(dOF,eData);
    Form2.ComboBox1.Text := eData;
    ReadLn(dOF,eData);
    Form2.LiD4.Text := eData;
    ReadLn(dOF,eData);
    Form2.LiD5.Text := eData;
    Repeat
     ReadLn(dOF,eData);
     Form2.Memo1.Lines.add(eData);
    until EOF(dOF);
    Close(dOF);
  finally
  end;
end;

Code: Alles auswählen

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

DOS
Beiträge: 18
Registriert: Mi 13. Dez 2017, 21:04
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: External: SIGSEGV bei Datenübergabe in eine Textbox

Beitrag von DOS »

Besten Dank, genau dies ist der Fehler.

Nun mein Problem,

Code: Alles auswählen

procedure TForm2.FormCreate(Sender: TObject);
begin
  { Soll ein neuer Eintrag angelegt werden? }
  If Form1.eIsNew Then
   Begin
    debugData('eID beim Laden von Form2 ' + IntToStr(Form1.eID));
    LiD.Text := IntToStr(Form1.eID);
    LiD1.Text := FormatDateTime('dd.mm.yyyy',now);
    DateEdit1.Text := FormatDateTime('dd.mm.yyyy',now + 1);
   end
  { Es soll ein bestehender Eintrag geöffnet werden }
  else
   Begin
    debugData('eID beim Laden von Form2 ' + Form1.kDatenb.id);
    LiD.Text := Form1.kDatenb.id;
    If Form1.kDatenb.aktiv = 1 Then Checkbox1.Checked := True Else Checkbox1.Checked:= false;
    loadDatei(){ Daten einlesen und übergeben }
   end;
  { Das soll immer ausgeführt werden }
  Combobox1.Items.Add('Kunde Rückruf');
  Combobox1.Items.Add('Reklamation');
  Combobox1.Items.Add('Bestellung');
  Combobox1.Items.Add('Kunde Informieren');
  end;         


Beim erstellen der Form, sollen die Daten geladen werden, kann ich dies nun nur mit einem Timer lösen? Den ich für recht unelegant halten würde oder welchen Weg könnte man mir da empfehlen?

Bin von Visual Basic auf Delphi umgesteiegn und da bin ich es gewohnt das erst die Form erstellt wird und dann main ausgeführt wird.

EDIT:

habs nun mit procedure TForm2.FormShow(Sender: TObject); gelöst.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: External: SIGSEGV bei Datenübergabe in eine Textbox

Beitrag von af0815 »

Ich mache da init im OnFormActivate im Mainform und setze mir dann ein Flag, das esschon gemacht wurde. Somit wird das Init erst durchgeführt wenn alles erzeugt wurde. Damit kann ich auch super mit Splashscreens arbeiten, bei dem zB. Dem User der aktuelle Stand angezeigt wird. Normalerweise wird bei mir auch immer nur das Main automatisch erzeugt u d der Rest zur Laufzeit, damit hat man IMHO eine exzellente Kontrolle.

So querreferenzen von einem Form zur anderen würde ich über Parameter oder Properties lösen, damit werden Probleme mit hängenden Referenzen wie bei Dir soweit wie möglich vermieden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

DOS
Beiträge: 18
Registriert: Mi 13. Dez 2017, 21:04
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: External: SIGSEGV bei Datenübergabe in eine Textbox

Beitrag von DOS »

af0815 hat geschrieben:So querreferenzen von einem Form zur anderen würde ich über Parameter oder Properties lösen, damit werden Probleme mit hängenden Referenzen wie bei Dir soweit wie möglich vermieden.


ok, danke für den Hinweis, wie genau meinst du das mit den Parametern und Properties?

Mfg. DOS

Antworten