Bin am verzweifeln := Exeption-Klasse External SIGSEGV

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Kieler
Beiträge: 17
Registriert: Sa 22. Mär 2014, 11:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Kiel

Bin am verzweifeln := Exeption-Klasse External SIGSEGV

Beitrag von Kieler »

Ich habe nach einer langen Pause wieder mit Lazarus begonnen. Dazu habe ich auf meinem Windows 7 Rechner Lazarus auf 1.8 aktualisiert.
Alle ging solange gut bis ich einem TEdit einen neuen Text zuweisen wollte. Übersetzen und starten verlief gut. Sobald das Programm an diese Stelle kommt, stürzt meine Anwendung mit Exeption-Klasse SIGSEGV ab. Darauf habe ich ein altes Programm von mir neu übersetzt in denen es ähnliche Anweisungen gibt. Kein Problem. Ich kann aber keinen Unterschied erkennen. Jetzt habe ich ein absolutes Mini Programm erstellt, dass einfach die Farbe der Form ändern soll. Der gleiche Fehler tritt wieder auf. Ich bin ratlos.


Code: Alles auswählen

unit unitneu;
 
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;
 
type
  TForm1 = class(TForm)
  end;
 
var
  Form1: TForm1;
 
implementation
{$R *.lfm}
 
Begin
Form1.Color:=clBackground;
end.
Zuletzt geändert von m.fuchs am Sa 17. Feb 2018, 12:08, insgesamt 1-mal geändert.
Grund: Highlighter gesetzt

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Bin am verzweifeln := Exeption-Klasse External SIGSEGV

Beitrag von kupferstecher »

Soll das das ganze Programm sein? Das das ueberhaupt kompiliert...

Erstelle ein neues Projekt in Lazarus: Projekt/neu/Lazarus-Anwendung.

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Bin am verzweifeln := Exeption-Klasse External SIGSEGV

Beitrag von siro »

Guten Morgen

ehrlich gesagt finde ich die Frage garnicht mal so unberechtigt
und ich muste eben selbst erstmal wieder das Ablaufverhalten in einem Windows Programm erforschen.

Das Programm bekommt man problemlos compiliert.
Das "Begin" vor dem "end." kann man machen, muss man aber anscheinend nicht.
Das war mir auch neu. Aber:

@Kieler:
Das ist NICHT das Hauptprogramm in dem Du deinen Code schreibst.
An dieser Stelle könnte man spezielle Initialiserungen machen,
aber dort darfst Du "noch nicht" auf die Komponenten wie TForm zugreifen.
Das ist ja nur eine "Unit" der Du, ganz oben, den Namen unitneu gegeben hast.
Dieser Begin end Block dient eigentlich nur zum Initialieren deiner Unit.
Jede Unit hat diesen Initialisierungsteil, der beim Starten des Programms einmal durchlaufen wird.
Da kann was drin stehen, muss aber nicht.
Der Fehler tritt nun auf, weil es TForm zu diesem Zeitpunkt noch garnicht gibt.
Das Objekt wird erst später in der Anwenung erstellt und somit entsteht der Fehler.

In einer Windowsanwendung ist der Ablauf eines Hauptprogramms etwas anders geregelt
und eher "versteckt" würde ich das mal nennen.

Ein Hauptprogramm gibt es natürlich auch, aber mit dem kommt man eigentlich nie in Berührung.
Das gesamte System läuft über sogenannte Messages (Meldungen) Jeder schickt jedem irgendwas was er machen soll.
Die Komponenten oder Objekte reagieren dann entsprechend auf diese Meldungen.

Im Objektinspektor hast Du ja die Eigenschaften vom Formular.
Dort machst Du deine Grundeinstellungen, wie es aussehen soll usw.
Dann gibt es die Spalte "Ereignisse" und dort legt man fest wie das Objekt,
also z.B dein Formular auf bestimmte Ereignisse reagieren soll.

Dort wäre, in deinem Falle, das Ereignis OnCreate sinnvoll.
Dieses wird ausgelöst wenn das Formular erzeugt wird.
Du klickst also "doppelt" mit der Maus in das Feld bei OnCreate und Lazarus erzeugt Dir automatisch
einen Porpgrammcode und genau dort schreibts Du jetzt deinen Code rein.

Form1.Color:=clBackground;

Das wars dann schon....

Dann packst Du Dir einen Button aufs Formular
Im Objectinspector klickst Du auf Ereignisse "OnClick"
Lazarus erzeugt Dir einen Code und dort schreibst Du rein
Close;
Dann hast Du jetzt einen Button um dein Programm zu beenden.

Ich hoffe, ich konnte Dir den Einstieg erleichtern
Siro

Das Problem mit dem TEdit zuweisen lässt sich sicher ganz schnell lösen, einfach mal den Code reinstellen....
Dafür sind wir hier..... :wink:
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Kieler
Beiträge: 17
Registriert: Sa 22. Mär 2014, 11:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Kiel

Re: Bin am verzweifeln := Exeption-Klasse External SIGSEGV

Beitrag von Kieler »

Moin, moin,

vielen Dank für ihre schnelle Unterstützung.

Wie konnte es soweit kommen?
Ich habe einen kleinen Datenlogger als Konsolenanwendung geschrieben. Diesen wollte ich zu einer Anwendung wandeln und zur Laufzeit ein paar Werte anzeigen. Es war offensichtlich zu einfach gedacht, einfach alles zusammen zu kopieren.

# Kupferstecher
Bevor ich hier geschrieben habe, habe ich natürlich ca. 20 x ein neues Projekt erstellt. Aus meinem Projekt habe ich alles gelöscht bis auf den Fehler.

#siro
Danke, danke, dass du dir soviel Zeit genommen hast. Mit deiner Hilfe habe ich auf den richtigen Weg zurück gefunden. Meine Anzeige funktioniert jetzt auch. Ich muss aber noch etwas lesen, damit das richtige Verständnis reift.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bin am verzweifeln := Exeption-Klasse External SIGSEGV

Beitrag von Mathias »

Ich habe einen kleinen Datenlogger als Konsolenanwendung geschrieben. Diesen wollte ich zu einer Anwendung wandeln und zur Laufzeit ein paar Werte anzeigen. Es war offensichtlich zu einfach gedacht, einfach alles zusammen zu kopieren.

Dies ist schon möglich, du kannst in einem Consolen-Programm ein Form dynamisch zur Laufzeit erzeugen und etwas ausgeben.
Dazu muss nur die Package LCL eingebunden werden.

Code: Alles auswählen

program Project1;
 
uses
  Classes, Interfaces, Forms, Graphics;
 
type
  TMyForm = class(TForm)
  private
    procedure MyFormPaint(Sender: TObject);
  public
    constructor CreateNew(TheOwner: TComponent);
  end;
 
var
  MyForm: TMyForm;
 
  constructor TMyForm.CreateNew(TheOwner: TComponent);
  begin
    inherited CreateNew(TheOwner);
    OnPaint := @MyFormPaint;
  end;
 
  procedure TMyForm.MyFormPaint(Sender: TObject);
  begin
    Canvas.TextOut(10, 10, 'Hello World!');
  end;
 
begin
  WriteLn('Drücke [Enter] zum starten');
  ReadLn;
 
  MyForm := TMyForm.CreateNew(nil);
  MyForm.Color := clRed;
  MyForm.ShowModal;
  MyForm.Free;
 
  WriteLn('Fenster wurde geschlossen');
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten