Zmienna typu Variant a liczby ujemne

0

Mam funkcję którą używam w wielu miejscach w programie. Zwraca wartość typu Variant (czasem liczby czasem tekst).
Ale jeśli zwraca liczbę ujemną (-1) to po podstawianiu jej do zmiennej integer mam 65535.
Dla -2 mam 65534 itd.

Jak uzyskać na wyjściu rzeczywistą wartość -1 ?

0

Nie rozumiem przecież jak jest -1 do czy to Integer czy Variant to będzie -1

var
  a: Variant;
  b: Integer;
begin
  a:= -1;
  b:= a;
  ShowMessage(IntToStr(b)); //jest -1
end;

Takie wyniki jak podajesz możesz uzyskać gdy zmienna będzie typu Word a nie Integer ale to już wynika z zastosowanego typu zmiennej i nie ma w tym nic dziwnego.

Fundamental integer types  
Type	Range	Format
Shortint	-128..127	signed 8-bit
Smallint	-32768..32767	signed 16-bit
Longint	-2147483648..2147483647	signed 32-bit
Int64	-2^63..2^63-1	signed 64-bit
Byte	0..255	unsigned 8-bit
Word	0..65535	unsigned 16-bit
Longword	0..4294967295	unsigned 32-bit
0

może daj kod jak to przypisujesz

0

function PodajZMIENNE_INI(id:Integer;pole:string):Variant;
var DS : TADODataSet;
begin
  result :=null;

   DS:= TADODataSet.Create(nil);
       try
        ds.Connection:=  DM.ADOConnection;
        ds.CommandType:= cmdText;
        ds.CommandText:='SELECT '+pole+' AS ile from ZMIENNE_INI where ZMIENNA_ID='+intToStr(id);
        ds.Open ;
        if (ds.RecordCount>0) then
          if DS.FieldByName('ile').IsNull=false then Result := ds.FieldByName('ile').AsVariant;  <- tutaj w ds[ile] jest -1
       finally
            if ds.Active then ds.Close;
            ds.Free;
       end;
end;

....



var d : integer

d := PodajZMIENNE_INI(61,'POLE1');   <- tutaj d jest 65535


 
0
  1. Nie sprawdza się RecordCount tylko EoF - na RecordCount możesz się przejechać
  2. Wartości typu boolean nie porównuje się dodatkowo do true lub false - jak będziesz miał funkcję, która zwraca np. wordbool to się przejedziesz
  3. Kiedy tylko możesz zwracaj wartość pola jako konkretny typ - np. jako AsInteger
  4. formatuj kod
function PodajZMIENNE_INI(id:Integer;pole:string):Variant;
var 
  DS : TADODataSet;
begin
  result :=null;
  DS:= TADODataSet.Create(nil);
  try
    ds.Connection:=  DM.ADOConnection;
    ds.CommandType:= cmdText;
    ds.CommandText:='SELECT '+pole+' AS ile from ZMIENNE_INI where ZMIENNA_ID='+intToStr(id);
    ds.Open ;
    if not ds.EoF and not DS.FieldByName('ile').IsNull then 
      Result := ds.FieldByName('ile').AsInteger;
  finally
    ds.Free;
  end;
end;

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