Newsgroup: it.comp.lang.delphi
Titolo: Sagoma che appare durante il Drag & Dock

Premessa:
Sto cercando di intervenire sul disegno della "sagoma" che si vede durante 
un'operazione di Drag & Dock. Precisamente, quella che ricalca i contorni 
del 
controllo mentre esso è "floating" (E1) e non quella, diciamo così, di 
"anteprima dei bordi del controllo dopo il docking" (E2).
Descrizione:
1) una form principale M e una form secondaria D;
2) la form M ha un Panel, che chiamiamo P, il quale ha le seguenti 
proprietà: 
DockSite = True, Height = 0 e Align = alBottom;
3) una funzione che modifica l'altezza di un rettangolo:
function SetRectHeight(Rect: TRect; NewHeight: Integer; ToTop: Boolean): 
TRect;
{ Restituisce un rettangolo avente le stesse coordinate di Rect, ma con 
altezza pari a NewHeight.
  Se ToTop è False, il lato superiore rimane fermo e viene modificato il 
lato 
inferiore,
  se ToTop è True, il lato inferiore rimane fermo, e viene modificato il 
lato 
superiore.}
begin
  Result:= Rect;
  with Result do
    if ToTop then
      Top:= Bottom - NewHeight
    else
      Bottom:= Bottom + NewHeight
end;
4) il panel M.P ha i seguenti eventi:
//Evento OnStartDock 
//[PROBLEMA]
procedure M.PStartDock(Sender: TObject;
  var DragObject: TDragDockObject);
begin
//tentiamo di intervenire sul disegno di (E1) - vedi premessa
//  DragObject:= TDragDockObjectEx.Create(M.P);   
//nota che un TDragDockObjectEx viene liberato automaticamente
//al termine del docking
//  DragObject.DockRect:= //??? non sembra avere effetti;
end;
//Evento OnGetSiteInfo
procedure M.PGetSiteInfo(Sender: TObject;
  DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint;
  var CanDock: Boolean);
begin
//  InfluenceRect:= 
//questa ha effetto sul rettangolo di influenza del
//docking: solo se il cursore del mouse ricade in InfluenceRect,
//il docking verrà eseguito.
//InfluenceRect NON è un rettangolo che viene disegnato o mostrato
//in alcun modo.
end;
//Evento OnDockOver
procedure M.PDockOver(Sender: TObject;
  Source: TDragDockObject; X, Y: Integer; State: TDragState;
  var Accept: Boolean);
begin
//qui impostiamo l'altezza del rettangolo dell' 
//"anteprima del controllo dopo il docking" (E2) - vedi premessa
  Source.DockRect:= SetRectHeight(Source.DockRect, 300, True);
end;
5) la form D ha le seguenti proprietà: DragKind = dkDock e DragMode = 
dmAutomatic;
6) la form D ha questo evento:
//Evento OnStartDock
//[PROBLEMA]
procedure D.FormStartDock(Sender: TObject;
  var DragObject: TDragDockObject);
begin
//tentiamo anche qui di intervenire su (E1) - vedi premessa
  DragObject:= TDragDockObjectEx.Create(Self);
  DragObject.Brush.Color:= clPurple;  //questo HA effetto
  DragObject.DockRect:= SetRectHeight(BoundsRect, 150);   //questo NO!!
end;
Problema:
- non riesco a modificare le dimensioni di (E1), in questo caso il 
contorno 
della form D.
Precisazioni:
1) non so se quanto appena riportato costituisca in effetti un esempio 
funzionante, in quanto ho preso il mio caso reale e l'ho depurato da tutte 
le 
parti non necessarie all'individuazione del problema;
2) dalle prove fatte, ho potuto constatare il seguente ordine degli 
eventi, 
durante un'operazione di Drag&Dock (vale la stessa convenzione adottata 
prima 
per le form M e D, in particolare M.P è il pannello che funge da 
DockSite):
2.a) rendere fluttuante la form D che era già dockata:
2.a.1) D.StartDock (nell'istante MouseDown);
2.a.2) M.P.UnDock (nell'istante MouseUp);
2.a.3) D.CMFLOAT (nell'istante MouseUp);
2.a.4) D.EndDock (nell'istante MouseUp);
2.b) fare il docking della form D che era fluttuante:
2.b.1) D.StartDock (nell'istante MouseDown);
2.b.2) numerosi M.P.GetSiteInfo e M.P.DockOver (a ogni MouseMove);
2.b.3) M.P.DockDrop (nell'istante MouseUp);
2.b.4) D.EndDock (nell'istante MouseUp);
3) l'immagine del contorno di (E1) e (E2) viene disegnata con un pattern 
PATINVERT da TDragDockObject.DrawDragDockImage.
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

Carissimo, prova con:
ReleaseCapture;
SendMessage(TWinControl(Sender).Handle,WM_SYSCOMMAND,Car,0);
Car puo essere:
$F003
$F006
$F001
$F002
$F011
Saluti
--
////////////////////////////////////////////////////////////////////////////
////////////////////
 Luigi "Delphi Knight" Nalli
 Senior Developer
 
http://www.itentropy.it
  - iTentroPy: Teaching Portal -
Colui il quale cerca di ponderare l'entropia
E' lo stesso che necessita del futuro per vivere nel presente.
La necessità non ha giustificazione.
Non misuratevi con l'entropia, cullatevi su di essa.
////////////////////////////////////////////////////////////////////////////
////////////////////