ubuntuusers.de

Lazarus: Access violation bei Schreiben mit property

Status: Gelöst | Ubuntu-Version: Ubuntu 12.10 (Quantal Quetzal)
Antworten |

maeries

Anmeldungsdatum:
16. April 2010

Beiträge: 449

Hallo zusammen,

ich habe ein Problem bei einem Programm in Lazarus. Ich habe mal ein kleines Programm geschrieben, das nichts weiter macht als diesen Fehler zu reproduzieren. Hier mal der Quellcode:

Unit1

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  unit2;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    hTest :  tUnit2;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  hTest.Zahl:=Edit1.text;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Edit2.text := htest.Zahl;
end;

end.

Unit2:

unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

type
  tUnit2 = class(TObject)
  private
    zZahl : string;
    procedure SchreibeZahl ( pZahl : string ); virtual;
    function  liesZahl : string; virtual;
  public
    property Zahl : string read lieszahl write schreibezahl;
  end;

implementation

procedure tUnit2.SchreibeZahl (pZahl : string);
begin
  zZahl := pZahl;
end;

function tUnit2.liesZahl : string;
begin
  result := zZahl;
end;

end.

Der Fehler tritt auf, wenn man irgendwas in das obere Editfeld eingibt und dann auf Button1 oder 2 klickt. Wenn ich es in Lazarus öffne und ausführe kommt die Meldung

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

 In Datei 'unit1.pas' in Zeile 39:
hTest.Zahl:=Edit1.text;

Wenn ich es kompiliere und es dann aus Nautilus heraus öffne lautet die Meldung:

Access violation.

Press OK to ignore and risk data corruption.
Press Cancel to kill the program.

Weiß jemand, wo der Fehler liegt?

Gruß maeries

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13213

maeries schrieb:

Der Fehler tritt auf, wenn man irgendwas in das obere Editfeld eingibt und dann auf Button1 oder 2 klickt. Wenn ich es in Lazarus öffne und ausführe kommt die Meldung

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

 In Datei 'unit1.pas' in Zeile 39:
hTest.Zahl:=Edit1.text;

Wenn ich es kompiliere und es dann aus Nautilus heraus öffne lautet die Meldung:

Access violation.

Press OK to ignore and risk data corruption.
Press Cancel to kill the program.

Das ist derselbe Fehler.

Weiß jemand, wo der Fehler liegt?

Ohne das jetzt getestet zu haben würde ich vermuten, dass entweder "hTest" oder "Edit1" nil ist. Fehlt da eine Initialisierung? Mein Turbo-Pascal-Wissen ist total eingerostet...

Ciao

robert

maeries

(Themenstarter)

Anmeldungsdatum:
16. April 2010

Beiträge: 449

rklm schrieb:

Fehlt da eine Initialisierung? Mein Turbo-Pascal-Wissen ist total eingerostet...

Das scheint es zu sein. Wenn ich in die Button1Click Procedure als ersten Befehl ein

htest := tUnit2.create; 

einfüge geht es. Allerdings erstelle ich dann doch bei jedem Klick eine neue Instanz, oder?

Ich meine mich daran zu erinnern, dass wir das in der Schule immer so gelöst haben

procedure TForm1.FormCreate(Sender: TObject);
  begin
    hTest := tUnit2.create;
  end;     

Das funktioniert aber nicht. Ich habe da mal eine Debuggermarkierung dran gemacht, aber die Procedure scheint gar nicht ausgeführt zu werden.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13213

maeries schrieb:

rklm schrieb:

Fehlt da eine Initialisierung? Mein Turbo-Pascal-Wissen ist total eingerostet...

Das scheint es zu sein. Wenn ich in die Button1Click Procedure als ersten Befehl ein

htest := tUnit2.create; 

einfüge geht es. Allerdings erstelle ich dann doch bei jedem Klick eine neue Instanz, oder?

Deswegen macht man das ja im Konstruktor.

Ciao

robert

maeries

(Themenstarter)

Anmeldungsdatum:
16. April 2010

Beiträge: 449

Jetzt hab ich's. Mein Ansatz mit

procedure TForm1.FormCreate(Sender: TObject);
  begin
    hTest := tUnit2.create;
  end;     

war schon richtig. Man muss nur vorher im Objektinspektor → Form1 → Ereignisse bei OnCreate auch FormCreate eintragen. Dann führt er die Procedure auch beim Erstellen der Form aus.

Antworten |