Вот что пока получилось
program Project1;
uses
Windows,KOL;
type
PForm1 = ^TForm1;
TForm1 = object(TObj)
Form: PControl;
protected
Memo:PControl;
public
procedure W_MouseDown(Sender: PControl; var Mouse: TMouseEventData);
procedure PMMove (Sender: PMenu; Item: Integer);
procedure PMExit(Sender: PMenu; Item: Integer);
end;
var
Form1: PForm1;
PopupMenu:pmenu;
dragging:boolean;
Procedure TForm1.W_MouseDown(Sender: PControl; var Mouse: TMouseEventData);
begin
if (Mouse.Button = mbLeft)and dragging then form.DragStart
end;
procedure TForm1.PMMove (Sender: PMenu; Item: Integer);
begin
form.Caption:='something Move';
if not dragging then begin dragging:=true;PopupMenu.ItemChecked[0]:=true; end
else begin dragging:=false;PopupMenu.ItemChecked[0]:=false; end;
memo.MouseTransparent;
end;
procedure TForm1.PMExit(Sender: PMenu; Item: Integer);
begin
form.Close
end;
procedure NewForm1(var Result: PForm1; AParent: PControl);
var
Style: Integer;
begin
New(Result, Create);
with Result^ do
begin
form := NewForm(AParent, 'PDragMemoForm');
form.Add2AutoFree(Result);
Applet := Form;
form.SetClientSize(320, 240).CenterOnParent;
form.HasCaption := False;
form.HasBorder := False;
form.Color:=$00FFB3B3;
NewMenu( form, 0, [ '' ], nil );
PopupMenu := NewMenu( form, 0, ['Переместить','-' , 'Выход'], nil );
PopupMenu.AssignEvents( 0, [PMMove] );
PopupMenu.AssignEvents( 2, [PMExit] );
Memo:=NewEditBox(form,[eoMultiline, eoNoHScroll]);
Memo.Color := clWindow;
Memo.setalign(caClient);
Memo.Font.FontHeight := 24;
Memo.Font.FontName:='Comic Sans MS';
Memo.text:='SubMenu - дескриптор подчиненного меню. Фактически, эквивалентен Handle;'+
'MenuID - внутренний числовой \"идентификатор\" элемента меню, назначается кодом KOL.'+
'Т.к. число доступных идентификаторов не может превышать 65535, и эти идентификаторы'+
'не могут переиспользоваться повторно, то не следует постоянно в процессе длительной'+
'работы создавать и удалять пункты меню слишком часто. В том числе, не следует делать'+
'их \"скрытыми\", т.к. сокрытие и показ пунктов меню реализуется именно как уничтожение'+
'и создание новых элементов (в Windows нет возможности прятать пункты меню по-другому).'+
'Вместо этого рекомендуется использовать возможность делать пункты меню недоступными или'+
'доступными (разрешенными - enabled) по мере надобности;';
Memo.SetAutoPopupMenu( PopupMenu );
Form.OnMouseDown := W_MouseDown;
Form.SetAutoPopupMenu( PopupMenu );
SetProcessWorkingSetSize(GetCurrentProcess, Cardinal(-1), Cardinal(-1));
dragging:=false;
end;
end;
begin
NewForm1(Form1, nil);
Run(Form1.Form);
end.
Если не перемещать то мышью курсор можно переставить в любую часть мемо. Если переместить, то курсор будет в одном месте. Клики теперь идут по форме поэтому он двигается только с помощью стрелок на клавиатуре.