Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   INT64 unter Win32 unter in Items.Objects speichern ? (https://www.delphipraxis.net/180908-int64-unter-win32-unter-items-objects-speichern.html)

DataCool 30. Jun 2014 13:16

INT64 unter Win32 unter in Items.Objects speichern ?
 
Hallo zusammen,

gibt es Möglichkeit einen INT64-Wert mittels
Delphi-Quellcode:
var iID : Int64;
begin
  // ...
  Items.AddObject('some-Text', Pointer(iID) );
unter Win32 zu speichern ?

Ja mir ist klar Win32: Pointer = 4 Byte und Win64: Pointer = 8 Byte .....

Gibt es einen Weg diese Problematik elegant zu umgehen ?

Mir ist bis jetzt nur eingefallen eine Klasse zu erstellen die einen Int64 Wert als Property hat und dann die Klasse mit Pointer(oMyInt64)
entsprechend zu speichern, aber diese Lösung hätte weitgehende Konsequenzen ...

Bin für jede Hilfe/Anregung dankbar,

Greetz Data

Neutral General 30. Jun 2014 13:19

AW: INT64 unter Win32 unter in Items.Objects speichern ?
 
Die einzige Lösung ist soweit ich das sehe "Pointer auf irgendwas". Z.B. ginge auch ein Pointer direkt auf einen Int64. Aber den Speicher dafür musst du dann auch manuell anfordern und freigeben (New/Dispose)

Dejan Vu 30. Jun 2014 13:23

AW: INT64 unter Win32 unter in Items.Objects speichern ?
 
Interessanterweise heißt die Methode 'AddObject' und nicht 'AddPointer'. Was läge also näher, als den Namen wörtlich zu nehmen und ein Objekt zu erstellen, das die Int64-ID enthält (und -wer weiss- vielleicht noch weitere, nützliche Informationen).
Delphi-Quellcode:
Type
  TComboItem=Class
  Public
    Constructor Create (aID : Int64);
    Property ID : Int64 read fID write fID;
  End;
Bei stringenter Verwendung von Interfaces entfällt sogar das Freigeben (sofern man das Formular selbst freigibt).

DataCool 30. Jun 2014 13:25

AW: INT64 unter Win32 unter in Items.Objects speichern ?
 
@Neutral General:
Ja stimmt, das sollte auch funktionieren ..., würde aber auch massive Source-Änderungen nach sich ziehen ... das wollte ich eigentlich vermeiden ....

@Dejan Vu:
Das ist ja der Lösungsweg, den ich selber schon beschrieben hatte, aber auch das erfordert einige Änderungen am Source ....


Vielleicht hat ja jemand noch einen "Genie-Streich" im Petto ?!

himitsu 30. Jun 2014 13:28

AW: INT64 unter Win32 unter in Items.Objects speichern ?
 
Joar, oder du speicherst den Wert in 2 Items. :stupid:
Oder wenn es nicht ganz genau sein muß, bei größeren Werten, dann kannst du auch einen Single (4 Byte) statt dem Int64 verwenden.
Oder in dem Object steht nur die ID/Index des Wertes, zu einer Daten-Liste, bzw. speicherst in der GUI garkeine Werte, sondern verwaltets alles nur im Hintergrund.

Wenn dieses Items die Objektinstanzen verwalten kann (ala OwnsObjects), dann kommst du mit dem Datenobjekt besser, als mit 'nem PInt64.

Man kann natürlich auch das Items ableiten und macht intern die Umwandlung von Int64 auf das "Object".
Bzw. via ClassHelper eine zusätzliche Umwandlungs-/Übergabe-/Auslesefunktion, aber dafür wäre dann wieder die automatische Speicherverwaltung (OwnsObjects) nötig.

Dejan Vu 30. Jun 2014 13:31

AW: INT64 unter Win32 unter in Items.Objects speichern ?
 
Zitat:

Zitat von DataCool (Beitrag 1263824)
@Dejan Vu:
Das ist ja der Lösungsweg, den ich selber schon beschrieben hatte, aber auch das erfordert einige Änderungen am Source ....

Yo, ich sollte mir angewöhnen, besser zu lesen.

Mein Tipp: Mach es richtig: Heute etwas mehr Arbeit, aber ab morgen hast Du was davon. Saubere Arbeit ist auch eine Investition in die Zukunft.

DataCool 30. Jun 2014 13:37

AW: INT64 unter Win32 unter in Items.Objects speichern ?
 
[QUOTE=Dejan Vu;1263827]
Zitat:

Zitat von DataCool (Beitrag 1263824)
@Dejan Vu:
...
Mein Tipp: Mach es richtig: Heute etwas mehr Arbeit, aber ab morgen hast Du was davon. Saubere Arbeit ist auch eine Investition in die Zukunft.

Absolut meine Meinung, aber wenn das Kind schon in den Brunnen gefallen ist, wollte ich eigentlich nicht den Brunnen ab und wieder aufbauen ;-)

Greetz Data

himitsu 30. Jun 2014 13:41

AW: INT64 unter Win32 unter in Items.Objects speichern ?
 
Du verebreiterst entweder den Brunnen, damit der Retter zum Kind runter kann und danach passt dann auch ein ganz fettes Kind da rein (Ableitung),
bzw. buddelst einen zweiten Gang daneben, wo auch ein fetter Retter durch passt, bis zu dem Kind runter (ClassHelper).

Dejan Vu 30. Jun 2014 13:43

AW: INT64 unter Win32 unter in Items.Objects speichern ?
 
Scheiß legacy Code ;-)

DataCool 30. Jun 2014 13:52

AW: INT64 unter Win32 unter in Items.Objects speichern ?
 
Ich glaube ich werde es so realisieren das ich mir eine ID-Manger-Klasse baue, die dann die IDs mit einen Integer-Schlüssel-Wert verwaltet
und sich um den Speicher kümmert, ähnlich einem der Wege die Himitsu vorgeschlagen hat ...

Delphi-Quellcode:
TIDManager = class
  public
    function AddID(const AID : Int64) : Integer;
    function GetID(const AKey : Integer) : Int64;
// .....
end;
Nicht die allerschönste Lösung, aber das sollte keine Speicher-Lecks geben und ist relativ "einfach" um-/einzubauen.

Danke für das schnelle Feedback!

:dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 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