Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Zugriff auf Variablen / Klassenstruktur (https://www.delphipraxis.net/188788-zugriff-auf-variablen-klassenstruktur.html)

lance2403 7. Apr 2016 10:29

Zugriff auf Variablen / Klassenstruktur
 
Hallo,
gibt es eine Möglichkeit auf Variablen per Namen und per Index zuzugreifen?

Zum Hintergrund:
Ich möchte viele Werte aus einem Controller per RS232 auslesen. Das ganze funktioniert bereits nur leider nicht objektorientiert.

Pro Wert sind Adresse, Typ, und Namen vorgegeben.
Entsprechend dem Typ (unsigned 16Bit, string[16], signed 32Bit) ergibt sich eine Anzahl von Bytes die ich von der Adresse beginnend lese.

Benutze ich ein
Delphi-Quellcode:
property WerteArray [index: integer]: TValue;
so kann ich auf die Werte per Index zugreifen.
Um den Code lesbarer zu gestalten möchte ich die Werte aber auch gerne per Namen ansprechen.
Dazu müsste ich dann jedem einzelnen Wert ein property spendieren.

Ich suche nun die Kombination aus beiden da ich sich um rund 250 Werte handelt und der Zugriff per Index weniger Schreibaufwand bedeutet.

Lemmy 7. Apr 2016 10:55

AW: Zugriff auf Variablen / Klassenstruktur
 
Hallo,

schau mal hier:
http://docwiki.embarcadero.com/RADSt.../Eigenschaften

unter Indexbezeichner (ca. in der Mitte) Meinst du so was?

GRüße

Fritzew 7. Apr 2016 10:56

AW: Zugriff auf Variablen / Klassenstruktur
 
Kannst du zeigen in welcher art Struktur die Daten vorliegen?
Als Deinen internen Datentyp in der Klasse?

Der schöne Günther 7. Apr 2016 11:01

AW: Zugriff auf Variablen / Klassenstruktur
 
Zitat:

Zitat von lance2403 (Beitrag 1334886)
Um den Code lesbarer zu gestalten möchte ich die Werte aber auch gerne per Namen ansprechen.

Ich verstehe das Problem nicht ganz.

Du hast bisher
Delphi-Quellcode:
gesuchterWert := meinGedöns.WerteArray[215];
In zwei Wochen weiß niemand mehr was denn die 215 bezeichnet.

Es reicht doch eigentlich völlig aus, sich einmal in einer .pas-Datei die Indizes lesbar aufzuschreiben:

Delphi-Quellcode:
unit werteArrayIndex;

interface

const
   indexTemperature   =   215;
   indexAirPressure   =   216;
implementation

end.
und in deinem Code fortan zu sagen

Delphi-Quellcode:
gesuchterWert := meinGedöns.WerteArray[indexTemperature];

Mir würde das locker reichen.


Klar kannst du auch mit String-Indizes arbeiten und sagen

Delphi-Quellcode:
gesuchterWert := meinGedöns.WerteArray['Temperatur'];
Aber dadurch hat man doch im Endeffekt nichts gewonnen und es nur fehleranfälliger gemacht.

geskill 7. Apr 2016 11:35

AW: Zugriff auf Variablen / Klassenstruktur
 
Meinst du sowas:

Delphi-Quellcode:
type
  TMyClass = class

  protected
    function GetWerteArray(const IndexOrName: OleVariant): TValue;
  public
    function FindValue(const AName: string): TValue;

    property WerteArray[const IndexOrName: OleVariant]: TValue read GetWerteArray;
  end;

// ...

function TMyClass.GetWerteArray(const IndexOrName: OleVariant): TValue;
begin
  Result := nil;

  if not VarIsNull(IndexOrName) then
  begin
    if VarIsNumeric(IndexOrName) then
      Result := FList[IndexOrName]
    else
      Result := FindControl(IndexOrName);
  end;
end;

function TMyClass.FindValue(const AName: string): TValue;
var
  LIndex: Integer;
begin
  Result := nil;

  for LIndex := 0 to FList.Count - 1 do
  begin
    // ... TODO
  end;
end;

Bjoerk 7. Apr 2016 11:36

AW: Zugriff auf Variablen / Klassenstruktur
 
Suche den Eintrag ggf. besser mit IndexOf. Du kannst auch eine Property vom Typ string indizieren die das macht.
Delphi-Quellcode:
    property ItemsByName[Name: string]: TValue read GetItemsByName;

..

function TValues.GetItemsByName(Name: string): TValue;
var
  Index: integer;
begin
  Index := IndexOfName(Name);
  if Index > -1 then
    Result := FItems[Index]
  else
    Result.Clear; // falls TValue eine Klasse ist: Result := nil;
end;

lance2403 7. Apr 2016 12:26

AW: Zugriff auf Variablen / Klassenstruktur
 
Sry war grad beim Mittag.
Vielen Dank für die Tipps und Anregungen.:-D

@Günther: Das scheint vorerst die einfachste Lösung für mein Problem zu sein.

Die Varianten von geskill und Bjoerk dürften ebenfalls funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:28 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