Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

Помогите разобраться с буфером обмена.   Найти похожие ветки 

 
mike ilin   (2006-04-13 09:24) [0]

Крик о помощи. Помогите разобраться с буфером обмена.
Надо записать в буфер обмена, и в последствии считать динамический массив.
Type
 DecSimD = record
   g,b: Byte;
   x,y,r: Double;
 end;
 GrSimD = array of DecSimD;
Var
 CF_PERSONDATA: word;

implementation

Пробовал два варианта.
 //=== вариант №1
procedure TLineClipboard.CopyToClipboard(GSD: GrSimD);
var
 l,i: word;
 Data:THandle;
 DataPtr:Pointer;
begin //CopyToClipboard
l := Length(GSD);
 Data:=GlobalAlloc(GMEM_MOVEABLE, SizeOf(l)+SizeOf(DecSimD)*l);
 try
   DataPtr:=GlobalLock(Data);
   Move(l, DataPtr^, SizeOf(l));
   for i := 0 to l-1 do Move(GSD[i], DataPtr^, SizeOf(DecSimD));
   Clipboard.Open;
   Clipboard.SetAsHandle(CF_PERSONDATA, Data);
   Clipboard.Close;
   GlobalUnlock(Data);
 except
   GlobalFree(Data);
 end;
end;  //CopyToClipboard

function TLineClipboard.PasteFromClipboard(var GSD: GrSimD): boolean;
var
 l,i: word;
 Data:THandle;
 DataPtr:Pointer;
begin //PasteFromClipboard
 Data := ClipBoard.GetAsHandle(CF_PERSONDATA);
 if Data = 0 then    result := false
 else
 begin
   result := true;
   DataPtr:=GlobalLock(Data);
   Move(DataPtr^, l, SizeOf(l));
   SetLength(GSD,l);
   for i := 0 to l-1 do Move(DataPtr^, GSD[i], SizeOf(DecSimD));
   GlobalUnlock(Data);
 end;
end;  //PasteFromClipboard

 //=== вариант №2 с использованием потока
procedure TLineClipboard.CopyToClipboard(GSD: GrSimD);
var
 l,i: word;
 Data:THandle;
 DataPtr:Pointer;
 fs: TMemoryStream;
begin //CopyToClipboard
 l := Length(GSD);
 fs := TMemoryStream.Create;
 fs.WriteBuffer(l,SizeOf(l));
 for i := 0 to l-1 do fs.WriteBuffer(GSD[i],SizeOf(DecSimD));
 l := fs.Seek(0,soFromEnd);
 Data:=GlobalAlloc(GMEM_MOVEABLE, l);
 try
   DataPtr:=GlobalLock(Data);
   fs.Seek(0,soFromBeginning);
   fs.ReadBuffer(DataPtr^,l);
   Clipboard.Open;
   Clipboard.SetAsHandle(CF_PERSONDATA, Data);
   Clipboard.Close;
   GlobalUnlock(Data);
 except
   GlobalFree(Data);
 end;
 fs.Free;
end;  //CopyToClipboard

function TLineClipboard.PasteFromClipboard(var GSD: GrSimD): boolean;
var
 l,i: word;
 Data:THandle;
 DataPtr:Pointer;
 fs: TMemoryStream;
begin //PasteFromClipboard
 Data := ClipBoard.GetAsHandle(CF_PERSONDATA);
 if Data = 0 then result := false;
 else
 begin
   result := true;
   DataPtr:=GlobalLock(Data);
   fs := TMemoryStream.Create;
   fs.WriteBuffer(DataPtr^,SizeOf(DataPtr^));
   fs.Seek(0,soFromBeginning);
   fs.Read(l,SizeOf(l));
   SetLength(GSD,l);
   for i := 0 to l-1 do fs.ReadBuffer(GSD[i],SizeOf(DecSimD));
   fs.Free;
   GlobalUnlock(Data);
 end;
end;  //PasteFromClipboard

Дело в том, что я не совсем представляю, как работает Move и поэтому попробовал потоки, но всё равно оба варианта не дали результата.
За любую помощь буду очень благодарен.
Андрей.


 
Альф   (2006-04-13 09:41) [1]

Самый простой способ - переводить при copy/paste ваши данные в текстовый вид и пользоваться стандартными средствами.
В случае с динамическим массивом записей - простой текст с разделителем #9.

Этот способ, к тому же, даст возможность брать из буффера обмена ваши данные другим программам - а не только вашей.


 
balepa ©   (2006-04-13 10:22) [2]

Веди его щас мы с ним разберемся :)
Вроде вчера был подобный вопрос, поищи в форумах


 
GrayFace ©   (2006-04-13 11:14) [3]

> Альф
> В случае с динамическим массивом записей - простой текст
> с разделителем #9.

Нет, лучше просто память скопировать. Как буду дома, приведу пример.


 
GrayFace ©   (2006-04-14 15:48) [4]

Копирование - TClipboard.SetBuffer (uses Clipbrd)

Вставка:

function LoadClipboard(Format:DWord):TRSByteArray;
var h:THandle; DataPtr:pointer; Size:DWord;
begin
 if not IsClipboardFormatAvailable(Format) then
   exit;

 DataPtr:=nil;
 h:=0; // Чтоб компиллятор не ругался
 Clipboard.Open;
 try
   h:=Clipboard.GetAsHandle(Format);
   if h=0 then RaiseLastOSError;
   DataPtr:=GlobalLock(h);
   if DataPtr=nil then RaiseLastOSError;
   Size:=GlobalSize(h);
   SetLength(Result, Size);
   CopyMemory(ptr(Result), DataPtr, Size);
 finally
   if DataPtr<>nil then
     GlobalUnlock(h);
   Clipboard.Close;
 end;
end;


где TRSByteArray = array of byte;



Страницы: 1 вся ветка

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.008 c
2-1144838707
@gent
2006-04-12 14:45
2006.04.30
Как залить сервис в сервисы ?


2-1144814654
Rubey
2006-04-12 08:04
2006.04.30
Круглые кнопки


1-1143212389
TSM
2006-03-24 17:59
2006.04.30
Rave Report Anchor и растяжка рамки


2-1145128479
Системщик
2006-04-15 23:14
2006.04.30
SOS


2-1145038924
R2D2
2006-04-14 22:22
2006.04.30
Алгоритм Диффи-Хелмана





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский