Autor Beitrag
hkk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 64

Win XP Pro, Win ME, openSUSE 10.2, Ubuntu 7.xx; Firefox 2 (en-US)
D7 Pers, D3 Prof
BeitragVerfasst: Mi 15.08.07 22:24 
Hallo,

gibt es eine möglichkeit, variablen dynamisch durch ihren namen anzusprechen? also z.b. GetVarByName('testvar')

denn ich lese verschieden werte aus konfigurationsdateien (XML) aus, die aber nicht alle vorhanden sein müssen. damit könnte ich das ganze halt iel kompakter als schleifen schreiben und muss nich jeden namen abfragen.

es wäre zwar auch möglich, dies auf dynamische arrays umzulagern, aber mit den variablen wäre es viel einfacher zu verwenden ( aus meiner sicht)


danke schon mal
~HKK
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 15.08.07 23:46 
Moin!

user profile iconhkk hat folgendes geschrieben:
gibt es eine möglichkeit, variablen dynamisch durch ihren namen anzusprechen? also z.b. GetVarByName('testvar')

Nein, denn Delphi ist eine Compilersprache, der Name einer Variablen ist nur zur Entwurfszeit bekannt und geht beim Compilieren "verloren" (da er im ausführbaren Code nicht mehr benötigt wird).

Evtl. eine Alternative: Nimm eine TStringList, über die Eigenschaften .Values[]und .Names[]kannst du sowas "nachbauen", allerdings mit hohem Aufwand für die Konvertierungen (wobei du die Werte eh als Strings im XML-File hast, von daher... :nixweiss:). :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
hkk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 64

Win XP Pro, Win ME, openSUSE 10.2, Ubuntu 7.xx; Firefox 2 (en-US)
D7 Pers, D3 Prof
BeitragVerfasst: Mi 15.08.07 23:59 
joa,
das habe ich mir schon gedacht. danke aber für die antwort.

da sich die anzahl/verwendung der variablen im verlauf des programms nicht verändert, sondern ich das nur beim laden verwenden wollte, mach ich ein statisches array daraus und konstanten mit den entsprechenden indices.

so kann ich die daten bereits vorher konvertieren und muss nur beim aufruf ein wenig mehr tippen ^^

nochmal danke trotzdem
~HKK
Critter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: Do 16.08.07 10:47 
Hallo,
user profile iconhkk hat folgendes geschrieben:
da sich die anzahl/verwendung der variablen im verlauf des programms nicht verändert, sondern ich das nur beim laden verwenden wollte, mach ich ein statisches array daraus und konstanten mit den entsprechenden indices.

mit einem Aufzählungstypen als Arrayindes könnte es etwas weniger Tipparbeit werden:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
   tMyNames = (mnFeld1, mnFeld2);
   tMyVars = array[tMyNames] of string;
{...}
procedure MyFunc;
   var
      Felder : tMyVars;
begin
   Felder[mnFeld1] := 'Hallo';
   Felder[mnFeld2] := 'Welt!';
end;


Critter
hkk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 64

Win XP Pro, Win ME, openSUSE 10.2, Ubuntu 7.xx; Firefox 2 (en-US)
D7 Pers, D3 Prof
BeitragVerfasst: Fr 17.08.07 12:54 
user profile iconCritter hat folgendes geschrieben:

mit einem Aufzählungstypen als Arrayindes könnte es etwas weniger Tipparbeit werden:


danke für den rat, aber da ich das ganze aus einer datei auslese, muss ich das ganze mit strings ansprechen können.

im endeffekt werde ich das dann so machen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
const
  Names: Array [0..4of String =
    ('colorA''colorB''colorFont''colorBig''colorHigh');

var
  vars: Array [0..4of TColor;

function GetIndexByName(Name: String): Integer;
var
  i: Integer;
begin
  Result := -1;
  for i := 0 to 4 do
    if (Name = Names[i]) then
    begin
      Result := i;
      Exit;
    end;
end;


aufgerufen wird das ganze dann beim aufruf in etwa so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  i: Integer;
begin
  for i := 0 to XML.Root.SubItemsCount - 1 do
    vars[GetIndexByName(XML.Root.SubItems[i].Name)] := XML.Root.SubItems[i].Params.Values['color'];
end;


dies ist jedoch nur ein schneller prototyp denn ich hier nur schnell herskizziert hab. wenn das ganze eingebaut ist, werde ich diesen post mit den relevanten aufrufen und definitionen/deklarationen aktualisieren und wenn das projekt lauffähig ist, kommts in die opensource projekte rein ^^


danke trotzdem für die posts!
~HKK