Zmienne wariantowe
Ktos
Czy nie denerwowało cię, że pisząc program musiałeś pamiętać o deklaracji odpowiednich zmiennych? W Delphi jednak już od dawna istnieją zmienne zmieniające typ w zależności od potrzeb. Oto program poprawny pod każdym względem w Object Pascalu:
var
V : Variant; //deklaracja zmiennej wariantowej
begin
V := 'Delphi'; //teraz zawiera tekst
V := 1; //teraz liczbę całkowitą
V := 123.45; //teraz liczbę zmiennoprzecinkową
V := TRUE; //a teraz wartość logiczną
end;
Ten kod jest poprawny w Delphi, da się go skompilować i będzie działał.
Zmienna tego typu zajmuje 16 bajtów pamięci. Nie można w niej reprezentować wskaźników i obiektów.
Zmienne wariantowe mogą być argumentami wyrażeń: +, -, =, *, /, div, mod, and, or, xor i inne. Jednak ich użycie może doprowadzić do zaskakujących rezultatów.
Jeżeli argumenty operacji różnią się, Delphi przeprowadza konwersję na wspólny tp, którym jest zawsze typ silniejszy (najpierw DOUBLE, potem INTEGER, i STRING).
var
V1, V2, V3 : Variant;
begin
V1 := '100'; //łańcuch
V2 := '50'; //też łańcuch
V3 := 200; //integer
V1 := V1 + V2 + V3;
end;
Jaki wynik? nie 350, a 10250.0. Dlaczego: bo V1 + V2 da '10050', a + V3 da 10250.0 (typ double, nie integer!).
Proponuję więc uważne korzystanie z takich zmiennych!
Zmiennych tych nie stosuje się przy znajomości danych wejściowych - jedynie jeżeli nie znamy typów danych, jakie poda nam użytkownik.
Ja osobiście typu Variant używam od bardzo dawna i sprawdza się znakomicie. Proponuję też zajrzeć i przestudiować dodatkowy moduł VARIANTS.
Normalnie nie wszyscy się od razu domyślają bo typ Variant jest zdefiniowany w module SYSTEM, a tam predefiniowane typy zmiennech nie mają swoich odpowiedników, gdyż są wbudowane w kompilator.
Założę sie o każdą kwotę, że Variant nie jest po to, żeby nie trzeba było używać IntToStr! Chętnie dowiedziałbym się o zmiennych Variant jako argumentach funkcji, bo daje to do ręki programisty potężne narzędzie! Taka mała dygresja ;)
Dobrze, że o tym napisałeś, bo ja na przykład nie wiedziałem o takim czymś, a męczyłem się z zamianą inttostr itd.
A dlaczego piszesz o tym artykuł przecież Variant to dla mnie podstawowa zmienna ... hm może jest ktoś kto o niej nie wie
Mogłeś trochę więcej napisać o f-cjach specyficznych dla tego typu zmiennych.
Hmm.. w sumie fajnie, że ktoś o tym napisał :).
Warto jednak zaznaczyć, że zmiennych tych nie używa się, jeśli w programie jest np. tylko i:integer - bo są duuuże - i właśnie zwracają ciekawe wyniki - jak zreztą zostao napisane ;)