Sign in Join
Wiki copytemporary

Clipboard/hu: what changed

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

Title: Clipboard/hu

OldNewLine
1+<font size="7">Vágólap</font>
2+
3+## Előre definiált típusok
4+
5+| TPredefinedClipboardFormat | MIME típus |
6+|----------------------------|----------------------------|
7+| pcfText | text/plain |
8+| pcfBitmap | image/bmp |
9+| pcfPixmap | image/xpm |
10+| pcfIcon | image/lcl.icon |
11+| pcfPicture | image/lcl.picture |
12+| pcfMetaFilePict | image/lcl.metafilepict |
13+| pcfObject | application/lcl.object |
14+| pcfComponent | application/lcl.component |
15+| pcfCustomData | application/lcl.customdata |
16+| | |
17+
18+## Szöveg
19+
20+Egyszerű 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.
21+
22+Szöveg írása:
23+
24+``` pascal
25+Clipboard.AsText := 'Helló vágólap!';
26+```
27+
28+Szöveg olvasása:
29+
30+``` pascal
31+ShowMessage('A vágólap tartalma: ' + Clipboard.AsText);
32+```
33+
34+A Clipboard egy TClipboard típusú változó, aminek használatához a Clipbrd unit-ot a uses részhez kell adni:
35+
36+``` pascal
37+uses
38+..., Clipbrd;
39+```
40+
41+## Szöveg tartalmú komponensek
42+
43+Né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.
44+
45+``` pascal
46+
47+procedure CopyToClipboard;
48+ procedure CutToClipboard;
49+ procedure PasteFromClipboard;
50+```
51+
52+## HTML forrás
53+
54+Egy példa a HTML források kiolvasására a vágólapról:
55+
56+``` pascal
57+uses
58+ Clipbrd, ...;
59+
60+procedure InsertHTMLSourceFromClipboard(Strings: TString);
61+var
62+ Fid: TClipboardFormat
63+ Str: WideString;
64+ Stream: TMemoryStream;
65+begin
66+ Fid := Clipboard.FindFormatID('text/html');
67+ if Fid <> 0 then
68+ try
69+ Stream := TMemoryStream.Create;
70+ if Clipboard.GetFormat(Fid, Stream) then
71+ begin
72+ Stream.Write(#0#0, Length(#0#0));
73+ Stream.Position := 0;
74+ Str := PWideChar(Stream.Memory);
75+ Strings.Text := UTF8Encode(Str);
76+ end;
77+ finally
78+ Stream.Free;
79+ end;
80+end;
81+```
82+
83+HTML 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.
84+
85+``` pascal
86+// a text/html mime tipus bejegyzése. Ezt csak egyszer kell megtenni a program indulásakor:
87+ ClipbrdFmtHTML := RegisterClipboardFormat('text/html');
88+...
89+ // Minden korábbi formátum kitakarítása a vágólapról indulás előtt
90+ Clipboard.Clear;
91+
92+ // szöveg és html elhelyezése a vágólapon. Más alkalmazások automatikusan a nekik legmegfelelőbbet fogják választani.
93+ ThePlainUTF8Text := 'Egyszerű szöveg';
94+ Clipboard.AsText := ThePlainUTF8Text;
95+
96+ HTMLSource := '<b>Formázott</b> szöveg'; // szöveg formázásokkal
97+ Clipboard.AddFormat(ClipbrdFmtHTML, HTMLSource[1], Length(HTMLSource));
98+```
99+
100+### Windows
101+
102+Nem 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ó:
103+
104+<https://msdn.microsoft.com/en-us/library/aa767917%28v=vs.85%29.aspx>
105+
106+(ha az URL megváltozik az írás címe: **HTML Clipboard Format**, és része az **MSHTML Editing** dokumentációnak)
107+
108+Ez 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ó.
109+
110+``` pascal
111+procedure AddHTMLToClipboard(AHTML: String);
112+const
113+ HTML_MIME = 'HTML Format';
114+ NATIVEHEADER = 'Version:0.9' + #13#10 +
115+ 'StartHTML:%.10d' + #13#10+
116+ 'EndHTML:%.10d' + #13#10+
117+ 'StartFragment:%.10d' + #13#10+
118+ 'EndFragment:%.10d' + #13#10;
119+ HEADER = '<html><head></head><body>';
120+ FOOTER1 = '';
121+ FOOTER2 = '</body></html>';
122+var
123+ cfHTMLFormat: TClipboardFormat;
124+ HTMLSource : String;
125+ iStartHTML: Integer;
126+ iStartFragment: Integer;
127+ iEndFragment: Integer;
128+ iEndHTML: Integer;
129+
130+begin
131+ // Biztosítani kell, hogy a 'HTML Format' mime típus be legyen jegyezve
132+ cfHTMLFormat := Clipboard.FindFormatID(HTML_MIME);
133+ If cfHTMLFormat = 0 Then
134+ cfHTMLFormat := RegisterClipboardFormat(HTML_MIME);
135+
136+ iStartHTML := 105;
137+ iStartFragment := iStartHTML + Length(HEADER);
138+ iEndFragment := iStartFragment + Length(AHTML) + Length(FOOTER1);
139+ iEndHTML := iEndFragment + LENGTH(FOOTER2);
140+
141+ // Fejléc és nyitó html cimkék elhelyezése a karakterlánc elején
142+ HTMLSource := Format(NATIVEHEADER, [iStartHTML, iEndHTML, iStartFragment,
143+ iEndFragment]) + HEADER + AHTML + FOOTER1 + FOOTER2;
144+
145+ Clipboard.AddFormat(cfHTMLFormat, HTMLSource[1], Length(HTMLSource));
146+end;
147+
148+procedure TForm1.Button1Click(Sender: TObject);
149+begin
150+ Clipboard.Clear;
151+
152+ Clipboard.AsText:='Egyszerű szöveg';
153+
154+ AddHTMLToClipboard('<b>Kövér szöveg</b>');
155+end;
156+```
157+
158+Mivel 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...
159+
160+## Kép
161+
162+### Betöltés vágólapról
163+
164+``` pascal
165+uses
166+ Clipbrd, LCLIntf, LCLType, ...;
167+
168+procedure LoadBitmapFromClipboard(Bitmap: TBitmap);
169+begin
170+ if Clipboard.HasFormat(PredefinedClipboardFormat(pcfDelphiBitmap)) then
171+ Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfDelphiBitmap));
172+ if Clipboard.HasFormat(PredefinedClipboardFormat(pcfBitmap)) then
173+ Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfBitmap));
174+end;
175+```
176+
177+### Mentés vágólapra
178+
179+``` pascal
180+uses
181+ Clipbrd, ...;
182+
183+procedure SaveBitmapToClipboard(Bitmap: TBitmap);
184+begin
185+ Clipboard.Assign(Bitmap);
186+end;
187+```
188+
189+## Értesítés a változásokról
190+
191+Az 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)
192+
193+Példa saját üzenetkezelő kidolgozására:
194+
195+``` pascal
196+unit Unit1;
197+
198+{$mode delphi}{$H+}
199+
200+interface
201+
202+uses
203+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
204+ Clipbrd, StdCtrls, Windows, Messages;
205+
206+type
207+ TForm1 = class(TForm)
208+ Button1: TButton;
209+ procedure FormCreate(Sender: TObject);
210+ procedure FormDestroy(Sender: TObject);
211+ private
212+ FNextClipboardOwner: HWnd; // A következő vágólapkezelő
213+ // A vágólap eseményeit kezelő eljárások következnek
214+ function WMChangeCBChain(wParam: WParam; lParam: LParam):LRESULT;
215+ function WMDrawClipboard(wParam: WParam; lParam: LParam):LRESULT;
216+ public
217+ end;
218+
219+var
220+ Form1: TForm1;
221+
222+implementation
223+
224+{$R *.lfm}
225+var
226+ PrevWndProc:windows.WNDPROC;
227+
228+function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam;
229+ lParam: LParam): LRESULT; stdcall;
230+begin
231+ if uMsg = WM_CHANGECBCHAIN then begin
232+ Result := Form1.WMChangeCBChain(wParam, lParam);
233+ Exit;
234+ end
235+ else if uMsg=WM_DRAWCLIPBOARD then begin
236+ Result := Form1.WMDrawClipboard(wParam, lParam);
237+ Exit;
238+ end;
239+ Result := CallWindowProc(PrevWndProc, Ahwnd, uMsg, WParam, LParam);
240+end;
241+
242+{ TForm1 }
243+
244+procedure TForm1.FormCreate(Sender: TObject);
245+begin
246+ PrevWndProc := Windows.WNDPROC(SetWindowLong(Self.Handle, GWL_WNDPROC, PtrInt(@WndCallback)));
247+ FNextClipboardOwner := SetClipboardViewer(Self.Handle);
248+end;
249+
250+procedure TForm1.FormDestroy(Sender: TObject);
251+begin
252+ ChangeClipboardChain(Handle, FNextClipboardOwner);
253+end;
254+
255+function TForm1.WMChangeCBChain(wParam: WParam; lParam: LParam): LRESULT;
256+var
257+ Remove, Next: THandle;
258+begin
259+ Remove := WParam;
260+ Next := LParam;
261+ if FNextClipboardOwner = Remove then FNextClipboardOwner := Next
262+ else if FNextClipboardOwner <> 0 then
263+ SendMessage(FNextClipboardOwner, WM_ChangeCBChain, Remove, Next)
264+end;
265+
266+function TForm1.WMDrawClipboard(wParam: WParam; lParam: LParam): LRESULT;
267+begin
268+ if Clipboard.HasFormat(CF_TEXT) Then Begin
269+ ShowMessage(Clipboard.AsText);
270+ end;
271+ SendMessage(FNextClipboardOwner, WM_DRAWCLIPBOARD, 0, 0); // NAGYON FONTOS!
272+ Result := 0;
273+end;
274+
275+end.
276+```
277+
278+## Külső hivatkozások
279+
280+- [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)
281+
282+---
283+*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).*
284+Category: Magyar

Back to history