Autor Téma: Jak dokovat nebo vedle sebe "položit" okna?  (Přečteno 165 krát)

Offline Ladislav Kastl

  • Nováček
  • *
  • Příspěvků: 2
  • Karma: 0
    • Verze Delphi: XE6
Jak dokovat nebo vedle sebe "položit" okna?
« kdy: 23-05-2021, 17:46:57 »
Pro jednoduchost Form1 a Form2.

Pro dokování Form1 a Form2 do nově vytvořeného okna ( ConjoinDockHost ) je dobře fungující příklad někde v Delphi help.
Form1 i Form2 mají property DragKind nastaveny na dkDock.

Potřebuju ale zařídit, aby při posunu jednoho okna (např. Form1) k okraji monitoru se Form1 k tomu okraji "přimkl" (align) (podobně, jako by měl aling alLeft (případně alRight) - ale jen změnou BoundsRect) a ten druhý (Form2) aby se nějak srovnal s Form1 (nějak jako v Split manager).
Jak zjistím, že se Form1 přiblížil k okraji monitoru?
Když má Form1 nastaven DragKind na dkDock, pak WMMove, WMMoving, WMWindowPosChanging... se nespustí.

Odkud bere Form2 v event
TForm2.FormDockOver(Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
souřadnice X,Y myši "tahaného" Form1 (bohužel jen v okolí Form2)?
Nepodařilo se mně odchytit, kde zjistit souřadnice tahaného Form1.

Když má Form1 nastaven DragKind na dkDrag, zase Form2 se "nezná" k Form1 a o dokování "nestojí".
Ani když při pohybu Form1 nad Form2 změním ve Form1 dkDrag na dkDock.
(Teprve když uvolním levý knoflík myši a zase jej stisknu)

Offline Ladislav Kastl

  • Nováček
  • *
  • Příspěvků: 2
  • Karma: 0
    • Verze Delphi: XE6
Re:Jak dokovat nebo vedle sebe "položit" okna?
« Odpověď #1 kdy: 27-05-2021, 15:50:36 »
Když má Form1 nastaven DragKind na dkDock, pak při tahání Form1 myší se vlastně tahá DragDockObject, ktedý se vytvoří v proceduře (event) OnStartDock

procedure TForm1.FormStartDock(Sender: TObject; var DragObject: TDragDockObject);
begin
  // create a customized DragDropObject
  DragObject:= TTransparentDragDockObject.Create(Self);
  .....

Takže pohyb myší se odchytí v override procedure WndProc toho DragDockObjectu

procedure TTransparentDragDockObject.WndProc(var Msg: TMessage);
var
  Pt: TPoint;
begin
  inherited;
  try
    case Msg.Msg of
      WM_MOUSEMOVE:
        begin
          Pt := SmallPointToPoint(TWMMouse(Msg).Pos);
          .......
        end;
     end;
......