@NewPeople

Почему в буфер вставляется только первый символ?

Почему в буфер вставляется только первый символ?
Код

function SetClipboardText(Wnd: HWND; Value: string): Boolean;
var
  hData: HGlobal;
  pData: pointer;
  Len: integer;
begin
  Result:=True;
  if OpenClipboard(Wnd) then
  begin
  try
  Len:=Length(Value)+1;
  Form1.Edit1.Text := IntToStr(Len);
  hData:=GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, Len); // Памяти выделенно согласно размеру строки
  try
  pData:=GlobalLock(hData);
  try
  Move(PChar(Value)^, pData^, Len); // считаю что загвоздка тут, но судя документации все верно
  EmptyClipboard;
  SetClipboardData(CF_Text, hData);
  finally
  GlobalUnlock(hData);
  end;
  except
  GlobalFree(hData);
  raise
  end;
  finally
  CloseClipboard;
  end;
  end
  else Result:=False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetClipboardText(Handle, 'https://t.me/');
end;


Результат
6382376333644233435775.jpeg


про библиотеку Clipbrd, знаю, не надо ее советовать, буду рад услышать где кроется ошибка в коде выше.
  • Вопрос задан
  • 59 просмотров
Решения вопроса 2
OCTAGRAM
@OCTAGRAM
Описание CF_TEXT (1):

Text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. Use this format for ANSI text.


В Юникодных версиях Delphi обычный тип string = UnicodeString. А PChar = PWideChar. В этом формате символы кодируются двухбайтовыми числами. Все платформы, поддерживаемые Delphi, little endian, и это значит, что если число состоит из двух байт, то сначала идёт младший, а потом старший. У латинских букв и простых символов пунктуации номера маленькие, в диапазоне 32-126, для них хватает 7 бит. Так что номер буквы h в двухбайтовом представлении состоит из одного младшего байта с номером буквы h и неиспользуемым нулевым старшим байтом. По формату CF_TEXT нулевой байт значит конец строки.

В юникодных Delphi вам нужен формат CF_UNICODETEXT. А под память нужно выделять и копировать (2 * Length(Value) + 2) байт.
Ответ написан
HemulGM
@HemulGM Куратор тега Delphi
Delphi Developer, сис. админ
Используй стандартный модуль clipbrd. Там в одну строку поместишь текст в буфер
uses Clipbrd;

Clipboard.AsText := 'text';
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы