Autor Beitrag
awzvm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Do 23.04.09 09:50 
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:
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: 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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
awzvm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Do 23.04.09 14:36 
Also sollte ich nur New verwenden und lieber nie dispose?
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Do 23.04.09 14:47 
weder new noch dispose, denn du willst ja keinen Neuen Speicher, sondern die Vorhandene Variable benutzen.
awzvm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: 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.