Difference between revisions of "Clipboard/hu"
m (→Windows) |
m (Fixed syntax highlighting) |
||
(7 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | {{Clipboard}} | + | {{AutoCategory}}{{Clipboard}} |
+ | |||
<font size="7">Vágólap</font> | <font size="7">Vágólap</font> | ||
Line 18: | Line 19: | ||
|- | |- | ||
| pcfPicture || image/lcl.picture | | pcfPicture || image/lcl.picture | ||
+ | |- | ||
+ | | pcfMetaFilePict || image/lcl.metafilepict | ||
|- | |- | ||
| pcfObject || application/lcl.object | | pcfObject || application/lcl.object | ||
Line 25: | Line 28: | ||
| pcfCustomData || application/lcl.customdata | | pcfCustomData || application/lcl.customdata | ||
|- | |- | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|} | |} | ||
Line 51: | Line 35: | ||
Szöveg írása: | Szöveg írása: | ||
− | <syntaxhighlight>Clipboard.AsText := 'Helló vágólap!';</syntaxhighlight> | + | <syntaxhighlight lang="pascal">Clipboard.AsText := 'Helló vágólap!';</syntaxhighlight> |
Szöveg olvasása: | Szöveg olvasása: | ||
− | <syntaxhighlight>ShowMessage('A vágólap tartalma: ' + Clipboard.AsText);</syntaxhighlight> | + | <syntaxhighlight lang="pascal">ShowMessage('A vágólap tartalma: ' + Clipboard.AsText);</syntaxhighlight> |
A Clipboard egy TClipboard típusú változó, aminek használatához a Clipbrd unit-ot a uses részhez kell adni: | A Clipboard egy TClipboard típusú változó, aminek használatához a Clipbrd unit-ot a uses részhez kell adni: | ||
− | <syntaxhighlight>uses | + | <syntaxhighlight lang="pascal"> |
+ | uses | ||
..., Clipbrd;</syntaxhighlight> | ..., Clipbrd;</syntaxhighlight> | ||
− | == | + | ==Szöveg tartalmú komponensek== |
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. | 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. | ||
− | <syntaxhighlight> procedure CopyToClipboard; | + | <syntaxhighlight lang="pascal"> |
+ | procedure CopyToClipboard; | ||
procedure CutToClipboard; | procedure CutToClipboard; | ||
− | procedure PasteFromClipboard;</syntaxhighlight> | + | procedure PasteFromClipboard; |
+ | </syntaxhighlight> | ||
==HTML forrás== | ==HTML forrás== | ||
Egy példa a HTML források kiolvasására a vágólapról: | Egy példa a HTML források kiolvasására a vágólapról: | ||
− | <syntaxhighlight>uses | + | <syntaxhighlight lang="pascal"> |
+ | uses | ||
Clipbrd, ...; | Clipbrd, ...; | ||
Line 95: | Line 83: | ||
Stream.Free; | Stream.Free; | ||
end; | end; | ||
− | end;</syntaxhighlight> | + | end; |
+ | </syntaxhighlight> | ||
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. | 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. | ||
− | <syntaxhighlight>// a text/html mime tipus bejegyzése. Ezt csak egyszer kell megtenni a program indulásakor: | + | <syntaxhighlight lang="pascal"> |
+ | // a text/html mime tipus bejegyzése. Ezt csak egyszer kell megtenni a program indulásakor: | ||
ClipbrdFmtHTML := RegisterClipboardFormat('text/html'); | ClipbrdFmtHTML := RegisterClipboardFormat('text/html'); | ||
... | ... | ||
Line 116: | Line 106: | ||
<p>(ha az URL megváltozik az írás címe: '''HTML Clipboard Format''', és része az '''MSHTML Editing''' dokumentációnak)</p> | <p>(ha az URL megváltozik az írás címe: '''HTML Clipboard Format''', és része az '''MSHTML Editing''' dokumentációnak)</p> | ||
<p>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ó.</p> | <p>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ó.</p> | ||
− | <syntaxhighlight> | + | |
+ | <syntaxhighlight lang="pascal"> | ||
procedure AddHTMLToClipboard(AHTML: String); | procedure AddHTMLToClipboard(AHTML: String); | ||
const | const | ||
Line 169: | Line 160: | ||
===Betöltés vágólapról=== | ===Betöltés vágólapról=== | ||
− | <syntaxhighlight>uses | + | <syntaxhighlight lang="pascal"> |
+ | uses | ||
Clipbrd, LCLIntf, LCLType, ...; | Clipbrd, LCLIntf, LCLType, ...; | ||
Line 182: | Line 174: | ||
===Mentés vágólapra=== | ===Mentés vágólapra=== | ||
− | <syntaxhighlight>uses | + | <syntaxhighlight lang="pascal"> |
+ | uses | ||
Clipbrd, ...; | Clipbrd, ...; | ||
Line 189: | Line 182: | ||
Clipboard.Assign(Bitmap); | Clipboard.Assign(Bitmap); | ||
end;</syntaxhighlight> | end;</syntaxhighlight> | ||
− | + | <!-- | |
==Egyéni formátumok== | ==Egyéni formátumok== | ||
==Több objektum== | ==Több objektum== | ||
− | + | --> | |
==Értesítés a változásokról== | ==Értesítés a változásokról== | ||
Line 200: | Line 193: | ||
Példa saját üzenetkezelő kidolgozására: | Példa saját üzenetkezelő kidolgozására: | ||
− | <syntaxhighlight>unit Unit1; | + | <syntaxhighlight lang="pascal"> |
+ | unit Unit1; | ||
{$mode delphi}{$H+} | {$mode delphi}{$H+} | ||
Line 216: | Line 210: | ||
procedure FormDestroy(Sender: TObject); | procedure FormDestroy(Sender: TObject); | ||
private | private | ||
− | FNextClipboardOwner: HWnd; // | + | FNextClipboardOwner: HWnd; // A következő vágólapkezelő |
− | // | + | // A vágólap eseményeit kezelő eljárások következnek |
function WMChangeCBChain(wParam: WParam; lParam: LParam):LRESULT; | function WMChangeCBChain(wParam: WParam; lParam: LParam):LRESULT; | ||
function WMDrawClipboard(wParam: WParam; lParam: LParam):LRESULT; | function WMDrawClipboard(wParam: WParam; lParam: LParam):LRESULT; | ||
Line 275: | Line 269: | ||
ShowMessage(Clipboard.AsText); | ShowMessage(Clipboard.AsText); | ||
end; | end; | ||
− | SendMessage(FNextClipboardOwner, WM_DRAWCLIPBOARD, 0, 0); // | + | SendMessage(FNextClipboardOwner, WM_DRAWCLIPBOARD, 0, 0); // NAGYON FONTOS! |
Result := 0; | Result := 0; | ||
end; | end; | ||
Line 284: | Line 278: | ||
* [http://delphi.about.com/od/vclusing/a/tclipboard.htm 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 Alapvető műveletek a vágólappal (Kivágás/Másolás/Beillesztés) a TClipboard objektumot használva] | ||
− | |||
− |
Latest revision as of 10:50, 18 June 2019
│
Deutsch (de) │
English (en) │
magyar (hu) │
русский (ru) │
Vágólap
Előre definiált típusok
TPredefinedClipboardFormat | MIME típus |
---|---|
pcfText | text/plain |
pcfBitmap | image/bmp |
pcfPixmap | image/xpm |
pcfIcon | image/lcl.icon |
pcfPicture | image/lcl.picture |
pcfMetaFilePict | image/lcl.metafilepict |
pcfObject | application/lcl.object |
pcfComponent | application/lcl.component |
pcfCustomData | application/lcl.customdata |
Szöveg
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.
Szöveg írása:
Clipboard.AsText := 'Helló vágólap!';
Szöveg olvasása:
ShowMessage('A vágólap tartalma: ' + Clipboard.AsText);
A Clipboard egy TClipboard típusú változó, aminek használatához a Clipbrd unit-ot a uses részhez kell adni:
uses
..., Clipbrd;
Szöveg tartalmú komponensek
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.
procedure CopyToClipboard;
procedure CutToClipboard;
procedure PasteFromClipboard;
HTML forrás
Egy példa a HTML források kiolvasására a vágólapról:
uses
Clipbrd, ...;
procedure InsertHTMLSourceFromClipboard(Strings: TString);
var
Fid: TClipboardFormat
Str: WideString;
Stream: TMemoryStream;
begin
Fid := Clipboard.FindFormatID('text/html');
if Fid <> 0 then
try
Stream := TMemoryStream.Create;
if Clipboard.GetFormat(Fid, Stream) then
begin
Stream.Write(#0#0, Length(#0#0));
Stream.Position := 0;
Str := PWideChar(Stream.Memory);
Strings.Text := UTF8Encode(Str);
end;
finally
Stream.Free;
end;
end;
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.
// a text/html mime tipus bejegyzése. Ezt csak egyszer kell megtenni a program indulásakor:
ClipbrdFmtHTML := RegisterClipboardFormat('text/html');
...
// Minden korábbi formátum kitakarítása a vágólapról indulás előtt
Clipboard.Clear;
// szöveg és html elhelyezése a vágólapon. Más alkalmazások automatikusan a nekik legmegfelelőbbet fogják választani.
ThePlainUTF8Text := 'Egyszerű szöveg';
Clipboard.AsText := ThePlainUTF8Text;
HTMLSource := '<b>Formázott</b> szöveg'; // szöveg formázásokkal
Clipboard.AddFormat(ClipbrdFmtHTML, HTMLSource[1], Length(HTMLSource));
Windows
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ó:
https://msdn.microsoft.com/en-us/library/aa767917%28v=vs.85%29.aspx
(ha az URL megváltozik az írás címe: HTML Clipboard Format, és része az MSHTML Editing dokumentációnak)
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ó.
procedure AddHTMLToClipboard(AHTML: String);
const
HTML_MIME = 'HTML Format';
NATIVEHEADER = 'Version:0.9' + #13#10 +
'StartHTML:%.10d' + #13#10+
'EndHTML:%.10d' + #13#10+
'StartFragment:%.10d' + #13#10+
'EndFragment:%.10d' + #13#10;
HEADER = '<html><head></head><body><!--StartFragment-->';
FOOTER1 = '<!--EndFragment-->';
FOOTER2 = '</body></html>';
var
cfHTMLFormat: TClipboardFormat;
HTMLSource : String;
iStartHTML: Integer;
iStartFragment: Integer;
iEndFragment: Integer;
iEndHTML: Integer;
begin
// Biztosítani kell, hogy a 'HTML Format' mime típus be legyen jegyezve
cfHTMLFormat := Clipboard.FindFormatID(HTML_MIME);
If cfHTMLFormat = 0 Then
cfHTMLFormat := RegisterClipboardFormat(HTML_MIME);
iStartHTML := 105;
iStartFragment := iStartHTML + Length(HEADER);
iEndFragment := iStartFragment + Length(AHTML) + Length(FOOTER1);
iEndHTML := iEndFragment + LENGTH(FOOTER2);
// Fejléc és nyitó html cimkék elhelyezése a karakterlánc elején
HTMLSource := Format(NATIVEHEADER, [iStartHTML, iEndHTML, iStartFragment,
iEndFragment]) + HEADER + AHTML + FOOTER1 + FOOTER2;
Clipboard.AddFormat(cfHTMLFormat, HTMLSource[1], Length(HTMLSource));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Clipboard.Clear;
Clipboard.AsText:='Egyszerű szöveg';
AddHTMLToClipboard('<b>Kövér szöveg</b>');
end;
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...
Kép
Betöltés vágólapról
uses
Clipbrd, LCLIntf, LCLType, ...;
procedure LoadBitmapFromClipboard(Bitmap: TBitmap);
begin
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfDelphiBitmap)) then
Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfDelphiBitmap));
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfBitmap)) then
Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfBitmap));
end;
Mentés vágólapra
uses
Clipbrd, ...;
procedure SaveBitmapToClipboard(Bitmap: TBitmap);
begin
Clipboard.Assign(Bitmap);
end;
Értesítés a változásokról
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
Példa saját üzenetkezelő kidolgozására:
unit Unit1;
{$mode delphi}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
Clipbrd, StdCtrls, Windows, Messages;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FNextClipboardOwner: HWnd; // A következő vágólapkezelő
// A vágólap eseményeit kezelő eljárások következnek
function WMChangeCBChain(wParam: WParam; lParam: LParam):LRESULT;
function WMDrawClipboard(wParam: WParam; lParam: LParam):LRESULT;
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
var
PrevWndProc:windows.WNDPROC;
function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam;
lParam: LParam): LRESULT; stdcall;
begin
if uMsg = WM_CHANGECBCHAIN then begin
Result := Form1.WMChangeCBChain(wParam, lParam);
Exit;
end
else if uMsg=WM_DRAWCLIPBOARD then begin
Result := Form1.WMDrawClipboard(wParam, lParam);
Exit;
end;
Result := CallWindowProc(PrevWndProc, Ahwnd, uMsg, WParam, LParam);
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
PrevWndProc := Windows.WNDPROC(SetWindowLong(Self.Handle, GWL_WNDPROC, PtrInt(@WndCallback)));
FNextClipboardOwner := SetClipboardViewer(Self.Handle);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ChangeClipboardChain(Handle, FNextClipboardOwner);
end;
function TForm1.WMChangeCBChain(wParam: WParam; lParam: LParam): LRESULT;
var
Remove, Next: THandle;
begin
Remove := WParam;
Next := LParam;
if FNextClipboardOwner = Remove then FNextClipboardOwner := Next
else if FNextClipboardOwner <> 0 then
SendMessage(FNextClipboardOwner, WM_ChangeCBChain, Remove, Next)
end;
function TForm1.WMDrawClipboard(wParam: WParam; lParam: LParam): LRESULT;
begin
if Clipboard.HasFormat(CF_TEXT) Then Begin
ShowMessage(Clipboard.AsText);
end;
SendMessage(FNextClipboardOwner, WM_DRAWCLIPBOARD, 0, 0); // NAGYON FONTOS!
Result := 0;
end;
end.