[DELPHI] Clipboard Usage

Von: , Frage gestellt am Do, 31. Aug 2000

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

3 Antworten zu dieser Frage

  1. Antwort von nach einer Stunde hilfreich
    Re: [DELPHI] Clipboard Usage

    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? ;-)). 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

    • Antwort von nach 2 Stunden hilfreich
      Re^2: [DELPHI] Clipboard Usage

      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.

      • Antwort von nach 3 Stunden hilfreich
        Re^3: [DELPHI] Clipboard Usage

        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

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!