![]() |
Formgrösse ändern - kleiner Fehler
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
Ich habe eine Form mit borderstyle = bsnone. Nun habe ich ein TPanel mit Align=Client auf der Form. (Im Original Projekt ist es ein TRbPanel, mit Border). Das Vergrössern und Verschieben funktioniert eigentlich, doch wenn ich die form an dem ecken rechts oben oder unten "fasse", und mit der maus ein bisschen "herumfuchtele", und danach wieder loslasse bleibt die breite des fensters wie sie grad ist, aber die höhe verändert sich immernoch wenn ich die maus bewege, aber keine taste gedrückt halte. Ist bisschen kompliziert zu erklären, darum habe ich ein testprojekt angehängt. Also es funktioniert meistens, aber nicht ganz immer. woran kann das liegen? hier der code den ich verwende: (wäre nett wenn jemand sagan kann ob/wie ich den code vereinfachen kann)
Delphi-Quellcode:
Gruss
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin if (x<4) and (y<4) then //links oben begin ReleaseCapture; form1.Perform(WM_SYSCOMMAND, $F004, 0); end; if (x<4) and (y>3) and (y<form1.height-3) then //links begin ReleaseCapture; form1.Perform(WM_SYSCOMMAND, $F001, 0); end; if (x<4) and (y>form1.height-4) then //links unten begin ReleaseCapture; form1.Perform(WM_SYSCOMMAND, $F007, 0); end; if (x>3) and (x<form1.Width-3) and (y>form1.Height-4) then //unten begin ReleaseCapture; form1.Perform(WM_SYSCOMMAND, $F006, 0); end; if (x>form1.Width-4) and (y>form1.Height-4) then //rechts unten begin ReleaseCapture; form1.Perform(WM_SYSCOMMAND, $F008, 0); end; if (x>form1.Width-4) and (y>3) and (y<form1.Height-3) then //rechts begin ReleaseCapture; form1.Perform(WM_SYSCOMMAND, $F002, 0); end; if (x>form1.Width-4) and (y<4) then //rechts oben begin ReleaseCapture; form1.Perform(WM_SYSCOMMAND, $F005, 0); end; if (x>3) and (x<form1.Width-3) and (y<4) then //oben begin ReleaseCapture; form1.Perform(WM_SYSCOMMAND, $F003, 0); end else begin //Fängt alle Mausereignisse ab ReleaseCapture; // mit TWinCotrol verschieben, $F012 verschiebt die Form form1.Perform(WM_SYSCOMMAND, $F012, 0); end; end; procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if ((x<4) and (y<4)) or ((x>form1.clientWidth-4) and (y>form1.clientHeight-4)) then // links oben, rechts unten panel1.Cursor := crSizeNWSE else if ((x<4) and (y>3) and (y<form1.clientheight-3)) or ((x>form1.clientWidth-4) and (y>3) and (y<form1.clientHeight-3)) then // rechts, links panel1.Cursor := crSizeWE else if ((x<4) and (y>form1.clientheight-4)) or ((x>form1.clientWidth-4) and (y<4)) then // links unten, rechts oben panel1.Cursor := crSizeNESW else if ((x>3) and (x<form1.clientWidth-3) and (y>form1.clientHeight-4)) or ((x>3) and (x<form1.clientWidth-3) and (y<4)) then // unten, oben panel1.Cursor := crSizeNS else panel1.Cursor := crDefault; end; urbanbruhin |
Re: Formgrösse ändern - kleiner Fehler
Hallo,
hier ist eine Anregung: [code=delphi] // Liefert einen eindeutigen Code für die Position von (x,y) im Rechteck R function GetBorderCode (x, y: Integer; const R: TRect): Cardinal; const BORDER = 8; // Größe des "Rahmens" begin Result := 0; if (x < R.Left + BORDER) then Inc (Result, 8); if (x >= R.Right - BORDER) then Inc (Result, 2); if (y < R.Top + BORDER) then Inc (Result, 1); if (y >= R.Bottom - BORDER) then Inc (Result, 4); end; // Ändert die Cursorform in Abhängigkeit der Mauszeigerposition procedure TDemoForm.Panel1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); const Cursors : array [0..15] of TCursor = ( // Umsetzung BorderCode -> CursorForm crDefault, crSizeNS, crSizeWE, crSizeNESW, crSizeNS, crDefault, crSizeNWSE, crDefault, crSizeWE, crSizeNWSE, crDefault, crDefault, crSizeNESW, crDefault, crDefault, crDefault ); var Code : Cardinal; begin Code := GetBorderCode(X, Y, Panel1.BoundsRect); Screen.Cursor := Cursors[Code]; end; // Startet eine Größenänderung des Formulars procedure TDemoForm.Panel1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const Command : array [0..15] of Integer = ( // Umsetzung BorderCode -> CommandCode für WM_SYSCOMMAND 0, $F003, $F002, $F005, $F006, 0, $F008, 0, $F001, $F004, 0, 0, $F007, 0, 0, 0 ); var Code : Cardinal; cmd : Integer; begin Code := GetBorderCode(X, Y, Panel1.BoundsRect); cmd := Command
Code:
Gruß Hawkeye
;
if (cmd <> 0) then begin ReleaseCapture; Perform(WM_SYSCOMMAND, cmd, 0); end; end; |
Re: Formgrösse ändern - kleiner Fehler
hallo Hawkeye219,
Vielen Dank, der Code funktioniert wunderbar!!! :bounce1: Problem gelöst! :hello: Gruss urbanbruhin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz