Sign in Join
Wiki copytemporary

Clipboard/hu: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-<font size="7">Vágólap</font>
1+Vágólap
22
33## Előre definiált típusok
44
55| TPredefinedClipboardFormat | MIME típus |
66|----------------------------|----------------------------|
77| pcfText | text/plain |
88| pcfBitmap | image/bmp |
99| pcfPixmap | image/xpm |
1010| pcfIcon | image/lcl.icon |
1111| pcfPicture | image/lcl.picture |
1212| pcfMetaFilePict | image/lcl.metafilepict |
1313| pcfObject | application/lcl.object |
1414| pcfComponent | application/lcl.component |
1515| pcfCustomData | application/lcl.customdata |
1616| | |
1717
1818## Szöveg
1919
2020Egyszerű szöveg kezeléséhez a vágólapon az AsText tulajdonság használata ajánlott, melynek segítségével sima szövegek olvashatók és írhatók.
2121
2222Szöveg írása:
2323
2424``` pascal
2525Clipboard.AsText := 'Helló vágólap!';
2626```
2727
2828Szöveg olvasása:
2929
3030``` pascal
3131ShowMessage('A vágólap tartalma: ' + Clipboard.AsText);
3232```
3333
3434A Clipboard egy TClipboard típusú változó, aminek használatához a Clipbrd unit-ot a uses részhez kell adni:
3535
3636``` pascal
3737uses
3838..., Clipbrd;
3939```
4040
4141## Szöveg tartalmú komponensek
4242
4343Néhány grafikus komponens, mint a TEdit, TMemo, TStringGrid, TLabeledEdit, TMaskEdit, TSpinEdit és a TFloatSpinEdit lehetővé teszik a tartalmuk egy részének kijelölését és rendelkeznek a kijelölt szöveg vágólappal történő kezelésére ajánlott eljárásokkal.
4444
4545``` pascal
4646
4747procedure CopyToClipboard;
4848 procedure CutToClipboard;
4949 procedure PasteFromClipboard;
5050```
5151
5252## HTML forrás
5353
5454Egy példa a HTML források kiolvasására a vágólapról:
5555
5656``` pascal
5757uses
5858 Clipbrd, ...;
5959
6060procedure InsertHTMLSourceFromClipboard(Strings: TString);
6161var
6262 Fid: TClipboardFormat
6363 Str: WideString;
6464 Stream: TMemoryStream;
6565begin
6666 Fid := Clipboard.FindFormatID('text/html');
6767 if Fid <> 0 then
6868 try
6969 Stream := TMemoryStream.Create;
7070 if Clipboard.GetFormat(Fid, Stream) then
7171 begin
7272 Stream.Write(#0#0, Length(#0#0));
7373 Stream.Position := 0;
7474 Str := PWideChar(Stream.Memory);
7575 Strings.Text := UTF8Encode(Str);
7676 end;
7777 finally
7878 Stream.Free;
7979 end;
8080end;
8181```
8282
8383HTML forrás írása a vágólapra. Ez elvégezhető az AddFormat használatával, illetve TStream vagy memória Puffer segítségével.
8484
8585``` pascal
8686// a text/html mime tipus bejegyzése. Ezt csak egyszer kell megtenni a program indulásakor:
8787 ClipbrdFmtHTML := RegisterClipboardFormat('text/html');
8888...
8989 // Minden korábbi formátum kitakarítása a vágólapról indulás előtt
9090 Clipboard.Clear;
9191
9292 // szöveg és html elhelyezése a vágólapon. Más alkalmazások automatikusan a nekik legmegfelelőbbet fogják választani.
9393 ThePlainUTF8Text := 'Egyszerű szöveg';
9494 Clipboard.AsText := ThePlainUTF8Text;
9595
9696 HTMLSource := '<b>Formázott</b> szöveg'; // szöveg formázásokkal
9797 Clipboard.AddFormat(ClipbrdFmtHTML, HTMLSource[1], Length(HTMLSource));
9898```
9999
100100### Windows
101101
102102Nem minden alkalmazás támogatja a 'text/html' mime típust. A Microsoft operációs rendszerei és alkalmazásai inkább a 'HTML Format' megjelölést támogatják, melyhez a vágólapon elhelyezendő tartalom leírása a következő címen olvasható:
103103
104104<https://msdn.microsoft.com/en-us/library/aa767917%28v=vs.85%29.aspx>
105105
106106(ha az URL megváltozik az írás címe: **HTML Clipboard Format**, és része az **MSHTML Editing** dokumentációnak)
107107
108108Ez a leírás tartalmazza azt a követelményt, hogy a fejlécnek tartalmaznia kell a fejléc hosszát, ami bosszantó számolgatáshoz vezethet tekintettel arra, hogy a számlálás eredménye miatt megváltozhat a karakterek száma. A legegyszerűbb mód ennek megoldására, ha a számokat 10 számjeggyel és vezető nullákkal írjuk le, mint lentebb látható.
109109
110110``` pascal
111111procedure AddHTMLToClipboard(AHTML: String);
112112const
113113 HTML_MIME = 'HTML Format';
114114 NATIVEHEADER = 'Version:0.9' + #13#10 +
115115 'StartHTML:%.10d' + #13#10+
116116 'EndHTML:%.10d' + #13#10+
117117 'StartFragment:%.10d' + #13#10+
118118 'EndFragment:%.10d' + #13#10;
119119 HEADER = '<html><head></head><body>';
120120 FOOTER1 = '';
121121 FOOTER2 = '</body></html>';
122122var
123123 cfHTMLFormat: TClipboardFormat;
124124 HTMLSource : String;
125125 iStartHTML: Integer;
126126 iStartFragment: Integer;
127127 iEndFragment: Integer;
128128 iEndHTML: Integer;
129129
130130begin
131131 // Biztosítani kell, hogy a 'HTML Format' mime típus be legyen jegyezve
132132 cfHTMLFormat := Clipboard.FindFormatID(HTML_MIME);
133133 If cfHTMLFormat = 0 Then
134134 cfHTMLFormat := RegisterClipboardFormat(HTML_MIME);
135135
136136 iStartHTML := 105;
137137 iStartFragment := iStartHTML + Length(HEADER);
138138 iEndFragment := iStartFragment + Length(AHTML) + Length(FOOTER1);
139139 iEndHTML := iEndFragment + LENGTH(FOOTER2);
140140
141141 // Fejléc és nyitó html cimkék elhelyezése a karakterlánc elején
142142 HTMLSource := Format(NATIVEHEADER, [iStartHTML, iEndHTML, iStartFragment,
143143 iEndFragment]) + HEADER + AHTML + FOOTER1 + FOOTER2;
144144
145145 Clipboard.AddFormat(cfHTMLFormat, HTMLSource[1], Length(HTMLSource));
146146end;
147147
148148procedure TForm1.Button1Click(Sender: TObject);
149149begin
150150 Clipboard.Clear;
151151
152152 Clipboard.AsText:='Egyszerű szöveg';
153153
154154 AddHTMLToClipboard('<b>Kövér szöveg</b>');
155155end;
156156```
157157
158158Mivel a vágólap több formátumot támogat, ezért elhelyezhető rajta egyszerű szöveg (SimpleText), 'text/html' és 'HTML Format' elem egyszerre...
159159
160160## Kép
161161
162162### Betöltés vágólapról
163163
164164``` pascal
165165uses
166166 Clipbrd, LCLIntf, LCLType, ...;
167167
168168procedure LoadBitmapFromClipboard(Bitmap: TBitmap);
169169begin
170170 if Clipboard.HasFormat(PredefinedClipboardFormat(pcfDelphiBitmap)) then
171171 Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfDelphiBitmap));
172172 if Clipboard.HasFormat(PredefinedClipboardFormat(pcfBitmap)) then
173173 Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfBitmap));
174174end;
175175```
176176
177177### Mentés vágólapra
178178
179179``` pascal
180180uses
181181 Clipbrd, ...;
182182
183183procedure SaveBitmapToClipboard(Bitmap: TBitmap);
184184begin
185185 Clipboard.Assign(Bitmap);
186186end;
187187```
188188
189189## Értesítés a változásokról
190190
191191Az LCL-en nem futnak át a Windows üzeneteket, kivéve a WM_USER üzenetet. Ennek megfelelően saját üzenetkezelő írására lehet szükség. [Processing non - user messages in your window](http://wiki.lazarus.freepascal.org/Win32/64_Interface#Processing_non-user_messages_in_your_window)
192192
193193Példa saját üzenetkezelő kidolgozására:
194194
195195``` pascal
196196unit Unit1;
197197
198198{$mode delphi}{$H+}
199199
200200interface
201201
202202uses
203203 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
204204 Clipbrd, StdCtrls, Windows, Messages;
205205
206206type
207207 TForm1 = class(TForm)
208208 Button1: TButton;
209209 procedure FormCreate(Sender: TObject);
210210 procedure FormDestroy(Sender: TObject);
211211 private
212212 FNextClipboardOwner: HWnd; // A következő vágólapkezelő
213213 // A vágólap eseményeit kezelő eljárások következnek
214214 function WMChangeCBChain(wParam: WParam; lParam: LParam):LRESULT;
215215 function WMDrawClipboard(wParam: WParam; lParam: LParam):LRESULT;
216216 public
217217 end;
218218
219219var
220220 Form1: TForm1;
221221
222222implementation
223223
224224{$R *.lfm}
225225var
226226 PrevWndProc:windows.WNDPROC;
227227
228228function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam;
229229 lParam: LParam): LRESULT; stdcall;
230230begin
231231 if uMsg = WM_CHANGECBCHAIN then begin
232232 Result := Form1.WMChangeCBChain(wParam, lParam);
233233 Exit;
234234 end
235235 else if uMsg=WM_DRAWCLIPBOARD then begin
236236 Result := Form1.WMDrawClipboard(wParam, lParam);
237237 Exit;
238238 end;
239239 Result := CallWindowProc(PrevWndProc, Ahwnd, uMsg, WParam, LParam);
240240end;
241241
242242{ TForm1 }
243243
244244procedure TForm1.FormCreate(Sender: TObject);
245245begin
246246 PrevWndProc := Windows.WNDPROC(SetWindowLong(Self.Handle, GWL_WNDPROC, PtrInt(@WndCallback)));
247247 FNextClipboardOwner := SetClipboardViewer(Self.Handle);
248248end;
249249
250250procedure TForm1.FormDestroy(Sender: TObject);
251251begin
252252 ChangeClipboardChain(Handle, FNextClipboardOwner);
253253end;
254254
255255function TForm1.WMChangeCBChain(wParam: WParam; lParam: LParam): LRESULT;
256256var
257257 Remove, Next: THandle;
258258begin
259259 Remove := WParam;
260260 Next := LParam;
261261 if FNextClipboardOwner = Remove then FNextClipboardOwner := Next
262262 else if FNextClipboardOwner <> 0 then
263263 SendMessage(FNextClipboardOwner, WM_ChangeCBChain, Remove, Next)
264264end;
265265
266266function TForm1.WMDrawClipboard(wParam: WParam; lParam: LParam): LRESULT;
267267begin
268268 if Clipboard.HasFormat(CF_TEXT) Then Begin
269269 ShowMessage(Clipboard.AsText);
270270 end;
271271 SendMessage(FNextClipboardOwner, WM_DRAWCLIPBOARD, 0, 0); // NAGYON FONTOS!
272272 Result := 0;
273273end;
274274
275275end.
276276```
277277
278278## Külső hivatkozások
279279
280280- [Alapvető műveletek a vágólappal (Kivágás/Másolás/Beillesztés) a TClipboard objektumot használva](http://delphi.about.com/od/vclusing/a/tclipboard.htm)
281281
282282---
283283*From the Free Pascal wiki, page "Clipboard/hu", as it stood on 2019-06-18 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
284284Category: Magyar

Back to history