![]() |
Bekomme einfach kein globales "Array of Record" hi
Habe schon einige Treads durchgelesen, bekomme es aber trotzdem nicht hin.
Delphi-Quellcode:
An der genannten Stelle, an der ich die Funktion Get dem auslesen zuweisen will, sagt er, Get und Profilspeicher sind inkompatible Typen.
TProfil = record
Name, Option1, Option2 : String; Wert: integer; end; Profilspeicher = Array[1..30] of TProfil; TSpeicher = class private FProfilspeicher: Profilspeicher; function Get(Index: Integer): string; procedure Put(Index: Integer; S: string); public property PProfilspeicher: Profilspeicher read Get; //Hier ist der aktuelle Fehler!! end; ... implementation function TForm13.Get(Index: Integer): string; procedure TForm13.Put(Index: Integer; S: string); Vermutlich mache ich nur wieder einen weiteren blöden Denkfehler, aber ich komme einfach nicht dahinter. Wenns total falsch ist, wie mache ich es dann? Mein Ziel ist es, ein allen Units zugängliches Array von einem Record zu erstellen... |
Re: Bekomme einfach kein globales "Array of Record"
Schau mal, was Get zurückgibt ;)
[edit] Übrigens: willst Du das ganze Array oder ein einzelnes Element zurückgeben? Das wird mir aus dem Code nicht klar. [/edit] [edit2] Schau mal hier: ![]() |
Re: Bekomme einfach kein globales "Array of Record"
Ich sags ja, wie immer zu blöd, sowas selber zu erkennen :D
Es soll letztendlich nur ein Element des Arrays übergeben werden, allerdings habe ich das momentan noch vernachlässigt, das kommt dann, wenn er beim Kompilieren keine Fehler mehr anzeigt... |
Re: Bekomme einfach kein globales "Array of Record"
Dann schau Dir meinen Link von oben in Ruhe an. Übrigens, wenn Du den Record auch noch in einer typisierten Datei speichern willst, solltest Du die Strings im Record als ShortStrings deklarieren, da sonst nur der Zeiger gespeichert wird und nicht der String selbst.
|
Re: Bekomme einfach kein globales "Array of Record"
Hier liegt ein besonderes Property vor; nämlich ein Array-Propery.
Delphi-Quellcode:
Am Besten du lässt zunächst die Methoden GetProfile und SetProfile weg und drückst dann STRG+C.
TProfil = record
Name, Option1, Option2 : String; Wert: integer; end; Profilspeicher = Array[1..30] of TProfil; TSpeicher = class private FProfile: Profilspeicher; function GetProfile(Index: Integer): TProfil; procedure SetProfile(Index: Integer; P:TProfil); public property Profile[Index:Integer]: TProfil read GetProfile write SetProfile; end; function TSpeicher.GetProfile(Index: Integer): TProfil; begin if (Index >= Low(FProfile)) and (Index<=High(FProfile)) then Result := FProfile[index] else raise ERangeError.Create('ungültiger Index TSpeicher.Profile['+IntToStr(Index)+']'); end; Delphi generiert dann automatisch dir richtigen Methodenrümpfe. |
Re: Bekomme einfach kein globales "Array of Record"
Muss da hinter die Property-Deklaration nicht noch ein default?
|
Re: Bekomme einfach kein globales "Array of Record"
Nein, muß nicht ... kann aber
bei einem Array-Property bedeutet das Default nur, daß man in der Klasse ohne den PropertyNamen auf das Array zugreifen kann. praktisch statt Speicher.Profile[i] nur Speicher[i] |
Re: Bekomme einfach kein globales "Array of Record"
Zitat:
Delphi-Quellcode:
var speicher : TSpeicher;
begin speicher.Profile[5] := ...; // normal speicher[5] := ...; // verkürzte Schreibweise mit default array property |
Re: Bekomme einfach kein globales "Array of Record"
Ich wusste doch, da war sowas :)
|
Re: Bekomme einfach kein globales "Array of Record"
Vielen Dank, funktioniert so weit, werde trotzdem noch ein wenig rumprobieren...
|
Re: Bekomme einfach kein globales "Array of Record"
Delphi-Quellcode:
Nochmal hierzu: Irgendwie habe ich noch einen Fehler drinnen:
TProfil = record
Name, Option1, Option2 : String; Wert: integer; end; Profilspeicher = Array[1..30] of TProfil; TSpeicher = class private FProfile: Profilspeicher; function GetProfile(Index: Integer): TProfil; procedure SetProfile(Index: Integer; P:TProfil); public property Profile[Index:Integer]: TProfil read GetProfile write SetProfile; end; function TSpeicher.GetProfile(Index: Integer): TProfil; begin if (Index >= Low(FProfile)) and (Index<=High(FProfile)) then Result := FProfile[index] else raise ERangeError.Create('ungültiger Index TSpeicher.Profile['+IntToStr(Index)+']'); end; Ich möchte jetzt aus einer anderen Funktion, die in der gleichen Unit liegt, das Profilspeicher-Arry füllen, allerdings bekomme ich beim Kompilieren Fehler. Was ich probiert habe: TSpeicher.FProfile[x] := Tempprofil; --> Auf Eigenschaft 'FProfile' kann hier nicht zugegriffen werden TSpeicher.PutProfile(x, TempProfil); --> Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt Was fehlt mir? Die Funktionen sind alle vollständig, korrekt zugewiesen, aber ich bekomms nicht hin, sie korrekt anzusteuern! |
Re: Bekomme einfach kein globales "Array of Record"
Delphi-Quellcode:
So müsste das doch funktionieren.
var Speicher: TSpeicher;
... Speicher := TSpeicher.Create; Speicher.Profile[1] := TempProfil; |
Re: Bekomme einfach kein globales "Array of Record"
Zitat:
Irgendwie habe ich das noch nicht nachvollziehen können. Anderes Beispiel: Ich will von einer anderen Unit aus "Array[Profilnummer].Name" auslesen. Was genau muss ich dazu machen? |
Re: Bekomme einfach kein globales "Array of Record"
Wenn die Variable des Typs TSpeicher erreichbar ist, im Prinzip wie oben.
Delphi-Quellcode:
ShowMessage(Speicher.Profile[1].Name);
|
Re: Bekomme einfach kein globales "Array of Record"
Zitat:
Wo sollte ich die Variable am besten deklarieren, wenn sie global verfügbar sein soll? |
Re: Bekomme einfach kein globales "Array of Record"
Ich mache so etwas meist als Formulareigenschaft.
|
Re: Bekomme einfach kein globales "Array of Record"
Dachte ich mir fast. Meine aktuelle Unit hat allerdings gar keine Form, d.h. ich mach mich mal ans kopieren in ne neue Unit...
:cheers: und nen schönen Abend noch! |
Re: Bekomme einfach kein globales "Array of Record"
:cheers: Dir auch
|
Re: Bekomme einfach kein globales "Array of Record"
Läuft immer noch nicht richtig. Beim Kompilieren läufts jetzt alles - dafür vielen Dank! - aber letztendlich gibts dann doch wieder Probleme.
Erstmal: (Ich habe aktuell alles in Public gelegt, das gehört natürlich letztendlich nicht so, halt zum probieren)
Delphi-Quellcode:
Was muss bei ??? hin, um die Länge vom dyn. Array Profilspeicher einzustellen?
TProfil = Record
... TSpeicher = class private public Profilspeicher: Array of TProfil; //Der echte Speicher function Get(Index: Integer): TProfil; procedure Put(Index: Integer; S: TProfil); property PProfilspeicher[index: integer]: TProfil read Get write put; end; TForm13 = class(TForm) private public Speicher : TSpeicher; end; [...] implementation procedure SetLength(Filename: string); begin setLength(???, 10); end; |
Re: Bekomme einfach kein globales "Array of Record"
??? = Profilspeicher
du willst ja wohl diesen ändern :zwinker: dieses SetLength gehört natürlich in eine Methode von TSpeicher aber du gehst da komplett falsch ran, denn so kannst du nur ganze TProfil auslesen und vorallem ändern Speicher.PProfilspeicher[i].Wert läßt sich zwar auslesen, aber nicht so setzen, da hier Get aufgerufen und der Record geholt würde, in welchem du zwar was ändern könntest, aber dieses wird danach dann wieder verworfen, da der Record nicht via Put zurückgespeichert würde. Es wird immer nur jeweils einwas Put oder Get von Delphi aufgerufen ... nicht Beides! PS: gehen würde es, wenn TProfil ein Object und kein Record wäre, da dort die Objekt-Variable und nicht das Objekt solber geliefert würde. (dort gibt es zwar kein PUT, aber das wäre nicht nötig, da ja direkt auf das Objekt zugegriffen würde und nicht auf eine Kopie, wie beim Record) So hast du zugriff auf alle Felder und kannst diese auch ändern
Delphi-Quellcode:
TProfil = record
Name, Option1, Option2 : String; Wert: integer; end; TSpeicher = class private FProfilspeicher: Array of TProfil; FObjektspeicher: Array of TObject; function GetName(Index: Integer): TProfil; procedure PutName(Index: Integer; S: TProfil); ... procedure PutOption1(Index: Integer; S: TProfil); public Function Add(...): Integer; // Result ist dann der Index des Erstellten Procedure Delete(Index: Integer); property Name [index: integer]: String read GetName write PutName; property Option1[index: integer]: String read GetOption1 write PutOption1; property Option2[index: integer]: String read GetOption2 write PutOption2; property Wert [index: integer]: integer read GetWert write PutWert; property Objekt [index: integer]: TObject read GetObject; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz