Difference between revisions of "Clipboard/hu"

From Lazarus wiki
Jump to navigationJump to search
(Created page with "{{Clipboard}} <font size="7">Vágólap</font> Folyamatban... __TOC__ ==Előre definiált típusok== {| class="wikitable sortable" ! TPredefinedClipboardFormat !! MIME tí...")
 
m (Fixed syntax highlighting)
 
(9 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>
 
   
 
   
Folyamatban...
 
 
 
__TOC__
 
__TOC__
 
==Előre definiált típusok==
 
==Előre definiált típusok==
Line 20: Line 19:
 
|-
 
|-
 
| pcfPicture || image/lcl.picture
 
| pcfPicture || image/lcl.picture
 +
|-
 +
| pcfMetaFilePict || image/lcl.metafilepict
 
|-
 
|-
 
| pcfObject || application/lcl.object
 
| pcfObject || application/lcl.object
Line 27: Line 28:
 
| pcfCustomData || application/lcl.customdata
 
| pcfCustomData || application/lcl.customdata
 
|-
 
|-
| pcfDelphiText || text/plain
 
|-
 
| pcfDelphiBitmap || text/delphi.bitmap
 
|-
 
| pcfDelphiPicture || Delphi picture
 
|-
 
| pcfDelphiMetaFilePict || image/delphimetafilepict
 
|-
 
| pcfDelphiObject || application/delphi.object
 
|-
 
| pcfDelphiComponent || Delphi component
 
|-
 
| pcfKylixPicture || image/delphi.picture
 
|-
 
| pcfKylixBitmap || image/delphi.bitmap
 
|-
 
| pcfKylixDrawing || image/delphi.drawing
 
|-
 
| pcfKylixComponent || application/delphi.component
 
 
|}
 
|}
  
Line 53: 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öveges irányultságú komponensek==
+
==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 97: 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 104:
 
<p>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ó:</p>
 
<p>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ó:</p>
 
<p>https://msdn.microsoft.com/en-us/library/aa767917%28v=vs.85%29.aspx</p>
 
<p>https://msdn.microsoft.com/en-us/library/aa767917%28v=vs.85%29.aspx</p>
<p>(if URL changes, Document title: '''HTML Clipboard Format''', and is part of the '''MSHTML Editing''' documentation)</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 171: 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 184: Line 174:
 
===Mentés vágólapra===
 
===Mentés vágólapra===
  
<syntaxhighlight>uses  
+
<syntaxhighlight lang="pascal">
 +
uses  
 
   Clipbrd, ...;
 
   Clipbrd, ...;
  
Line 191: 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 202: 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 218: Line 210:
 
     procedure FormDestroy(Sender: TObject);
 
     procedure FormDestroy(Sender: TObject);
 
   private
 
   private
     FNextClipboardOwner: HWnd;  // handle to the next viewer
+
     FNextClipboardOwner: HWnd;  // A következő vágólapkezelő
     // Here are the clipboard event handlers
+
     // 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 277: Line 269:
 
     ShowMessage(Clipboard.AsText);
 
     ShowMessage(Clipboard.AsText);
 
   end;
 
   end;
   SendMessage(FNextClipboardOwner, WM_DRAWCLIPBOARD, 0, 0);  // VERY IMPORTANT
+
   SendMessage(FNextClipboardOwner, WM_DRAWCLIPBOARD, 0, 0);  // NAGYON FONTOS!
 
   Result := 0;
 
   Result := 0;
 
end;
 
end;
Line 286: 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]
 
[[Category:Tutorials]]
 

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.

Külső hivatkozások