[Delphi] Object naar Clipboard kopieren (en terug)

Pagina: 1
Acties:

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 17:59

Knutselsmurf

LED's make things better

Topicstarter
Voor een applicatiee probeer ik het voor elkaar te krijgen dat ik objecten (afgeleid van een TShape) naar het clipboard kan kopieren en weer op de juiste plek kan plakken. Het enige dat ik echter op internet zie dat op het clipboard gezet wordt is tekst en een enkel plaatje. Dit kan dan ook met een enkel commando voor elkaar gekregen worden.

Een mogelijke oplossing zou zijn om de inhoud van het object naar een string om te zetten en die op het clipboard te plaatsen. Deze oplossing vindt ik zelf minder fraai, omdat de inhoud van de clipboard dan in iedere willekeurige applicatie gepast kan worden.

Wie weet er dus hoe ik een object in zijn geheel in 1 keer op het clipboard kan zetten?

- This line is intentionally left blank -


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Da ga nie. Binnen Windows draaien applicatie in hun eigen process-space. Dat betekend dat een geheugenadres in de 1 niets voorsteld in de ander. Wat jij een object noemt is een pointer en die kan je dus niet zomaar naar een andere applicatie sturen. Je zal dus een binaire of textuele representatie van je object moeten maken en die oversturen. Je kan overgens wel je eigen clipboard formaten aanmaken en dat is in jouw geval ook wel de bedoeling. Want dan kan de andere kant controleren of er wel een zinnig iets (TShape) op de clipboard staat. Maar nogmaals: Je kan geen pointer sturen en zal je object dus moeten serializen.

/edit
Zie voor meer informatie over Custom Clipboard formats:
http://delphi.about.com/library/weekly/aa110700a.htm

OLE Drag 'n Drop werkt ook via het Clipboard: http://www.undu.com/Articles/001108f.html

[ Voor 15% gewijzigd door LordLarry op 03-07-2003 15:32 ]

We adore chaos because we like to restore order - M.C. Escher


  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 17:59

Knutselsmurf

LED's make things better

Topicstarter
LordLarry schreef op 03 July 2003 @ 15:19:
Da ga nie. Binnen Windows draaien applicatie in hun eigen process-space. Dat betekend dat een geheugenadres in de 1 niets voorsteld in de ander. Wat jij een object noemt is een pointer en die kan je dus niet zomaar naar een andere applicatie sturen. Je zal dus een binaire of textuele representatie van je object moeten maken en die oversturen. Je kan overgens wel je eigen clipboard formaten aanmaken en dat is in jouw geval ook wel de bedoeling. Want dan kan de andere kant controleren of er wel een zinnig iets (TShape) op de clipboard staat. Maar nogmaals: Je kan geen pointer sturen en zal je object dus moeten serializen.
Misschien een beetje onduideljk van mij, maar het was uiteindelijk wel de bedoeling dat het copy/pasten alleen binnen dezelfde applicatie gebeurt.

- This line is intentionally left blank -


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Knutselsmurf schreef op 03 July 2003 @ 15:26:
Misschien een beetje onduideljk van mij, maar het was uiteindelijk wel de bedoeling dat het copy/pasten alleen binnen dezelfde applicatie gebeurt.
Blijft hetzelfde clipboard. Maar je zou nu wel een pointer over kunnen sturen als je wilt, maar echt mooi vind ik het niet. Als je wilt dat een andere app er niets mee kan zal je een eigen clipboard formaat moeten maken. Zoiezo een goed idee als het wat anders is als de standaard.

We adore chaos because we like to restore order - M.C. Escher


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 17:51

Tomatoman

Fulltime prutser

Daar is het clipboard niet voor bedoeld. Het clipboard geeft alle applicaties dezelfde mogelijkheden. Wat je zou kunnen doen, is je eigen clipboardformaat registreren (dat natuurlijk alleen door je eigen programma herkend wordt). Kijk eens naar RegisterClipboardFormat. Je zou ook het standaardformaat kunnen gebruiken dat Delphi in design time gebruikt om objecten te kopiëren via het clipboard. Dat scheelt je weer wat werk.

Een goede grap mag vrienden kosten.


  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 17:59

Knutselsmurf

LED's make things better

Topicstarter
tomatoman, heb je een idee waar ik meer informatie kan vinden over dat laatste? Tijdens mijn zoektocht heb ik daar namelijk helemaal niets over langs zien komen.

- This line is intentionally left blank -


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 17:51

Tomatoman

Fulltime prutser

Kijk in de unit Clipbrd. Daar zie je hoe de variabele CF_COMPONENT wordt geregistreerd, waarna componenten via het clipboard gekopieerd kunnen worden. Dat doe je met Clipboard.SetComponent (kopiëren) en Clipboard.GetComponent (plakken).

Van componenten worden standaard alleen de published properties (inclusief event handlers) opgeslagen in een stream. Aangezien de hierboven genoemde procedures met een memorystreams werken, geldt dat ook voor de componenten die je het clipboard kopieert en plakt. Mocht je dit voor zelfgemaakte componenten willen aanpassen bijvoorbeeld omdat je een public property mee wilt streamen, dan zul je het streaming mechanisme van die componenten moeten aanpassen. Zie het voorbeeld bij DefineProperties in de helpfiles.

Kijk ook naar RegisterClass (in unit Classes, niet in unit Windows) in Delphi Help en zoek in de source code van Delphi voor voorbeelden. RegisterClass moet voor ieder component dat je via het clipboard wilt kopiëren worden aangeroepen, anders wordt de class niet herkend wanneer hij wordt geplakt vanaf het clipboard.

Een goede grap mag vrienden kosten.


Verwijderd

Gebruik objecttext, is die tekst die je krijgt al je je formulier als tekst weergeeft in Delphi

KOPIEREN
ObjectResourceToText procedure -> component naar objecttext
-> deze tekst kopieren naar het clipboard

PLAKKEN
tekst ophalen uit het clipboard
-> ObjectTextToResource procedure -> objecttext naar component

een stukje code uit de help
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function ComponentToString(Component: TComponent): string;

var
  BinStream:TMemoryStream;
  StrStream: TStringStream;
  s: string;
begin
  BinStream := TMemoryStream.Create;
  try
    StrStream := TStringStream.Create(s);
    try
      BinStream.WriteComponent(Component);
      BinStream.Seek(0, soFromBeginning);
      ObjectBinaryToText(BinStream, StrStream);
      StrStream.Seek(0, soFromBeginning);
      Result:= StrStream.DataString;
    finally
      StrStream.Free;

    end;
  finally
    BinStream.Free
  end;
end;

function StringToComponent(Value: string): TComponent;
var
  StrStream:TStringStream;
  BinStream: TMemoryStream;
begin
  StrStream := TStringStream.Create(Value);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(StrStream, BinStream);
      BinStream.Seek(0, soFromBeginning);
      Result := BinStream.ReadComponent(nil);

    finally
      BinStream.Free;
    end;
  finally
    StrStream.Free;
  end;
end;


succes!

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 17:51

Tomatoman

Fulltime prutser

Het voorbeeld van .::|RecoN|::. is waarschijnlijk de gemakkelijkste manier te zijn om objecten te kopiëren via het clipboard en daarom heel aanlokkelijk. Het nadeel daarvan is echter dat je ook in bijvoorbeeld Word een 'component' kan plakken, alleen verschijnt er dan een hoop nietszeggende ongeformatteerde tekst (de published properties/events). Dat vind ik niet echt fraai.

Bovendien zou een gebruiker in Word de properties in tekstvorm zodanig kunnen aanpassen, dat er niet toegestane instellingen ontstaan. Als de tekst (eigenlijk een component) dan weer op het clipboard wordt geplaatst, staat daar een object met niet toegestane instellingen. Het principe van componenten in de vorm van platte tekst nodigt daardoor uit tot ongewenste manipulatie van componenten en andere problemen.

Een goede grap mag vrienden kosten.


  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 17:59

Knutselsmurf

LED's make things better

Topicstarter
De methode van .::|RecoN|::. is vergelijkbaar met de methode zoals we die nu geimplementeerd hebben, maar hetgeen tomatoman zegt klinkt toch robuuster. Dus zullen we daar onze aandacht eens op richten. Mochten er toch nog vragen/onduidelijkheden zijn, dan wordt dat vast wel gemeld :+

Voor nu iig alvast hartelijk bedankt voor de duidelijke inbreng.....

- This line is intentionally left blank -


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Die van tomatoman is hetzelfde, alleen is er een eigen clipboard formaat gebruikt zodat bijvoorbeeld Word het met rust laat. Het 'probleem' blijft nogsteeds dat je gebruikt maakt van het RTTI streamen van Delphi en dat alleen werkt bij published properties. Of je moet speciale code schrijven om ook andere properties op te slaan. Bovendien dienen de objecten ook nog minstens af te leiden van TPersistance. Als dit geen probleem is, is het wel het makkelijkst. Anders moet je zelf de serialize functies schrijven.

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1