Uniwersalny pointer

0

Witam!

W swoim programie korzystam ze wskaźników do swoich typów. Każdy z tych typów jest właściwie rekordem (patrz przyklad ponizej). Część pól w każdym z tych typów jest identyczna (np: Warstwa i Zaznaczony).

Czy jest możliwa praca z tymi wskaźnikami w sposób analogiczny do zmiennej Variant? Tzn. podczas pisania programu nie wiem z jakiego typu zmienną mam do czynienia ale wiem, że na 100% ma pewne pola i do tych pól się odwołuję?

Czy jest możliwe sprawdzenie do jakiego typu odwoluje się wskaźnik? (Raczej nie sądzę ale na wszelki wypadek pytam)

PLinia = ^TLinia;
TLinia = record
x1,y1,x2,y2 :Currency;
Warstwa :integer;
Zaznaczony :Boolean;
end;

POkrag = ^TOkrag;
TOkrag = record
x,y,r :currency;
Warstwa :integer;
Zaznaczony :Boolean;
end;

0

Nie mam pewności, ale przede wszystkim należałoby zmienne pola umiescić na końcu rekordu, dla ułatwienia.

Można zarzutować na Pointer i odwołać się do konkretnej pamięci, na przykład:

type
  TMyRec = record
  i: Integer;
  a, b: Boolean;
  end;

var
  MyRec: TMyRec;
  P: Pointer;
  x: Integer;
begin
  MyRec.i := 56;
  MyRec.a := False;
  MyRec.b := True;
  P := @MyRec;
  CopyMemory(@x, P, 4); 
  ShowMessage(IntToStr(x)); // 56
end;

Zamiast CopyMemory() można użyć innej funkcji ..

0

a samemu poeksperymentowac to nie laska? :>

spojrz na kod:

var
l:PLinia;
begin
new(l);
l.x1:=10;
l.x2:=11;
l.y1:=12;
l.y2:=1323;
l.Warstwa:=2005;
l.Zaznaczony:=true;

showmessage(inttostr(Pokrag(l).Warstwa));
dispose(l);

jak zapewne zauwazysz - rekordy roznia sie jednym polem liczbowym, tak wiec showmessage ukaze nam wartosc pola y2 :]
//pewnie daloby rade jakos "przesunac" pole ale se przypomniec nie moge [sciana]
Jesli zalezy ci na uproszczeniu operacji - moze po prostu prosciutka funkcja ? :>

function L2O(l:PLinia):POkrag;
begin
new(result);
result.x:=l.x1;
result.y:=l.y1;
result.r:=l.x2;
result.Warstwa:=l.Warstwa;
result.Zaznaczony:=l.Zaznaczony;
end;

albo taka deklaracja:

 TField = record
        Warstwa :integer;
      Zaznaczony :Boolean;
  end;

 PLinia = ^TLinia;
 TLinia = record
      x1,y1,x2,y2 :Currency;
      F:TField;
   end;

  POkrag = ^TOkrag;
  TOkrag = record
       x,y,r :currency;
       F:TField;
    end;

mozesz wykombinowac jeszcze sporo. samemu :)

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