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.

6 komentarzy

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 ;)