AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Pointer auf Object in Variant speichern und wieder auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer auf Object in Variant speichern und wieder auslesen

Ein Thema von bwolf · begonnen am 10. Mai 2011 · letzter Beitrag vom 10. Mai 2011
Antwort Antwort
bwolf

Registriert seit: 17. Jan 2006
368 Beiträge
 
Delphi 2009 Professional
 
#1

Pointer auf Object in Variant speichern und wieder auslesen

  Alt 10. Mai 2011, 17:55
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 !

Geändert von bwolf (10. Mai 2011 um 18:37 Uhr)
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#2

AW: Pointer auf Object in Variant speichern und wieder auslesen

  Alt 10. Mai 2011, 18:24
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
  Mit Zitat antworten Zitat
bwolf

Registriert seit: 17. Jan 2006
368 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Pointer auf Object in Variant speichern und wieder auslesen

  Alt 10. Mai 2011, 18:35
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?
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#4

AW: Pointer auf Object in Variant speichern und wieder auslesen

  Alt 10. Mai 2011, 19:06
Ein Objekt ist doch bereits ein Zeiger. Versuchs mal mit "Integer(MyObject)" und "TMyObject(VarToInt(VariantValue))".
Das Bild hängt schief.
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#5

AW: Pointer auf Object in Variant speichern und wieder auslesen

  Alt 10. Mai 2011, 20:09
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;
Lars
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#6

AW: Pointer auf Object in Variant speichern und wieder auslesen

  Alt 10. Mai 2011, 20:24
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;;

Geändert von EarlyBird (10. Mai 2011 um 20:45 Uhr)
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#7

AW: Pointer auf Object in Variant speichern und wieder auslesen

  Alt 10. Mai 2011, 20:47
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;
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz