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,$F0120); 
     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, 20);
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,$F0120);  
     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,$F0120);  
     end;  
end;


Chris

Moderiert von user profile iconTino: 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
    { Private declarations }
  public
    { Public declarations }
  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,$F0120);
     end;
end;

end.

und der form1 hab ich den borderstyle=bsNone verpasst um die titelleiste loszuwerden.

Moderiert von user profile iconTino: 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,$F0120); 
     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)