Array of Variant - odczyt

0

Proszę o pomoc w odczycie tablicy variantów. Mam zwracaną wartość:

myVariant := FieldByName('memberOf').AsVariant

i potrzebuje ja wyświetlić. Na razie robię to w ten sposób:

odpowiedz := myVariant[0] + myVariant[1] + myVariant[2]

ale wiem, że to bez sensu bo 'profesjonalniej' było by wiedzieć ile jest elementów i zrobić to w pętli.

dodanie znaczników <code class="delphi"> - furious programming

1
Marcin Kuśmierczyk napisał(a):

Proszę o pomoc w odczycie tablicy variantów.

To jest tablica Variantów, czy Variant będący tablicą?

var
  lVariantArray : array of Variant;
  lVarinatArray : Variant;
begin
  // tablica variantów
  SetLength(lVariantArray, 1);
  lVariantArray[0] := 'wartość';
  lVariantArray[1] := 12.5;

  // Variant będący tablicą
  lVarinatArray := VarArrayOf(['wartość', 12.5]);
end;

Mam zwracaną wartość myVariant := FieldByName('memberOf').AsVariant i potrzebuje ja wyświetlić. Na razie robię to w ten sposób odpowiedz := myVariant[0] + myVariant[1] + myVariant[2] ale wiem, że to bez sensu bo 'profesjonalniej' było by wiedzieć ile jest elementów i zrobić to w pętli.

Faktycznie bez sensu ibardziej mi chodzi o opis Twojego problemu - niewiele z tego rozumiem...
Jednakże jeśli to tablica variantów to możesz postąpić tak jak z każdą inną tablicą, czyli:

var
  lVariantArray : array of Variant;
   I : Integer;
begin
  for I := Low(lVariantArray ) to High(lVariantArray ) do
    odpowiedz := odpowiedz  + lVariantArray[i];
end;

Tylko, że taka sklejka

odpowiedz := myVariant[0] + myVariant[1] + myVariant[2]

w przypadku różncyh typów danych lub napotkania wartości null, pięknie się wysypie...

0

Dokładnie to type (Array Variant)

Tylko, że taka sklejka

odpowiedz := myVariant[0] + myVariant[1] + myVariant[2]

w przypadku różncyh typów danych lub napotkania wartości null, pięknie się wysypie...

tej groźby nie ma bo dane są zawsze tekstowe

0

@wloochacz pokazał Ci w jaki sposób można bawić się z wariantami - inny opis ich użycia masz np. w kompendium - Variant; Przykładowe łączenie łańcuchów z tablicy wariantów także poniżej:

type
  TVariantArray = array of Variant;
var
  vaLines: TVariantArray;
  strText: AnsiString;
  I: Integer;
begin
  SetLength(vaLines, 3);
  vaLines[0] := 'first';
  vaLines[1] := 'second';
  vaLines[2] := 'third';

  strText := vaLines[0];

  for I := Low(vaLines) + 1 to High(vaLines) do
    strText := strText + ', ' + vaLines[I];

  Write('Text: "', strText, '"');
  ReadLn;
end.

Wyjscie:

Text: "first, second, third"
Z drugiej strony, skoro zawsze są to dane tekstowe (łańcuchy znaków), to dlaczego nie stosujesz macierzy np. Stringów?

0

I tu dla mnie laika zaczyna się problem bo propozycja typu

  for I := Low(vaLines) + 1 to High(vaLines) do
    strText := strText + ', ' + vaLines[I];

nie za bardzo się sprawdza bo jak wspomniałem na początku otrzymuję wartość pola (dane nie są z bazy ale odpowiedzią LDAPa)

FieldByName('memberOf').AsVariant

a operacji typu np

i := Low(FieldByName('memberOf').AsVariant) 

nie da się wykonać :(

dodanie znaczników <code class="delphi"> - furious programming

0
function VarArrayHighBound(const A: Variant; Dim: Integer): Integer;
function VarArrayLowBound(const A: Variant; Dim: Integer): Integer;

Czyli

for I:=VarArrayLowBound(myVariant,1) to VarArrayHighBound(myVariant,1) do
0

@Marcin Kuśmierczyk - czyli wariant przechowuje macierz, teraz rozumiem;

W takim razie @_13th_Dragon - podał Ci rozwiązanie, a co do innych funkcji operujących na wariantach, zapoznaj się z dokumentacją przestrzeni Variants, która zawiera dużą ilość funkcji i nie tylko.

1 użytkowników online, w tym zalogowanych: 0, gości: 1