Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Pointer auf Object in Variant speichern und wieder auslesen (https://www.delphipraxis.net/160383-pointer-auf-object-variant-speichern-und-wieder-auslesen.html)

bwolf 10. Mai 2011 17:55

Pointer auf Object in Variant speichern und wieder auslesen
 
Hi Leute,

folgende Frage:


Ich erstelle eine kleine Klasse:
Code:
type
  TTtest = class
    private
      description : String;
  end;

Ich speichere in einem Variant die Referenz auf ein Objekt dieser Klasse:
Code:
procedure TfrmMain.Button2Click(Sender: TObject);
var
  PSplObj : ^TTest;
begin

      New(PSplObj);
      PSplObj^ := TsplCellObject.Create;
      PSplObj.description := sTeam;
      PSplObj.color := clRed;
      grid.DataController.Values[0,0] := Integer(PSplObj);
      dispose(PSplObj);

end;

Nun versuche ich auf die Referenz dieses Objects zuzugreifen,aber schaffe es nicht:
Code:
procedure TfrmMain.gridCustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  myAdress : Integer;
begin
    myAdress := Integer(AViewInfo.Value); // enthalt die Zeigeradresse die in grid.DataController.Values[0,0] zugewiesen wurde
    showmessage((TObject(myAdress) as TTest).description);
end;
Wäre toll wenn mir da einer kurze Hilfestellung geben würde...
1000 dank !

EarlyBird 10. Mai 2011 18:24

AW: Pointer auf Object in Variant speichern und wieder auslesen
 
möchtest Du im TfrmMain.gridSchichtplanerBandedTableView1CustomDr awCell einen eigenen Wert in die Zelle des Grids schreiben?
Dafür braucht man nicht unbedingt ein eigenes Objekt.

Und siehe Dispose

bwolf 10. Mai 2011 18:35

AW: Pointer auf Object in Variant speichern und wieder auslesen
 
Zitat:

Zitat von EarlyBird (Beitrag 1100034)
möchtest Du im TfrmMain.gridSchichtplanerBandedTableView1CustomDr awCell einen eigenen Wert in die Zelle des Grids schreiben?
Dafür braucht man nicht unbedingt ein eigenes Objekt.

Und siehe Dispose

Hi EarlyBird,

danke für deine Antwort!

jein, es geht nicht nur einen eigenen Wert in der Zelle, ich muss zu jeder Zelle allerlei Informationen ablegen. Laut DevExpress ist das wohl die einzige Möglichkeit...

Zum Dispose hast du natürlich recht (habe ich aus dem Beispiel von DevExpres mit kopiert ^^), wenn ich es entferne bekomme ich auch keine Zugriffsverletzung mehr, allerdings ist die description eds Objects immer leer...

Stimmt denn der Zugriff auf das Objekt so wie ich es gepostet hatte?

FredlFesl 10. Mai 2011 19:06

AW: Pointer auf Object in Variant speichern und wieder auslesen
 
Ein Objekt ist doch bereits ein Zeiger. Versuchs mal mit "Integer(MyObject)" und "TMyObject(VarToInt(VariantValue))".

daywalker9 10. Mai 2011 20:09

AW: Pointer auf Object in Variant speichern und wieder auslesen
 
Wenn dann so:

VarToInt gibts leider nicht. Um auf den Integer Wert zu kommen kannst Du einfach TVarData nutzen um auf den Pointer zuzugreifen.

Delphi-Quellcode:
 

var
  V : Variant;

begin
  item := Items.Add;

  V := Integer(Item);

  Item := TListItem(PInteger(TVarData(V).VPointer)^);
end;

EarlyBird 10. Mai 2011 20:24

AW: Pointer auf Object in Variant speichern und wieder auslesen
 
Hab`s mal getestet,
so klappt es:
Code:
procedure TfrmMain.gridCustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  PSplObj : TTtest;
  objectInt : Variant;
begin
   try
     objectInt := Integer(AViewInfo.Value) ;
     PSplObj := TTtest(PInteger(TVarData(objectInt).VPointer)^);
     showmessage(PSplObj.description);
   except

   end;

end;;

FredlFesl 10. Mai 2011 20:47

AW: Pointer auf Object in Variant speichern und wieder auslesen
 
Ich habs mal so gelöst:
Delphi-Quellcode:
Function VarToInt(aValue: Variant): Integer;
Begin
  Case VarType(aValue) Of
    varSmallint,
      varInteger,
      varShortInt,
      varByte,
      varWord,
      varLongWord,
      varInt64: Result := aValue;

    varSingle,
      varDouble,
      varCurrency,
      varDate: Result := Trunc(aValue);
    varOleStr,
      varStrArg,
      varString: Result := StrToIntDef(aValue, 0);
    varBoolean: If aValue Then
        Result := 1
      Else
        Result := 0;
  Else
    Result := 0;
  End;
End;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz