Буфер обмена
Столкнулся с проблемой вставки в Clipboard русского текста в Win2K, WinXP. Залез в DRKB.. Ну да, там вариант предложен довольно смешной (создать TRichEdit, вставить в него clipboard, весь текст пометить русским, и вернуть в clipboard)... Всё бы ничего, но если у меня программа без форм, да и без окон вообще, то TRichEdit не создаётся ('Control has no parent window') . Почитал хелп, посмотрел, что именно Вынь сует в буфер на разных языках, и нашёл простой и красивый способ. Имхо, ему там и место - в разделе "Буфер обмена".
- Подробности
- Родительская категория: Буфер обмена
- Категория: Буфер обмена и потоки (Stream), файлы, строки
Code: |
var pbRect: TRect; begin pbRect := Rect(0, 0, PaintBox1.Width, PaintBox1.Height); BitMap := TBitMap.Create; try Bitmap.Width := PaintBox1.Width; Bitmap.Height := PaintBox1.Height; BitMap.Canvas.CopyRect(pbRect, PaintBox1.Canvas, pbRect); ClipBoard.Assign(BitMap); finally BitMap.Free; end; end;
|
- Подробности
- Родительская категория: Буфер обмена
- Категория: Буфер обмена и прочее
Как копировать и вставлять картинки через буфер обмена? |
Previous Top Next |
Некоторые функции для копирования и вставки Bitmap-объектов через буфер обмена.
- Подробности
- Родительская категория: Буфер обмена
- Категория: Буфер обмена и прочее
Code: |
procedure TForm1.Button1Click(Sender: TObject); var b : tbitmap; fr: TFormatRange; r : TRect; begin b:=tbitmap.create; b.width:=rxrichedit1.width; b.height:=rxrichedit1.height; r:=rect(0,0,RXRichEdit1.Width*screen.Pixelsperinch, RXRichEdit1.Height*screen.Pixelsperinch); fr.hdc:=b.Canvas.handle; fr.hdctarget:=b.Canvas.handle; fr.rc:=r; fr.rcpage:=r; fr.chrg.cpMin:=0; fr.chrg.cpMax:=-1; Sendmessage(RXRichEdit1.handle,EM_FORMATRANGE,1,longint(@fr)); image1.Picture.assign(b); b.free; end;
|
- Подробности
- Родительская категория: Буфер обмена
- Категория: Буфер обмена и прочее
Code: |
procedure CopyStringToClipboard(s: string); var hg: THandle; P: PChar; begin hg:=GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, Length(S)+1); P:=GlobalLock(hg); StrPCopy(P, s); GlobalUnlock(hg); OpenClipboard(Application.Handle); SetClipboardData(CF_TEXT, hg); CloseClipboard; GlobalFree(hg); end;
|
- Подробности
- Родительская категория: Буфер обмена
- Категория: Буфер обмена и прочее
Code: |
procedure TForm1.BtnShowFormatsClick(Sender: TObject); var buf: array[0..60] of Char; n: Integer; fmt: Word; name: string[30]; begin MemFormats.Clear; for n := 0 to Clipboard.FormatCount - 1 do begin fmt := Clipboard.Formats[n]; if GetclipboardFormatName(fmt, buf, Pred(Sizeof(buf))) <> 0 then MemFormats.Lines.Add(StrPas(buf)) else begin case fmt of 1: name := 'CF_TEXT'; 2: name := 'CF_BITMAP'; 3: name := 'CF_METAFILEPICT'; 4: name := 'CF_SYLK'; 5: name := 'CF_DIF'; 6: name := 'CF_TIFF'; 7: name := 'CF_OEMTEXT'; 8: name := 'CF_DIB'; 9: name := 'CF_PALETTE'; 10: name := 'CF_PENDATA'; 11: name := 'CF_RIFF'; 12: name := 'CF_WAVE'; 13: name := 'CF_UNICODETEXT'; 14: name := 'CF_ENHMETAFILE'; 15: name := 'CF_HDROP (Win 95)'; 16: name := 'CF_LOCALE (Win 95)'; 17: name := 'CF_MAX (Win 95)'; $0080: name := 'CF_OWNERDISPLAY'; $0081: name := 'CF_DSPTEXT'; $0082: name := 'CF_DSPBITMAP'; $0083: name := 'CF_DSPMETAFILEPICT'; $008E: name := 'CF_DSPENHMETAFILE'; $0200..$02FF: name := 'частный формат'; $0300..$03FF: name := 'Объект GDI'; else name := 'неизвестный формат'; end; MemFormats.Lines.Add(name); end; end; end; |
- Подробности
- Родительская категория: Буфер обмена
- Категория: Буфер обмена и прочее
TClipboard обеспечивает легкий доступ к буферу обмена. Но что делать, если вы хотите добавить (несколько) определенных элементов в буфер обмена?
Для всех действий требуется unit Clipboard.
- Подробности
- Родительская категория: Буфер обмена
- Категория: Буфер обмена и прочее
Пример использования:
Code: |
procedure TForm1.Button1Click(Sender: TObject); begin SetClipboardText(Handle, 'qwerty'); end; |
- Подробности
- Родительская категория: Буфер обмена
- Категория: Буфер обмена и прочее
Code: |
uses clipbrd;
procedure TShowVRML.Kopieren1Click(Sender: TObject); var bitmap: tbitmap; begin bitmap := tbitmap.create; bitmap.width := clientwidth; bitmap.height := clientheight; try with bitmap.Canvas do CopyRect(clientrect, canvas, clientrect); clipboard.assign(bitmap); finally bitmap.free; end; end;
|
- Подробности
- Родительская категория: Буфер обмена
- Категория: Буфер обмена и прочее
Code: |
procedure TForm1.Button1Click(Sender: TObject); var mf: TMetaFile; mfc: TMetaFileCanvas; i: integer; ClipBrdFormat: word; data: cardinal; palette: hPalette; p: array [0..90] of TPoint; begin mf := TMetaFile.Create; mf.Width := 100; mf.Height := 100; mfc := TMetafileCanvas.Create(mf, 0); with mfc do begin Pen.Color := clBlack; FrameRect(ClipRect);
MoveTo(0, 50); LineTo(100, 50); LineTo(95, 48); MoveTo(100, 50); LineTo(95, 52);
MoveTo(50, 100); LineTo(50, 0); LineTo(48, 5); MoveTo(50, 0); LineTo(52, 5);
Brush.Style := bsClear; Font.name := 'arial'; Font.Size := 6; TextOut(55, 0, 'Y'); TextOut(95, 38, 'X');
Pen.Color := clRed; for i := low(p) to high(p) do p[i] := Point(i, round(50 - 30 * sin((i - 50) / 5))); Polyline(p); end; mfc.Free; mf.SaveToClipboardFormat(ClipBrdFormat, data, palette);
OpenClipboard(Application.Handle); EmptyClipboard; SetClipboardData(ClipBrdFormat, data); CloseClipboard;
mf.Inch := 200; Form1.Canvas.Draw(0, 0, mf); mf.Free; end; |
- Подробности
- Родительская категория: Буфер обмена
- Категория: Буфер обмена и прочее
*Просто создайте новую форму и назовите его ClipFormats.
*Поместите TButton и вызывай его btnUpdate.
*Поместите лист бокс и вызывай его lbFormats.
Затем просто добавьте приведенный ниже код и подключить все обработчики событий.
Все это делает дисплей в настоящее время все форматы в буфере обмена и
обновления как только изменения буфера обмена.
- Подробности
- Родительская категория: Буфер обмена
- Категория: Общие вопросы
Страница 2 из 4