[DELPHI] Clipboard Usage

Hallo!
Ich möchte das Windows Clipboard als Ablage für Objekte
benutzen. Ich weiss das das Clipboard standartmäsig
drei/vier Formate unterstützt, möchte aber ein
eigenes Format registrieren. Da gibts API’s
(RegisterClipboardFormat… usw.)
Hat jemand schonmal mit Delphi und Clipboard gearbeitet ?
Ich komme mit dem Memorymanagement nicht zurecht.

Danke und Gruss
bERND

Hi!

Ich möchte das Windows Clipboard als Ablage für Objekte
benutzen. Ich weiss das das Clipboard standartmäsig
drei/vier Formate unterstützt, möchte aber ein
eigenes Format registrieren. Da gibts API’s
(RegisterClipboardFormat… usw.)

Jawoll, mit der Funktion „RegisterClipboardFormat“ kannst Du ein benutzerdefiniertes Zwischenablageformat registrieren (wer hätte das gedacht? :wink:).

Hat jemand schonmal mit Delphi und Clipboard gearbeitet ?
Ich komme mit dem Memorymanagement nicht zurecht.

Was hast Du denn genau für ein Problem? Um ein Objekt zu speichern, mußt Du eine Methode erstellen, die die relevanten Datenfelder in einen Stream schreiben kann. Diesen Stream kannst Du dann beliebig in die Zwischenablage kopieren und ihn wieder aus ihr zurücklesen. Damit letzteres funktioniert, brauchst Du dann noch eine zweite Methode, die ein Objekt aus einem Stream „rekonstruieren“ kann.

Ich hoffe, das war verständlich.

Gruß
Martin

Ja, ich glaube genau hier liegt das Problem.
durch die Funktion SetClipboardData(format,handler)
kann ich doch was im clipboard speichern, oder?
und genau hier brauche ich doch das Handle auf den Speicher
block (bzw. mein Objekt, sag’ mer mal testobj vom
Typ TTestClass). Ich dachte, ganz naiv, ich könnte
mit GlobalHandle(Addr(testobj)) die ganze Sache gewinnen.
Das ging aber nicht…

Wie Stream ??

Was hast Du denn genau für ein Problem? Um ein Objekt zu
speichern, mußt Du eine Methode erstellen, die die relevanten
Datenfelder in einen Stream schreiben kann. Diesen Stream
kannst Du dann beliebig in die Zwischenablage kopieren und ihn
wieder aus ihr zurücklesen. Damit letzteres funktioniert,
brauchst Du dann noch eine zweite Methode, die ein Objekt aus
einem Stream „rekonstruieren“ kann.

Ja, ich glaube genau hier liegt das Problem.
durch die Funktion SetClipboardData(format,handler)
kann ich doch was im clipboard speichern, oder?
und genau hier brauche ich doch das Handle auf den Speicher
block (bzw. mein Objekt, sag’ mer mal testobj vom
Typ TTestClass). Ich dachte, ganz naiv, ich könnte
mit GlobalHandle(Addr(testobj)) die ganze Sache gewinnen.
Das ging aber nicht…

Wie Stream ??

Ah, schau mal in die Hilfe zum Stichwort „TClipboard“. Zitat: „Um ein persistentes Komponentenobjekt in die Zwischenablage einzufügen oder aus ihr heraus abzurufen, rufen Sie die Methoden GetComponent und SetComponent auf“. Das heißt: Wenn Dein Objekt (direkt oder indirekt) von TPersistent abstammt (insbesondere trifft das auf alle Komponenten zu, weil TComponent von TPersistent abgeleitet ist), solltest Du mit diesen Methoden zum Ziel kommen. Wenn es sich dagegen um „rohe“ Objekte (Vorfahr = TObject) handelt, mußt Du selbst die erwähnten In-und-aus-Stream-Methoden schreiben (Du weißt, was Streams sind?).

Bei Deinem Versuch, Dir einfach den Speicherbereich eines Objekts zu verschaffen, sehe ich das Problem, das jedes Objekt einfach weitere Objekte besitzen kann, die aber nur als Zeiger im Besitzerobjekt repräsentiert sind, und diese Zeiger im Clipboard zu speichern, ist sicher nicht im Sinne des Erfinders. Ich denke, das ist der Grund für das Verfahren „Alle relevanten Daten aus Objekt holen, in Stream speichern und dann diesen Stream ins Clipboard schreiben“ bzw. in umgekehrter Richtung „Aus Clipboard Stream erhalten – daraus die enthaltenen Daten extrahieren – mit diesen das Objekt rekonstruieren“.

Gruß
Martin