Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Fenster ohne Titelleiste verschieben.....Problem!!
fbkreon - Do 15.05.03 14:58
Titel: Fenster ohne Titelleiste verschieben.....Problem!!
Hallo,
bei mir funktioniert aus irgendeinem grund diese funktion nicht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND,$F012, 0); end; end; |
es klappt lediglich die funktion (dafür reagieren dann aber keinerlei buttons mehr auf einen klick):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;
procedure TForm1.WMNCHitTest (var M: TWMNCHitTest); begin inherited; if M.Result = htClient then M.Result := htCaption; end; |
kann mir da jemand helfen?
JacFab - Do 15.05.03 17:31
Ich habs so gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TfrmMain.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin releasecapture; sendmessage(self.Handle, WM_NCLBUTTONDOWN, 2, 0); end; |
fbkreon - Do 15.05.03 19:35
und das funktioniert auch nicht. es interessiert das teil einfach überhaupt nicht.
O'rallY - Do 15.05.03 20:59
Guck mal im EDH. Bekommst du unter
http://www.delphi-treff.de. Dort suchst du dann nach Winamp Easy Move (oder so ähnlich).
Habs grad gefunden:
| Easy Delphi Helper Online hat folgendes geschrieben: |
Diese Procedure musst Du im Private-Abschnitt deklarieren:
Delphi-Quelltext 1: 2:
| procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest; |
Und hier die eigentliche Implementation der Procedure:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.WMNCHitTest (var M: TWMNCHitTest); begin inherited; if M.Result = htClient then M.Result := htCaption; end; |
htClient gibt an, dass Du dich im normalen Bereich Deiner Anwendung befindest, also nicht die Titelleiste bewegst. Mit htCaption wird die Titelleiste angesprochen und diese soll emuliert werden.
|
ErnestoChe - Do 15.05.03 21:36
Hi,
folgenden Code kannst du in das OnMouseMove-Ereignis jeglicher Komponente schreiben. Dann kannst du mit dieser Komponente das Fenster bewegen. Auch mit Form selber wenn du es in das OnmouseMove-Ereignis der Form schreibst. Das geht auch bei Formularen ohne Titelleiste und die restlichen komponenten auf den Formular funktionieren ganz normal. So gehts:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if (ssLeft in Shift) then begin ReleaseCapture; SendMessage(Form1.Handle,WM_SYSCOMMAND,SC_MOVE+1,0); end; end; |
MFG
- Ernesto -
fbkreon - Do 15.05.03 22:57
das ist verrückt, aber auch das, lieber ernesto, läßt delphi komplett kalt. wenn ich das nem button1 z.B. zuweise, und auf den klicke und dann ziehe passiert nix.....
ErnestoChe - Do 15.05.03 23:50
Hi,
komisch. Bei mir funktionierts einwandfrei. Sowohl unter Delphi 6 auch unter Delphi 3. Ich weiss nicht ob du es schon gemacht hast, aber probier mal den Code in einer neuen, leeren Anwendung aus und nicht in deinem aktuellen Projekt.
Wenn es klappt, dann liegt der Fehler irgendwo in deiner Anwendung. Kannst ja dann bisschen mehr Code posten.
MFG
- Ernesto -
christoph - Fr 16.05.03 21:27
| Zitat: |
bei mir funktioniert aus irgendeinem grund diese funktion nicht:
Sourcecode:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND,$F012, 0); end; end; | |
Dein Fehler liegt daran das du ein MouseDown Ereigniss nimmst
du musst ein MouseMove Ereigniss nehmen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.FormMouseMove(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND,$F012, 0); end; end; |
Chris
Moderiert von
Tino: Delphi-Tags hinzugefügt.
fbkreon - Sa 17.05.03 13:07
also das funzt dennoch nicht......der gesamte code heißt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type TForm1 = class(TForm) procedure Form1MouseMove(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Form1MouseMove(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND,$F012, 0); end; end;
end. |
und der form1 hab ich den borderstyle=bsNone verpasst um die titelleiste loszuwerden.
Moderiert von
Tino: Delphi-Tags eingefügt.
CenBells - Sa 17.05.03 14:27
O'rally hat die lösung doch schon hingeschrieben.
Musst mal etwas weiter oben gucken.
Gruß
Ken
fbkreon - Sa 17.05.03 15:22
CenBells: Die Lösung klappt ja auch, nur wie man auch exakt rauslesen kann stellt die routine fest, ob man sich im client-bereich aufhält und wenn ja, dann tut es so, als würde man die leiste berühren......aber dann funzt kein Button mehr!!! Was nützt mir ne verschiebbare form, wenn ich keinen button mehr drücken kann....jedenfalls ohne resultat. sind übrigens nur buttons von betroffen, keine anderen eingabefelder
KyroxX - Sa 17.05.03 22:50
Titel: hmm
Hatte das problemmauch ... ich bin fast verzweifelt ..
hab ich des ganze form neu gemacht, den alten source reingebaut unfd schon gings ... da muss irgendwas mit den Properties der Form durcheinandergekommen sein ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if Button = mbLeft then begin ReleaseCapture;
Perform(WM_SYSCOMMAND,$F012, 0); end; |
fbkreon - So 18.05.03 13:31
HURRAAAAAAA!!!! Endlich, es ist vollbracht:
Ich hatte einfach nur vergessen, über den Event-Manager auf "onmousemove" zu klicken. man sieht einfach manchmal den wald vor lauter bäumen nicht mehr.
hab jetzt n button genommen, und den mit folgender procedure verknüpft:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if (ssLeft in Shift) then begin ReleaseCapture; SendMessage(Form1.Handle,WM_SYSCOMMAND,SC_MOVE+1,0); end;
end; |
KyroxX - So 18.05.03 15:38
Titel: ;)
hehe *gg*
Das war mir auch mal passiert 8)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!