![]() |
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:
Wäre toll wenn mir da einer kurze Hilfestellung geben würde...
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; 1000 dank ! |
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 ![]() |
AW: Pointer auf Object in Variant speichern und wieder auslesen
Zitat:
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? |
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))".
|
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; |
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;; |
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