Bin am verzweifeln := Exeption-Klasse External SIGSEGV

Für Fragen von Einsteigern und Programmieranfängern...

Bin am verzweifeln := Exeption-Klasse External SIGSEGV

Beitragvon Kieler » 17. Feb 2018, 01:16 Bin am verzweifeln := Exeption-Klasse External SIGSEGV

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 17. Feb 2018, 12:08, insgesamt 1-mal geändert.
Grund: Highlighter gesetzt
Kieler
 
Beiträge: 17
Registriert: 22. Mär 2014, 11:58
Wohnort: Kiel
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon kupferstecher » 17. Feb 2018, 07:10 Re: Bin am verzweifeln := Exeption-Klasse External SIGSEGV

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

Erstelle ein neues Projekt in Lazarus: Projekt/neu/Lazarus-Anwendung.
kupferstecher
 
Beiträge: 169
Registriert: 17. Nov 2016, 11:52

Beitragvon siro » 17. Feb 2018, 08:42 Re: Bin am verzweifeln := Exeption-Klasse External SIGSEGV

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...
siro
 
Beiträge: 324
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Kieler » 17. Feb 2018, 14:09 Re: Bin am verzweifeln := Exeption-Klasse External SIGSEGV

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.
Kieler
 
Beiträge: 17
Registriert: 22. Mär 2014, 11:58
Wohnort: Kiel
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Mathias » 17. Feb 2018, 17:02 Re: Bin am verzweifeln := Exeption-Klasse External SIGSEGV

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried