procedure TForm1.resizerMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin If Button = mbLeft Then begin ReleaseCapture(); SendMessage(TPanel(resizer).Handle,WM_NCLBUTTONDOWN,HTCAPTION, 0); end;
end;
Men på koordinaterne (344,433) vil jeg ikke have, at den skal kunne flytte sig længere. Hvis resizer.top bliver mindre end 433, skal den ikke kunne blive flyttet yderligere opad. Ligesåvel som hvis resizer.left bliver mindre end 344, så skal den ikke kunne flyttes længere til venstre.
Dog skal det fortsat være sådan, at den stadig kan flytte sig nedad eller til højre. Sålænge den ikke rammer de nævnte koordinater.
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Du vil flytte formen indenfor et afgrænset område (lad være med at kalde det et objekt - det forvirrer).
Det her er ikke perfekt, men der er funktionen "ClientToScreen" der giver dig den absolutte position i forhold til skærmen:
procedure TfrmMain.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var RelPoint, AbsPoint : TPoint; WinControl : TWinControl; begin WinControl := Sender as TWinControl;
if Button = mbLeft Then begin RelPoint := Point(WinControl.Left,WinControl.Top); // Point(X,Y); AbsPoint := ClientToScreen(RelPoint); if (AbsPoint.X > 344) and (AbsPoint.Y > 433) then begin ReleaseCapture(); SendMessage(WinControl.Handle,WM_NCLBUTTONDOWN,HTCAPTION, 0); end; end; end;
Du skal videre med subclassing af "nu flytter vi formen"-messages. Altså noget med at hægte sig på den kæde af kode der håndterer at formen flyttes og "æde" den hvis den går over grænsen.
Alt er relativt. Gu' virker det sådan som det er programmeret - det virker nok bare ikke sådan som du vil have det! Man kan klikke på formen og trække den hvorhen man vil, men hvis man klikker på en form hvis left /top ligger i det forbudte område, kan man kun flytte vha. den blå titellinje. Det vigtigste var egentlig at du blev introduceret for ClientToScreen
Det er jo ligesom ikke en form jeg vil flytte, det er et TPanel, som beskrevet i mit eksempel.
Desuden skal man stadig kunne flytte denne TPanel hvis endten dens .left = 344 eller dens .top = 433, man skal bare ikke kunne flytte den ud over disse grænser.
hrc - Du har ret i det er lidt uklart hvad der menes med objekt. Jeg tror nu blot der menes windue. dktekno's kode virker fint på et Panel sat på en form... MEN:
dktekno - Du kunne godt have brugt lidt tid på at forklare hvorfor din procedure overhovedet virker til flytning ! Men det kunne man jo så heldigvis finde på nettet: Når man sender en meddelelse (ButtonDown) til vinduet, og anfører HTCaption som parameter, fortæller man Windows at musen peger i vinduets caption-felt (den øvre blå titel-firkant), hvor man normalt klikker, for at flytte rundt med vinduer.
Windows afgiver først kontrollen igen når musen slippes, eller capturen frigives. Den underliggende form / kontrols OnPaint-event kan evt bruges til at teste positionen af Resizer-panelet, og når så grænsen nås, kaldes ReleaseCapture. I mine test bankede panelet ud på sin oprindelige position når grænsen blev nået. (Ved kaldet af ReleaseCapture). Der skulle blive fyret en WM_CAPTURECHANGED-event af til Panelet herved. Dette har jeg IKKE haft lejlighed (/evner) til at teste.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.