Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Zeiger von Funktion erhalten und damit arbeiten?
awzvm - Do 23.04.09 09:50
Titel: Zeiger von Funktion erhalten und damit arbeiten?
Hallo Zusammen,
ich habe einen eigenen Record-Typ TKatalog angelegt.
Global gibt es viele verschiedene Variablen vom Typ TKatalog.
Nun möchte ich in einer Prozedur eine Funktion aufrufen, welche mir den Zeiger auf den jeweiligen richtigen Katalog gibt.
ZB: Katalog:=TranslateKatalog(ComboBox_Kataloge1)
Diesen zurückgelieferten Katalog (Zeiger) möchte ich dann an eine weitere Prozedur übergeben, welchen den Katalog bearbeitet:
zB: ReadCSVKatalog(Dateiname,Katalog,Pfad,'','');
Aber so geht es leider nicht. Es werden hier wohl auch nicht die Zeiger übergeben.
Wie müsste diese Prozedur und die Funktion oder deren Aufrufe richtig aussehen?
Vielen Dank.
Bisheriger fehlerhafter Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| unit Unit1;
interface
uses ....
type TZeile = record Spalte: array [0..55] of string; end;
type TKatalog = record Dateiname: String; Zeile: array of TZeile; end; ... var Datenerfassung_Person,Datenerfassung_Test: TKatalog;
implementation
function TMain.TranslateKatalog(Name:string; zahl:integer):TKatalog; var: Katalog:=TKatalog; begin If Name='Datenerfassung Person' then Katalog:=Datenerfassung_Person;
TranslateKatalog:=Katalog; end;
procedure TMain.ReadCSVKatalog(Dateiname: String; var Katalog: TKatalog; Pfad: String; test2: String; test3: String); begin
end;
procedure TMain.SpeedButton_Katalog_ImportClick(Sender: TObject); var Datei:Textfile; Pfad,Dateiname:string; Katalog:TKatalog; begin
Pfad := ExtractFileDir(OpenDialog_V.FileName) + '\'; Dateiname := ExtractFileName(OpenDialog_V.FileName); Katalog:= TranslateKatalog('Datenerfassung Person');
ReadCSVKatalog(Dateiname,Katalog,Pfad,'',''); end; |
jaenicke - Do 23.04.09 09:58
Wenn du mit einem Record arbeitest, dann musst du (anders als bei Klassen) auch wirklich explizit Pointer verwenden...
Im Moment verwendest du
keine Pointer.
Delphi-Quelltext
1: 2: 3: 4: 5:
| TKatalog = record Dateiname: String; Zeile: array of TZeile; end; PKatalog = ^TKatalog; |
Und dann musst du PKatalog verwenden.
awzvm - Do 23.04.09 14:23
Hallo Jaenicke,
danke für den schnellen Tipp ;-)
Habe meine Prozedur nun mit dem Pointer versehen. Es funktioniert auch teilweise.
Allerdings kann ich nach dem Dispose () nicht mehr auf meine ursprüngliche Variable zugreifen. Warum?
Wie muss ich vorgehen, damit ich ohne Zugriffsverletzung dann auf meine normale Variable zugreifen kann?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TMain.SpeedButton_Katalog_ImportClick(Sender: TObject); var Datei:Textfile; Pfad,Dateiname:string; PKatalog:PointerKatalog; begin
Pfad := ExtractFileDir(OpenDialog_V.FileName) + '\'; Dateiname := ExtractFileName(OpenDialog_V.FileName);
PKatalog:=nil; New(PKatalog);
PKatalog:=@Datenerfassung_Person;
ReadCSVKatalog(Dateiname,PKatalog,Pfad,'','');
ShowMessage(PKatalog.Dateiname); ShowMessage(Datenerfassung_Person.Dateiname);
Dispose(PKatalog);
ShowMessage(Datenerfassung_Person.Dateiname); |
Schon vielen Dank!
LG
awzvm
BenBE - Do 23.04.09 14:35
Dispose gibt den Speicher, der dem Zeiger zugeordnet ist frei ... Damit werden auch die dort vorhandenen Daten finalisiert und nach /dev/null verschoben ...
awzvm - Do 23.04.09 14:36
Also sollte ich nur New verwenden und lieber nie dispose?
Boldar - Do 23.04.09 14:47
weder new noch dispose, denn du willst ja keinen Neuen Speicher, sondern die Vorhandene Variable benutzen.
awzvm - Do 23.04.09 15:22
Ihr habt alle vollkommen recht.
Ich nutze meine Variable ohne new und dispose und geb' ihr jeweils die Adresse meines Typs mit.
Super, die Prozeduren und Funktionen laufen ohne Fehler.
Ein recht herzliches "Danke schön" an euch.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!