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..55of 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: Stringvar Katalog: TKatalog; Pfad: String; test2: String; test3: String);
begin
//Katalog wird bearbeitet

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);

  //Hier kommt eine Zugriffsverletzung :-(
  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.