🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #346485

Re: Czy można się odwołać do zmiennej po nazwie tekstem?

#346485
From: wloochacz
Date: Wed, 21 Mar 2018 17:05
68 lines
3608 bytes
W dniu 2018-03-21 o 12:05, Roman Tyczka pisze:
> On Wed, 21 Mar 2018 03:48:21 -0700 (PDT), ExM wrote:
> 
>>> Nie da się.
>>> Może napisz jaki masz cel, gdzie zmierzasz?
>>
>> Tka w uproszczeniu:
>>
>> Chciałbym umożliwić wczytanie wartości ze zmiennej istniejącej w aplikacji do dynamicznie tworzonego komponentu tEdit.
>> Informacje o tworzonym komponencie oraz tym co ma być wczytane do niego zapisane są w bazie danych.
>>
>> Czyli wczytuje z bazy info:
>> - utwórz komponent TEdit (x,y,with,height)
>> - wczytaj .text wartość zmiennej: 'LiczbaDni'
>>
>> Mogę oczywiście oprogramować dostępne zmienne - ale jeśli okaże się że jakiejś nie oprogramowałem to konieczna będzie aktualizacja aplikacji. Gdyby była jakaś magiczna metoda na dostęp do zmiennych "z automatu" było by prościej.
>>
>> Zastanawiałem się nad rozwiązaniem tego poprzez stworzenie tablic
>> T1 : Array of Variant - gdzie będę przechowywał wartości oraz
>> T2 : Array od String - gdzie będą nazwy zmiennych i wtedy wyszukuje zmienne w T2[x] a w T1[x] mam ich wartości.
>>
>> - tyle że to wymaga oprogramowania każdej zmiennej którą chcę przechowywać oraz aktualizowanie ich wartości przy każdej zmianie.
> 
> Trzymaj te zmienne w rekordzie jako pola i wtedy za pomocą RTTI, jak
> pokazał to Jan, odczytasz i zapiszesz ich wartość.
Po co?

> Choć ten cały pomysł jest ...dziwny, delikatnie mówiąc.
Ano jest.

Takie "cóś"?

procedure TForm54.btn1Click(Sender: TObject);
var
   lDict   : TDictionary<string,Variant>;
   I       : Integer;
   lValue  : Variant;
   lVarName: string;
begin
   // Utwórz słownik, czyli quasi "tablicę asocjacyjną, która w Delphi 
nie istnieje"...
   lDict := TDictionary<string,Variant>.Create;
   try
     // Wczytaj wszsytkie zmienne z "bazy danych"
     for I := 0 to 100 do
     begin
       lVarName := 'zmienna_' + IntToString(I);
       lDict.AddOrSetValue(lVarName, i);
     end;

     // Pobierz zmienną ze słownika
     if lDict.TryGetValue('zmienna_34', lValue) then
       // jeśli istnieje, to przepisz jej wartość do TEdit
       ed1.Text := VarToStrDef(lValue, 'pusto')
     else
       // jeśli nie istnieje, to napisz, że nie istnieje...
       ed1.Text := 'brak zmiennej';
   finally
     lDict.Free;
   end;
end;

Szybko (duuuużoooo szybciej niż RTTI) i prosto.

Tylko dalej nie wiem po co?

-- 
wloochacz
Technical Details
Message-ID: <5ab290c8$0$672$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.eu07.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin3!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-02.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <121d9004-81f5-4ce9-9c86-3e2c46815153@googlegroups.com> <1hiujpxl68d3y.dlg@tyczka.com> <c6e3f56f-5dc4-40d6-87b6-58e205049909@googlegroups.com> <6fdp1pd8cd9b$.dlg@tyczka.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.eu07.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin3!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-02.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Subject: Re: Czy można się odwołać do
 zmiennej po nazwie tekstem?
Newsgroups: pl.comp.lang.delphi
References: <121d9004-81f5-4ce9-9c86-3e2c46815153@googlegroups.com> <1hiujpxl68d3y.dlg@tyczka.com> <c6e3f56f-5dc4-40d6-87b6-58e205049909@googlegroups.com> <6fdp1pd8cd9b$.dlg@tyczka.com>
From: wloochacz <wloochacz@no.spam.gmail.com>
Date: Wed, 21 Mar 2018 18:05:10 +0100
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0
MIME-Version: 1.0
In-Reply-To: <6fdp1pd8cd9b$.dlg@tyczka.com>
Lines: 68
Message-ID: <5ab290c8$0$672$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 83.21.30.91
X-Trace: 1521651912 unt-rea-a-01.news.neostrada.pl 672 83.21.30.91:64076
X-Complaints-To: abuse@news.neostrada.pl
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit