Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Variable über zusammengesetzte Strings ansprechen (https://www.delphipraxis.net/92566-variable-ueber-zusammengesetzte-strings-ansprechen.html)

hirnstroem 22. Mai 2007 12:08


Variable über zusammengesetzte Strings ansprechen
 
'loha Folks,

in einem Projekt befindet sich ein Unit in welchem ein Paar Konstanten definiert werden:

Delphi-Quellcode:
const
  HWV_DI = 'DI';
  HWV_GPI = 'GPI';
Gibt es eine möglichkeit diese nun ähnlich wie mit der FindComponent Routine zu suchen? Es ist nämlich so, dass der "Stamm" der Konstanten stets gleichbleibt und lediglich das Ende unterschiedlich ist. Desweiteren werden künftig immer mehr Konstanten mit demselben "Stamm" dazukommen und genau diese möchte ich "dynamisch" ansprechen können, wenn das geht, irgendwie -.-

Grüsse
hirnstroem

mischerr 22. Mai 2007 12:26

Re: Variable über zusammengesetzte Strings ansprechen
 
Ist mir nicht bekannt und kann mir auch nicht vorstellen dass das so funktioniert.

Ich würde mir ein konstantes Array definieren und dieses dann durchsuchen. Oder eine Client-Datenmenge, oder eine Klasse erstellen, ähnlich wie..

Delphi-Quellcode:
TMyClass = class
  VarName : string;
  VarValue: integer;
end;
..dann eine TList und dort die ganzen Typen im initialization-Abschnitt der unit registrieren. Dann noch eine Funktion, die den gesuchten Typ aus der jeweils gewählten Datenmenge liefert, ähnlich wie..

Delphi-Quellcode:
function GetConst(const AName: string): string;
..und fertig. Der Ordnung halber bei Verwendung der Klasse+TList aber nicht vergessen, die Liste im finialization Abschnitt wieder zu freen. Aber viele Wege führen nach Rom...

Codewalker 22. Mai 2007 12:27

Re: Variable über zusammengesetzte Strings ansprechen
 
Wäre aber eine nette Funktion die man sich in Delphi durchaus wünschen würde, Variablen und Konstanten per String-Namen anzusprechen. Kann man das nicht irgendwo vorschlagen? Oder vielleicht liest das ja jemand mit nem guten Draht zu CodeGear :mrgreen:

fLaSh11 22. Mai 2007 12:33

Re: Variable über zusammengesetzte Strings ansprechen
 
Mach doch einfach ne Liste aus den Konstanten.
Code:
const1=asdf;
const2=fdsa;
...
und dann such die Konstante in der Liste und hol den Wert raus.

Apollonius 22. Mai 2007 13:29

Re: Variable über zusammengesetzte Strings ansprechen
 
Was haltet ihr von einer Stringlist (als Speicherung für die Variablen). Wenn man da mit Names und Values arbeitet, ist ein Zugriff über Strings möglich.

SirThornberry 22. Mai 2007 13:38

Re: Variable über zusammengesetzte Strings ansprechen
 
Das vorhaben ist nicht möglich da Variablennamen und Constantennamen in der kompilierten Exe/Dll etc. nicht mehr vorhanden sind.
Die gewünschte parallele zu FindComponent hingt auch. Denn FindComponent sucht nicht eine Variable mit einem bestimmtem Namen sondern geht alle Komponenten durch und vergleicht das Property "Name". Und zufällig ist dieses Property immer gleich mit dem Variablennamen aber eben auch nur so lange wie man die Komponenten per IDE auf das Form setzt.

Apollonius 22. Mai 2007 13:41

Re: Variable über zusammengesetzte Strings ansprechen
 
Stimmt, als echte Variablen geht es nicht, wie man auch sehr schön im Assemblercode sieht, wo dann nur noch Adressen auftauchen. Dennoch kann man das Verhalten von Findcomponent nachbilden, und da die Stinglist es unterstützt muss man nix mehr selber machen.

SirThornberry 22. Mai 2007 13:45

Re: Variable über zusammengesetzte Strings ansprechen
 
genau, das Verhalten von FindComponent kann man recht einfach nachbilden. Es muss eben einem nur bewusst sein das Variablennamen im compilat nicht mehr existent sind und man somit alle Namen als Daten hinterlegen muss (z.B.: in einer Stringlist)

QuickAndDirty 22. Mai 2007 13:53

Re: Variable über zusammengesetzte Strings ansprechen
 
Delphi-Quellcode:
TNamen = (Hans,Peter, Uwe, Otto);
Const AdresseVon : array[TNamen] of String = ('Wilhelmstrasse', 'Otterweg', 'Pupsweg', 'Blödweg');
Const Namen: array[TNamen] of String = ('Hans','Peter','Uwe','Otto');

Function FindConst(aString:tString):tname;
var i:integer;
    gefunden:boolean;
begin
  gefunden := false
  For i := integer(Hans) to integer(otto) do
  Begin
    if namen[tnamen(i)] = astring then
    Begin
      gefunden := true;
      result := tnamen(i);
      break;
    end;
  end;
  if not gefunden then
    Raise Exception.create('Dumme sache');
end;

Sowas ungefähr könnte gehen

Apollonius 22. Mai 2007 13:56

Re: Variable über zusammengesetzte Strings ansprechen
 
Damit gewinnt man nichts, da man die Namen nicht wie gewünscht zusammensetzen kann.

Corelgott 22. Mai 2007 14:24

Re: Variable über zusammengesetzte Strings ansprechen
 
hi,

ist vll ein doofer ansatz, aber zumindest habe ich das problem bei mir so gelöst:

mach ein objekt, welches keine vars enthält und schreibe für die constanten ne kleine wrapper funktion
dann packst du um alles properties...

also
Delphi-Quellcode:
property foobar : String read FFoobar write FFoobar
bzw. machst das gerade über ne getter setter funk (zuverlässiger)

Delphi-Quellcode:
procedure setFoobar(const Value : String);
function getFoobar() : String;
finden kannst du die dann per String! und das auch per laufzeit!

Delphi-Quellcode:
function eval(methName : String; obj : TObject) : TMethod;
begin
  result.Data := obj;
  result.Code := obj.MethodAddress(methName);
end;
must der funk den namen der procedure angeben und das Obj dem diese gehört...

der einzige harken / knackpunkt:
Die funktionen nutzt delphi normalerweise um den objektinspektor zu befüllen. Es geht nur wenn die properties / methoden published (public reicht nicht!) sind

vll hilft das ja...

cya

Corelgott

Die Muhkuh 22. Mai 2007 14:43

Re: Variable über zusammengesetzte Strings ansprechen
 
Zitat:

Zitat von Apollonius
Damit gewinnt man nichts, da man die Namen nicht wie gewünscht zusammensetzen kann.

Ach, erzähl doch kein Quark, wenn ich die Funktion so aufrufe:

Delphi-Quellcode:
myconst := FindConst('Ha' + 'ns');
kann ich die Namen ja auch zusammensetzen...

Apollonius 22. Mai 2007 14:50

Re: Variable über zusammengesetzte Strings ansprechen
 
Das geht? Ehrlich? Wieder mal was gelernt, ich wusste gar ncht, dass man sowas mit Aufzählungstypen machen kann.

Die Muhkuh 22. Mai 2007 14:52

Re: Variable über zusammengesetzte Strings ansprechen
 
Zitat:

Zitat von Apollonius
Das geht? Ehrlich? Wieder mal was gelernt, ich wusste gar ncht, dass man sowas mit Aufzählungstypen machen kann.

Du hast Dir einfach nur die Funktion nicht richtig angesehen oder Du hast nicht ganz verstanden, was die Funktion macht ;-)

Apollonius 22. Mai 2007 15:02

Re: Variable über zusammengesetzte Strings ansprechen
 
:oops: Wer Augen hat zum sehen, der sehe!

volkerw 22. Mai 2007 15:40

Re: Variable über zusammengesetzte Strings ansprechen
 
Hallo,

ideal wäre hier wohl ein Hash, wie z.B. von Perl bekannt (ein Array, dessen Index ein String ist).
Google sollte einiges dazu liefern, z.B. das hier: www.opengl24.de

Gruß Volker

Apollonius 22. Mai 2007 16:08

Re: Variable über zusammengesetzte Strings ansprechen
 
Eine Stringlist kann als assoziatives Stringarray verwendet werden, wie schon 3mal beschrieben.

DGL-luke 22. Mai 2007 16:17

Re: Variable über zusammengesetzte Strings ansprechen
 
Zitat:

Zitat von Codewalker
Wäre aber eine nette Funktion die man sich in Delphi durchaus wünschen würde, Variablen und Konstanten per String-Namen anzusprechen. Kann man das nicht irgendwo vorschlagen? Oder vielleicht liest das ja jemand mit nem guten Draht zu CodeGear :mrgreen:

Nein. Das widerspricht der Typisierung. Und man kann sich genügend Datenstrukturen bauen (Bäume, Dictionaries, Hashmaps, um einige zu nennen), mit denen man einen Zugriff per String-Index realisieren kann.


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