Уже долгое время пытаюсь перевести код из Delphi в Lazarus.
Решил обратится за помощью на форум.
Дело в следующем.
Есть форма Form1, в ней компонент Memo1.
При каждом копировании текстовой информации, например из строки браузера,
в Memo1 в новую строку должно добавлятся содержимое буфера обмена.
В делфи для этой цели я использовал следующий код, который выпытал методом поисков и ошибок на форуме:
http://www.delphimaster.ru/cgi-bin/foru ... 70409&n=18
- Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Clipbrd;
type
{ TForm1 }
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ private declarations }
HandleNext: HWND;
procedure OnDrawClipboard(var msg: TWMDrawClipboard);
message WM_DRAWCLIPBOARD;
procedure OnChangeCBChain(var msg: TWMChangeCBChain);
message WM_CHANGECBCHAIN;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
HandleNext:= SetClipboardViewer(Handle);
end;
procedure TForm1.OnDrawClipboard(var msg: TWMDrawClipboard);
begin
if Clipboard.HasFormat(CF_TEXT) then
Memo1.Lines.Add(Clipboard.AsText);
inherited
end;
procedure TForm1.OnChangeCBChain(var msg: TWMChangeCBChain);
begin
if msg.Remove = HandleNext then
HandleNext := msg.Next;
inherited
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ChangeClipboardChain (Handle, HandleNext);
end;
end.
При попытке использовать данный код в Lazarus
Наткнулся на то, что компилятор выдал несколько ошибок.
unit1.pas(22,52)Error: Identifier not found "TWMDrawClipboard"
unit1.pas(24,52)Error: Identifier not found "TWMChangeCBChain"
unit1.pas(33,1)Fatal: There were 2 errors compiling module, stopping
Не зная как исправить ошибки продолжил поиск и
наткнулся на сайт http://www.drkb.ru/ где в справке drkb3.chm нашёл похожий код,но тоже для Delphi.
- Код: Выделить всё
unit Unit1;
{©Drkb v.3(2007): www.drkb.ru}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
hwndNextViewer: THandle;
procedure WMChangeCbChain(var Message: TWMChangeCBChain); message WM_CHANGECBCHAIN;
procedure WMDrawClipboard(var Message: TMessage); message WM_DRAWCLIPBOARD;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
// Добавляем наше окно в цепочку
// зарегистрированных наблюдателей буффера обмена
hwndNextViewer := SetClipboardViewer(Handle);
Memo1.Lines.Clear
end;
procedure TForm1.WMChangeCbChain(var Message: TWMChangeCBChain);
begin
with Message do
begin
// If the next window is closing, repair the chain.
if Remove = hwndNextViewer then
hwndNextViewer := Next
// Otherwise, pass the message to the next link.
else
if hwndNextViewer <> 0 then
SendMessage(hwndNextViewer, Msg, Remove, Next);
end;
end;
// clipboard contents changed.
procedure TForm1.WMDrawClipboard(var Message: TMessage);
begin
// Pass the message to the next window in clipboard
// viewer chain.
Memo1.Lines.Add('Сhanged');
with Message do
SendMessage(hwndNextViewer, Msg, WParam, LParam);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ChangeClipboardChain(Handle, hwndNextViewer);
end;
end.
Во время компиляции этого кода в Lazarus
получается ошибка: Unit.pas(22,58) Error:Identifier not found "TWMChangeCBChain"
Решил заменить везде (var Message: TWMChangeCBChain); на (var Message: TMessage);
Компилирую опять. Теперь компилятор останавливается и выдаёт 3 ошибки.
unit1.pas(53,13) Error:Identifier not found Remove
unit1.pas(56,24) Error:Incompatible types: got "untyped" expected "QWord"
unit1.pas(58,43) Error:Identifier not found Remove
К сожалению не знаю как их исправить,
По этому обращаюсь на этот форум с надеждой что получу верный ответ.
В поисках решения нашёл также ссылки:
http://forum.lazarus.freepascal.org/ind ... ic=15488.0
http://forum.sources.ru/index.php?showtopic=91342
Прошу помочь.
Думаю, что и в первом варианте кода возможно изменить этот код для Lazarus.