Article View: pl.comp.lang.delphi
Article #346485Re: Czy można się odwołać do zmiennej po nazwie tekstem?
From: wloochacz
Date: Wed, 21 Mar 2018 17:05
Date: Wed, 21 Mar 2018 17:05
68 lines
3608 bytes
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-mailReferences:
<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