Aufruf neuer Typen in anderen Units
Einleitung:
Ich bin mit der Weile ein fortgeschrittener Anfänger. Zwar kann ich neue Methode, Variablen und Formen miteinander Verknüpfen, aber wenn ich manchmal meine Fehler sehe, lache ich später selbst darüber. Nun geht es darum, eine neue
Unit zu erstellen (schon geschehen) und einen neuen Typen zu kreieren. Ich kann darauf zugreifen, bekomme dennoch einen "SIGSEGV"-Error, einen Zugriffserror. Ich suche nach der Lösung seit 3 Tagen und arbeitete mich durch sämtliche Anleitungen, Themen, Foren und was es alles noch so gibt. Arbeiten tue ich mit Lazarus "0.9.30.2" und Win7 32bit.
Überblick:
Mein Projekt beinhaltet die Formen
Form1 vom Typ
TForm1 in
mainunit.lfm bzw.
mainunit.pas und
Form2 vom Typ
TForm2 in
image.lfm bzw.
image.pas. Außerdem beinhaltet mein Projekt die
Unit kennzeichen.pas in denen
TListe und
TDatensatz deklariert sind.
Problembeschreibung:
In meiner
mainunit.pas befindet sich
procedure TForm1.Search(SearchString: String);
, welche von einer anderen Prozedur in
mainunit.pas aufgerufen wird. Am Schluss des interface-Teils deklariere ich:
Delphi-Quellcode:
var
Form1: TForm1;
isGo: Boolean;
unsereListe: TListe;
Die Prozedur "Search" in
mainunit.passieht im "implementation"-Teil wie folgt aus:
Delphi-Quellcode:
procedure TForm1.Search(SearchString: String);
begin
if (Length(SearchString) <> 0) and (SearchString <> Last01.Caption) then
begin
Form1.Enabled := False;
StartProgressBar(25);
Wait(3);
ChangeLast(SearchString);
unsereListe := unsereListe.create;
unsereListe.dateieinlesen('kfz.csv', SearchString);
if unsereListe.NotA = false then
begin
Output2.Caption := unsereListe.liste[unsereListe.anzahl].kennzeichen;
Output4.Caption := unsereListe.liste[unsereListe.anzahl].ort;
Output6.Caption := unsereListe.liste[unsereListe.anzahl].bundesland;
Output8.Caption := unsereListe.liste[unsereListe.anzahl].sonder;
end;
while ProgressBar.Position <> 0 do Wait(2);
Form1.Enabled := True;
end;
end;
Durch das Durchsteppen mit F7 erfuhr ich, dass er wie befohlen
Delphi-Quellcode:
constructor TListe.create;
begin
anzahl := 0;
NotA := false;
end;
ohne Probleme durchläuft und erst bei
Delphi-Quellcode:
procedure TListe.dateieinlesen (datname, suchKFZ: STRING);
begin
try
datname := extractfilepath(ParamStr(0)) + 'lib\kfz.csv';
CompleteFile := TStringList.Create;
CompleteFile.LoadFromFile(datname);
...
finally
...
end;
end;
kläglich scheitert. Nach dem "SIGSEGV"-Error zeigt er mit die Zeile
CompleteFile := TStringList.Create;
an. Das heißt, er kommt erst gar nicht dazu,
CompleteFile.LoadFromFile(datname);
durchzuführen.
Ich habe mein Projekt auf
file-upload.net hochgeladen.
P.S.:
Während ich das Thema erstellt habe, fiel mir etwas auf. Ich verschob in
kennzeichen.pas CompleteFile := TStringList.Create;
in die
constructor TListe.create;
. Schon leif
dies ohne Probleme. Aber es stockte nun bei
CompleteFile.LoadFromFile(datname);
.
Mit freundlichen Grüßen
Caesar2012, der Moderne