Variant/pl

From Lazarus wiki
Jump to navigationJump to search

Deutsch (de) English (en) español (es) français (fr) polski (pl)


Powrót do typów danych.


Typ danych Variant umożliwia jednej zmiennej przechowywanie wartości wielu różnych typów. Pozwala to statycznie typowanemu językowi programowania, takiemu jak Free Pascal, na pewną elastyczność, którą zwykle można znaleźć tylko w dynamicznie typowanym języku, np. takim jak Python.

Typ danych Variant zajmuje więcej pamięci niż proste typy danych. Wymagania dotyczące pamięci typu wariantu dla 32-bitowej kompilacji to 16 bajtów lub 128 bitów. Wymagania dotyczące pamięci dla wariantu typu w kompilacji 64-bitowej to 24 bajty lub 192 bity. Wartości dowolnego prostego typu danych mogą być przechowywane w zmiennej wariantowej. Jednak operacje z typem danych Variant są znacznie wolniejsze niż w przypadku zmiennej typowanej statycznie typem prostym.

W module Variants istnieją dwie przydatne funkcje do pracy z typami Variant:

  • Funkcja VarType() sprawdza, jaki typ danych zawiera wariant.
  • Funkcja VarToStr() konwertuje wartość zmiennej typu Variant na reprezentację ciągu string.

Definicja pola danych typu Variant. Zaleca się używanie modułu Variants:

Uses 
  Variants;
var
  v: Variant;

Przykładowe użycie:

uses 
  Variants;
var
  v: Variant;
  s: string;
  i: integer;

procedure ProcessVariant(v : Variant);
begin

 // Przykład określania co zawiera zmienna Variant:
 Case varType(v) of
    varEmpty:
        Writeln('Pusta');
    varNull:
        Writeln('Null');
    varSingle:
        Writeln('Typ danych: Single');
    varDouble:
        Writeln('Typ danych: Double');
    varDecimal:
        Writeln('Typ danych: Decimal');
    varCurrency:
        Writeln('Typ danych: Currency');
    varDate:
        Writeln('Typ danych: Date');
    varOleStr:
        Writeln('Typ danych: UnicodeString');
    varStrArg:
        Writeln('Typ danych: Ciąg string zgodny z COM');
    varString:
        Writeln('Typ danych: Wskaźnik do dynamicznego ciągu string');
    varDispatch:
        Writeln('Typ danych: Wskaźnik do obiektu automatyzacji');
    varBoolean:
        Writeln('Typ danych: Wordbool');
    varVariant:
        Writeln('Typ danych: Variant');
    varUnknown:
        Writeln('Typ danych: nieznany');
    varShortInt:
        Writeln('Typ danych: ShortInt');
    varSmallint:
        Writeln('Typ danych: Smallint');
    varInteger:
        Writeln('Typ danych: Integer');
    varInt64:
        Writeln('Typ danych: Int64');
    varByte:
        Writeln('Typ danych: Byte');
    varWord:
        Writeln('Typ danych: Word');
    varLongWord:
        Writeln('Typ danych: LongWord');
    varQWord:
        Writeln('Typ danych: QWord');
    varError:
        Writeln('BŁĄD określający typ wariantu');
 else
   Writeln('Nie można określić typu wariantu');
 end;
end;

begin

  // Przykład 1:
  // Przypisanie wartości:
  v := 1;

  //Przykłady dopuszczalnych przypisań typu, audytu/konwersji typu danych:

  //Jawne konwersje typów danych
  s := VarToStr(v);
  Writeln('s:',s);
  s := AnsiString(v);
  Writeln('s:',s);
  i := Integer(v);
  Writeln('i:',i);
  //Niejawna konwersja typu danych:
  i := v;
  Writeln('i:',i);

  ProcessVariant(10);
  ProcessVariant(True);
  ProcessVariant('Pascal');
  ProcessVariant(10.244);

end.

Wyjście:

s:1
s:1
i:1
i:1
Datatype: ShortInt
Datatype: Wordbool
Datatype: Wskaźnik do dynamicznego ciągu string
Datatype: Double