Wyszukiwanie zmiennych

0

Mam pewno pytanie. Czy da sie jakos odwolac do zmiennej poprzez proste wyszukanie jej nazwy?
W moim przypadku to wyglada mniej wiecej tak:
Piszác skrypt (zawarta w tym konfiguracja) wpisuje np. linijke
SET TestVar "Dziala"

I teraz chce, aby przy interpretacji program wyszukal zmienna o nazwie TestVar (ew. já utworzyl) i przypisal jej wartosc "Dziala". (TestVar jest typu Variant)

Czy jest na to jakies rozwiazanie?
Z gory dzieki.

0

po kompilacji zmienne nie mają nazw tylko adres więc takie coś jest niemożliwe. Obejściem tego może być utworz HashTable, gdzie będziesz się odwoływał po nazwach

0

Hmm... powiedzmy że nie wiem co to jest ten "HashTable".... Jak kolwiek. Wyprobowalem inna metode, za pomoca rekordow

type PVariable = ^TVariable;
     TVariable = object
      Name : pchar;
      Value : variant;
    end;

Jednak coś w moim kodzie jest nie tak... pomóżcie mi znaleźć niedoszlifowany element

var
  Form1: TForm1;
  variables : TList;

implementation

{$R *.dfm}

function GetVariableByName(name : PChar):PVariable;
var v : PVariable; i : integer;
begin
  {-- Wydobądź zmienną z listy --}
  result := nil;
  for I := 0 to variables.Count-1 do
  begin
    v := variables[i];
    if v^.Name = name then
      result := variables[i];
  end;
end;

function VariableExists(name:pchar):boolean;
begin
  {-- za pomocą GetVariableByName() sprawdzamy istnienie zmiennej --}
  if GetVariableByName(name) = nil then
    result := false else result := true;
end;

function CreateVariable(name : PChar; value : variant):boolean;
var v : PVariable;
begin
  {-- Tutaj jest tworzona zmienna --}
  result := true;
  if variables = nil then
  begin
    variables := TList.Create;
    variables.Clear;
  end;

  if VariableExists(name) = true then exit;

  if name = '' then
  begin
    result := false;
    exit;
  end;

  v := New(PVariable);
  v^.Name := name;

  if @value = nil then
  begin
    result := false;
    exit;
  end;
  v^.Value := value;

  variables.Add(v);
end;

function ChangeValue(name:pchar;newvalue:variant):boolean;
var av : PVariable;
begin
  {--
  ... zamiana wartości zmiennej.
  ... nie sprawdzone, poniewaz nie moge sie odwolac do czegos co nie istnieje
  ... (czyt. dalej)
  --}
  result := false;
  if GetVariableByName(name) = nil then exit;
  av := GetVariableByName(name);
  av^.Value := newvalue;
  result := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  {-- Tworzymy przykładowe zmienne --}
  CreateVariable('Welcome','Welcome into my realm!');
  CreateVariable('W2','Sample msg no. 2');
  {-- Odwołujemy się do nich --}
  showmessage(GetVariablebyname('Welcome').Value);
  showmessage(GetVariableByName('W2').Value);
  showmessage(BoolToStr(VariableExists('Welcome'),true));
  {-- Wszystko jak na razie dziala --}
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  //ChangeValue('Welcome',edit1.Text);
  {-- Odwołujemy się do zmiennej jeszcze raz --}
  showmessage(GetVariablebyname('Welcome').Value);
  {-- No i mamy problem. Odwołujemy się do obszaru w pamięci który NIE ISTNIEJE --}


  {-- Tak dla pewności, sprawdzamy obecność zmiennej --}
  showmessage(BoolToStr(VariableExists(pchar(edit1.Text)),true));
  {-- Wiadomość jest krótka. "False" --}
end;

{--
... No więc teraz proszę o pomoc, i wskazać mi coś, co jest dla mnie niewidoczne.
... Mi tu nie gra tylko jedno: Utworzona i działająca zmienna /eng/ does no longer exist /pl/,
... mimo, że jej z pamięci nie wywalałem.
--}

end.
0

w delphi masz coś takiego jak RTTI, pozwala ono wyciągnąć wszystkie publiczne pola obiektów, w tym i po nazwie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1