Programowanie Główna arrow c++ arrow Rzutowanie dynamiczne


Rzutowanie dynamiczne
Często w programie jest tak, że musimy użyć wielu obiektów danej klasy.
Dostęp do takich obiektów pojedynczo jest niewygodny.
Dla przykładu założymy, że mamy formularz a na nim 20 komponentów Label i 20 Editów.
Po naciśnięciu przycisku miałby się zapisać do pliku INI.

Dla przypomnienia , lub dla tych którzy nie wiedza pokaże teraz jak zapisuje się do pliku ini.
1
2
3
TIniFile *plik=new TIniFile("C:\plik.ini");
plik->WriteString("SECKJA","KLUCZ","WARTOSC");

nie będę się teraz rozpisywał na temat plików ini ponieważ o nich jest inny artykuł.

Załóżmy że chcemy teraz zapisać do sekcji o nazwie "SEKCJA" (strasznie ambitne swoja drogą) klucze których nazwy są w Captionach Labeli oraz wartości w textach Editów.

Wykonanie tego dla np 5 takich elementów nie jest zbyt czasochłonne, jednak gdy mamy tak jak w tym przypadku wiele takich obiektów może to być czasochłonne (i monotonne).

Jeżeli jednak zachowamy pewną systematyczność w nazwach tych obiektów, czyli nazwy Labeli to : Lebl1, Label2, Label3..... i tak do 20 to samo z Editami to możemy zastosować pętle oraz rzutowanie dynamiczne

1
2
3
4
5

for(int i=0; i<21; i++)
plik->WriteString("SEKCJA",
dynamic_cast<TLabel*>(FindComponent("Label"+String(i)))->Caption,
dynamic_cast<TEdit*>(FindComponent("Edit"+String(i)))->Text);


Co spowoduje wykonanie powyżeszego kodu?

Pętla wykona się 20 razy (czyli tyle ile jest lementów)
Później widzimy nasza funkcje zapisu do pliku ini (oszczędziłem sobie jej deklaracji).
Jako pierwszy parametr normalnie podajemy, że "SEKCJA", jako klucz i wartość juz nie tak do końca.
Najpierw informujemy o wykonaniu rzutowania dynamicznego.
W nawiasach < > podajemy nazwę klasy, z jakiej zostały utworzone obiekty.
W tym miejscu należy zaznaczyć że, jeśli cześć elementów była by labelami a cześć np. Editami i odwołujemy się tylko przez jedno rzutowanie dynamiczne (oczywiście do pola o tej samej nazwie) to powstaje pytanie czy w nawiasie wpisać nazwę klasy TLabel czy TEdit. Jeśli damy ta pierwsza, Edit nie zostanie obsłużony, jeśli na odwrót to Label nie będzie brany pod uwage.
W takiej sytuacji można podać klasę, od której pochodzą obydwie TControl i problem rozwiązany.
Później używamy funkcji FindComponent gdzie jako string możemy podać nazwę obiektu. w cudzysłów wpisujemy cześć która się nie zmienia i pobieramy aktualną wartość zmiennej "i" która konwertujemy na string i dodajemy do części stałej później strzałką odwołujemy się już do pola Caption, które zostanie wykorzystane jako klucz a w przypadku Edita do Text jako wartości konkretnego klucza.

site copyright © http://www.e-kursy.com
projekty domów | limo service chicago Airport | podziękowanie | opisygg | budowa stron internetowych
monety | Bielizna dla Niego | Tworzenie stron WWW | tanie linie | Zakopane Hotele | Loituma Wielki Por | hotele lublin | Filtry basenowe | bukmacher online | literatura w oryginale