Variant

Adam Boduch

Variant - typ danych języka Delphi

Języki takie jak PHP czy Perl mają pewną specyficzną funkcję ? brak konieczności określania typów danych. Znaczy to, że jest możliwe określenie typu zmiennej, ale przeważnie to kompilator na podstawie wartości przypisanej do zmiennej sam określi, jaki to typ.

Typy wariantowe pojawiły się po raz pierwszy w języku Clipper i do teraz są obecne także w Delphi. Są bardzo wygodne, gdyż do zmiennej typu Variant możesz przypisać i tekst, i liczby ? każdy rodzaj danych.

Aby móc korzystać ze zmiennych typu Variant, w sekcji Uses trzeba dodać moduł: Variants. Od chwili dołączenia modułu Variants do sekcji uses możemy korzystać z typu Variant ? deklarować zmienne tego typu:

var
  V: Variant;

Następnie możesz przypisywać do tej zmiennej dane różnego typu:

uses Variants;

var
  V: Variant;
begin
  V := 10;
  V := 'Adam';
  V := TRUE;
end.

Powyższy kod zostanie zaakceptowany przez kompilator jako prawidłowy.

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.

Zobacz też:

2 komentarzy

Dodalem tutaj informacje z Twojego artykulu, ktorych tutaj brakowalo. Nie wiem co zrobic z tamtym tekstem - zostawic? Moze przekierowac na ten tekst? Hmm...

Hmm, chyba należałoby to jakoś połączyć z tym: http://4programmers.net/Delphi/Artyku%C5%82y/Zmienne_wariantowe co dawno temu napisałem :)