Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Felder in Klassen über Variable ansprechen (https://www.delphipraxis.net/147661-felder-klassen-ueber-variable-ansprechen.html)

RWarnecke 13. Feb 2010 13:30


Felder in Klassen über Variable ansprechen
 
Hallo zusammen,

ich habe eine Klasse mit mehreren Feldern. Davon haben 10 Stück den Namen UM1...UM5...UM10. Wie kann ich diese Felder über eine Schleife ansprechen ?

Namenloser 13. Feb 2010 13:31

Re: Felder in Klassen über Variable ansprechen
 
Warum nimmst du kein Array? :gruebel:

s.h.a.r.k 13. Feb 2010 13:47

Re: Felder in Klassen über Variable ansprechen
 
RTTI wäre hier ein Stichwort. Aber du hast Delphi 2oo6 und da habe ich leider keinerlei Ahnung, wie viel Unterstützung das integriert hat.

Oder du machst es, wie NamenLozer erwähnt hat. Oder du definierst eine get- und set-Methode, der du einen Index und einen Wert übergeben kannst, quasi eine passende Mapper-Methode. Somit kannst du nach außen hin aber trotzdem deine Properties belassen.

RWarnecke 13. Feb 2010 13:58

Re: Felder in Klassen über Variable ansprechen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von NamenLozer
Warum nimmst du kein Array? :gruebel:

Ich habe die im Anhang angehängte Tabelle in einer ObjectListe mit Klasse gespeichert. Dabei ist für jeden Monat ein Eintrag in der ObjectListe. Wenn ich jetzt ein Array benutzen wollte, muss ich den ganzen anderen Kram, der zu der Tabelle schon steht umschreiben und das wollte ich vermeiden.

mkinzler 13. Feb 2010 14:02

Re: Felder in Klassen über Variable ansprechen
 
Wenn du eine Objektliste benutzt ist das doch noch einfacher. :gruebel:
Sonst beliebt dir halt nur .FindComponent()

mjustin 13. Feb 2010 14:04

Re: Felder in Klassen über Variable ansprechen
 
Zitat:

Zitat von RWarnecke
Hallo zusammen,

ich habe eine Klasse mit mehreren Feldern. Davon haben 10 Stück den Namen UM1...UM5...UM10. Wie kann ich diese Felder über eine Schleife ansprechen ?

TypInfo.pas bietet dazu einige Möglichkeiten:

Delphi-Quellcode:
  { Get info record for property }
  PropInfo := GetPropInfo(MyObject.ClassInfo, PropertyName);

  if Assigned(PropInfo) then
    SetStrProp(MyObject, PropInfo, Value);

Die fortlaufenden Namen der Property kann man dann durch Stringoperationen zusammenbauen.

Die Klasse muss mit {$M+} kompiliert sein und die Properties müssen public sein.

Viele Grüße,

himitsu 13. Feb 2010 14:05

Re: Felder in Klassen über Variable ansprechen
 
Zitat:

Zitat von NamenLozer
Warum nimmst du kein Array? :gruebel:

Jupp, ein Array-Property wäre hier angebracht.

Delphi-Quellcode:
myclass = class
  property UM[i: Integer]: ...

sx2008 13. Feb 2010 14:40

Re: Felder in Klassen über Variable ansprechen
 
Arrays können auch virtuell sein, d.h. für den Programmierer als Anwender sieht es wie ein Array aus, ist aber keines.
Hier ein Beispiel zur Anregung der grauen Zellen
Delphi-Quellcode:
funtion TForm1.GetUmsatz(jahr, Monat:integer):Currency;
begin
   // liefert den Umsatz für ein best. Jahr und Monat zurück
end;

function TForm1.GetJahresUmsatz(jahr:integer):Currency;
var i : integer;
begin
  Result := 0.0;
  for i := 1 to 12 do
    Result := Result + GetUmsatz(jahr, i);
end;
GetUmsatz() ist eine Methode; verhält sich aber zumindest lesend ähnlich wie ein Array.
Und ob man runde Klammern oder eckige Klammer schreibt macht logisch keinen Unterschied.

Frage: warum hast du nur UM1 bis UM10, wenn es doch offensichtlich um Umsätze geht und ein Jahr 12 Monate hat?

himitsu 13. Feb 2010 14:52

Re: Felder in Klassen über Variable ansprechen
 
Zitat:

Zitat von sx2008
Und ob man runde Klammern oder eckige Klammer schreibt macht logisch keinen Unterschied.

Diese Funktionen als Getter für ein Array-Property und schon hat man eckige Klammern. :angel:

freak4fun 13. Feb 2010 16:05

Re: Felder in Klassen über Variable ansprechen
 
Bei TList kann man sich ja anschauen wie das gemacht wurde. Da wir dann mit sowas gearbeitet:
Delphi-Quellcode:
function TList.Get(Index: Integer): Pointer;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 Uhr.
Seite 1 von 2  1 2      

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