AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi class property : array of Record (Felder ansprechen)
Thema durchsuchen
Ansicht
Themen-Optionen

class property : array of Record (Felder ansprechen)

Ein Thema von Satty67 · begonnen am 27. Mär 2009 · letzter Beitrag vom 30. Mär 2009
Antwort Antwort
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#1

class property : array of Record (Felder ansprechen)

  Alt 27. Mär 2009, 17:14
Hallo,

angeregt durch einen andere Thread versuche ich mich gerade an Array-Propertys. Mit Array of Standard-Type funktioniert das. Auch mit Array of MyRecord, aber dort würde ich gerne gleich auf die Record-Felder zugreifen.

Leider hört es bei mir auf, wenn es sich Standard-Deklarationen in Klassen entfernt.
Delphi-Quellcode:
type
  TMyRecord = record
    name : String;
    value : Integer;
  end;

  TMyArray = array of TMyRecord;

  LittleTestList = class(TObject)
  private
    FItems : TMyArray;
    function GetItem(index: Integer): TMyRecord;
    procedure SetItem(index: Integer; const Value: TMyRecord);
  public
    property Items[index: Integer]: TMyRecord read GetItem write SetItem; default;
  end;

[...]

procedure TForm1.Button1Click(Sender: TObject);
var
  aRecord : TMyRecord;
begin
  LittleTestList.Items[1] := aRecord; // OK
  LittleTestList[1] := aRecord; // OK

  LittleTestList.Items[1].name := aRecord.name; // Linken Seite kann nichts zugewiesen werden
end;
Wie muss ich das angehen, um direkt auf das Feld innerhalb des deklarierten Record's zugreifen zu können?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: class property : array of Record (Felder ansprechen)

  Alt 27. Mär 2009, 17:16
Denk mal nach. Wie sollte Delphi das umsetzen? Weder durch GetItem noch durch SetItem kann dieses Verhalten implementiert werden. Du kannst das Problem umgehen, indem du entweder Zeiger oder Klassen verwendest.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#3

Re: class property : array of Record (Felder ansprechen)

  Alt 27. Mär 2009, 17:27
Danke für die schnelle Antwort.

Sah zumindest vielversprechend aus, da er die Record-Felder in der Auto-Vervollständigung angeboten hatte. Gut dann löse ich die Felder in einzelne propertys auf... dachte ich könnte hier eine Vereinfachung erzwingen.

Wenn es zuviel wird, wird wohl eine Klasse für MyRecord interessant werden. Damit experimentiere ich gleich mal...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#4

Re: class property : array of Record (Felder ansprechen)

  Alt 27. Mär 2009, 17:31
du erstellst doch in GetItem eine Kopie des Records
und diese Kopie ist dann in Result (einer delhpiinternen Variable) enthalten.

und selbst wenn du hier Links was zuweisen könntest, dann würde nur die Kopie geändert, aber nicht das Original.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

Re: class property : array of Record (Felder ansprechen)

  Alt 27. Mär 2009, 17:44
Hallo Zusammen,

ich denke das Problem liegt in SetItem. Da hier nur ein vollständiger Record übergeben wird müßte sozusagen ein zwischenschritt eingebaut werden:

Setitemfeld(i,feld)
rec:=Getitem(i);
rec.Feld:=feld;
setitem(i,rec)

so ungefähr.
rec wäre dann eine (zu setitemfeld) lokale variable in die man problemlos feldinhalte einbringen kann.
Danach wird dann (wie üblich) ein vollständiger Record wieder weggeschrieben.

Ist nicht getestet und wahrscheinlich nicht oop, aber vielleicht eine Idee.

Gruß
K-H
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#6

Re: class property : array of Record (Felder ansprechen)

  Alt 27. Mär 2009, 17:50
Ja GetItem ist nicht das Problem
  aRecord.name := LittleTestList.Items[1].name; das funktioniert.

Aber sehe schon was da falsch läuft... (Dank p80286s Ausführung)

Bei SetItem wird der Record übergeben. Wenn ich nur ein Feld zuweise, dann könnte Delphi SetItem nur einen unvollständigen Record übergeben. SetItem wüsste auch nie, welches Feld jetzt einen gültigen Wert enthält.

PS: Im Speicher liegt noch ein kompletter 80286 mit Hercules Grafikkarte und MFM Festplatte

PS:
Werde es ähnlich wie bei einer StringList lösen.
procedure Add(Name:String, Int:Integer) und Insert(Index:Integer, Name:String, Int:Integer) zum Schreiben.
Da Lesen funktioniert, kann ich mir so eine lokale Variable vom Typ TMyRecord sparen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#7

Re: class property : array of Record (Felder ansprechen)

  Alt 27. Mär 2009, 19:18
das Problem ist hier
LittleTestList.Items[1].Name := xyz; Delphi macht daraus
LittleTestList.GetItem(1).Name für eine Zuweisung müßte es aber dieses machen
Delphi-Quellcode:
TMyRecord(Temp) := LittleTestList.GetItem(1);
Temp.Name := xyz;
LittleTestList.SetItem(1, Temp);
und das macht es halt nicht ... wenn sowas man in Delphi eingebaut würde, dann könnte man Properties auch als "Var"-Parameter nutzen

Delphi-Quellcode:
MyFunction({var} LittleTestList.Items[1]);

// müßte zu dem werden

TMyRecord(Temp) := LittleTestList.GetItem(1);
MyFunction(Temp);
LittleTestList.SetItem(1, Temp);

// Delphi kennt aber nur diese Variante

TMyRecord(Temp) := LittleTestList.GetItem(1);
MyFunction(Temp);
// also sozusagen nur MyFunction(LittleTestList.GetItem(1));
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#8

Re: class property : array of Record (Felder ansprechen)

  Alt 28. Mär 2009, 10:46
Hallo,

musst du denn unbedingt eine Property verwenden? der Direktzugriff sollte ja funktionieren:

  LittleTestList.FItems[1].name := aRecord.name; // Linken Seite kann nichts zugewiesen werden - DOCH Dazu musst du natürlich FItems als public definieren.

Ich weiss, dass das kein soo sauberer OO-Stil ist und dass einige Möglichkeiten durch Setter/Getter wegfallen, aber wenns denn funktioniert...

Gruss Reinhard
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#9

Re: class property : array of Record (Felder ansprechen)

  Alt 28. Mär 2009, 17:38
Der direkte Zugriff (auch als property) funktioniert natürlich.

Nur wollte ich schauen, was mit der Variante array-property... mit der netten Zusatz-Eigenschaft "default"... so alles anzustellen ist.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

Re: class property : array of Record (Felder ansprechen)

  Alt 30. Mär 2009, 08:40
Hallo zusammen,

ich hab mir das alles nocheinmal durch den Kopf gehen lassen.
Der Vorschlag von Reinhard geht ja auch etwas OOPlischer:

..
myrecord : TMyrecord read xxxxx write FMyRecord;
...

FMyrecord : TMyrecord;

Wobei die eigentliche Variable (FMyrecord) immer noch gekapselt wäre. Da der schreibende Zugriff direkt erfolgt, können die einzelnen Record.Felder auch einzeln adressiert werden. Der lesende Zugriff (xxxxx) kann immer noch über eine Funktion erfolgen.

(Borland hat es auch so gemacht, und es funktioniert!)

Gruß
K-H
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz