Avatar billede dktekno Nybegynder
23. marts 2007 - 20:49 Der er 5 kommentarer

Hvordan flytter jeg et objekt ved klik på knap?

Jeg har følgende kode:

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.

Hvordan laver jeg det sådan?
Avatar billede hrc Mester
24. marts 2007 - 21:35 #1
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.
Avatar billede dktekno Nybegynder
25. marts 2007 - 09:58 #2
Det virker ikke.
Avatar billede hrc Mester
25. marts 2007 - 13:49 #3
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
Avatar billede dktekno Nybegynder
25. marts 2007 - 18:08 #4
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.
Avatar billede a_nor Nybegynder
26. marts 2007 - 09:28 #5
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester