Toon posts:

[Delphi6] alternatief window draggen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Euj iedereen,

Sinds vandaag ben ik bezig met Delphi. Het lukt best redelijk, maar ik heb nu een borderless form, en nu wil ik daar zelf een border aan toevoegen met een eigen 'kruisje'. De form moet ook verplaatst kunnen worden zoals ieder ander scherm, door aan de border de slepen. Maar hoe doe ik dat nu met mijn eigen border (gewoon een rectangle shape)?

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Ik denk dat je dit zoekt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TWSForm.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   Track:=True;
   OrX:=X;
   OrY:=Y;
end;

procedure TWSForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
   if Track then begin
      Left:=Left+X-OrX;
      Top:=Top+Y-OrY;
   end;
end;

procedure TWSForm.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if Track then Track:=False;
end;

Siditamentis astuentis pactum.


  • Osiris
  • Registratie: Januari 2000
  • Niet online
Varienaja schreef op 18 January 2003 @ 16:31:
Ik denk dat je dit zoekt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TWSForm.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   Track:=True;
   OrX:=X;
   OrY:=Y;
end;

procedure TWSForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
   if Track then begin
      Left:=Left+X-OrX;
      Top:=Top+Y-OrY;
   end;
end;

procedure TWSForm.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if Track then Track:=False;
end;
Tested and it works! :o Dus nu moet je dit niet aan een Form-Event plakken, maar aan die rectangle-shape van je :)

* Osiris wilde harstikke moeilijk doen met enge timers enzo :X

  • Delpix
  • Registratie: September 2001
  • Laatst online: 27-11-2021

Delpix

Alanis Fan

of op de 'Windows' manier

Delphi:
1
2
3
4
5
6
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  TWinControl(Sender).perform(WM_SYSCOMMAND, $F012, 0);
end;

...beter bekend als AMFan


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 07:50

johnwoo

3S-GTE

Makkelijkere/nettere manier: simuleer een mousedown op de titlebar van je form op het moment dat je je muisknop indrukt op je eigen control. Hiervoor hoeft de form geen titlebar te hebben. Als je vervolgens de muis beweegt zal Windows zelf de form verplaatsen (omdat je in feite met de titlebar aan het draggen bent).

Hiervoor stuur je de volgende message in je FormMouseDown, verder hoef je niks te doen:
code:
1
SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)

(WM_NCLBUTTONDOWN is 0xA1, HTCAPTION is 0x02)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Topicstarter
De enige oplossing die werkt is die van Delpix, alleen die krijg ik niet aan de gang op die bordershape.

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op 18 January 2003 @ 16:46:
De enige oplossing die werkt is die van Delpix, alleen die krijg ik niet aan de gang op die bordershape.
Die van Varienaja werkt ook prima hoor, alleen moet je uiteraard Track wel ff als Boolean en OrX en OrY als integer aan je var toevoegen :)

Delphi:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Track: boolean;
  OrX,OrY: integer;

implementation

{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Track:=True;
  OrX:=X;
  OrY:=Y;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  If Track then
  begin
    Left := Left + X - OrX;
    Top := Top + Y - OrY;
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  If Track then Track := False;
end;

end.

[ Voor 62% gewijzigd door Osiris op 18-01-2003 16:56 ]


Verwijderd

Topicstarter
Die van delpix ziet er wat makkelijker uit... Kan ik die niet voor die shape gebruiken dan?

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op 18 januari 2003 @ 16:57:
Die van delpix ziet er wat makkelijker uit... Kan ik die niet voor die shape gebruiken dan?
Ow, ja, dan moet je dat stukkie code dus in de OnMouseDown-event van je shape zetten, ipv in de OnMouseDown-event van TForm1 :)

Verwijderd

Topicstarter
En dat gaat dus niet... Ik had dat al geprobeerd, volgensmij klopt er dan iets niet met de TObject (ik ben ook maar een newbie, dus ik zal het wel fout hebben). Toen ik TObject verving door Tfrm_main, gaf ie een runtime error en klapte ie helemaal vast... Er zal een oplossing voor moeten zijn!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 07:51

mulder

ik spuug op het trottoir

TObject moet je ook niet vervangen door Tfrm_main. Als je TObject in je procedure nodig hebt als Tfrm_main moet je Sender casten naaar een Tfrm_Main.

oogjes open, snaveltjes dicht


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Osiris schreef op 18 January 2003 @ 16:36:
Tested and it works! :o Dus nu moet je dit niet aan een Form-Event plakken, maar aan die rectangle-shape van je :)

* Osiris wilde harstikke moeilijk doen met enge timers enzo :X
Tuurlijk werkt dat! :P Ik heb 't zelf gemaakt. :+

Siditamentis astuentis pactum.


Verwijderd

Topicstarter
Don Facundo schreef op 18 January 2003 @ 17:35:
TObject moet je ook niet vervangen door Tfrm_main. Als je TObject in je procedure nodig hebt als Tfrm_main moet je Sender casten naaar een Tfrm_Main.
Casten? Keep in mind dat ik wel een newbie ben... Hoe 'cast' ik?

  • Delpix
  • Registratie: September 2001
  • Laatst online: 27-11-2021

Delpix

Alanis Fan

(Sender as TFrm_Main).bla; ?

casten(typecasten) = omzetten, converteren...
hier typecasten we een integer naar een string:
string := InttoStr(mijn_integer);
;)

...beter bekend als AMFan


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 07:51

mulder

ik spuug op het trottoir

Volgens mij kun je in deze situatie Delphi iets van:

with Sender as Tfrm_main do

doen. Maar hier kan de help en google je beter helpen dan ik.

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Ik volg het even niet meer... Hoe gaat het nu worden? Het was:
TWinControl(Tobject).perform(WM_SYSCOMMAND, $F012, 0);
En nu?

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 07:51

mulder

ik spuug op het trottoir

Nee je maakt een denk/leer fout: je moet de variable Sender van het type TObject hebben

oogjes open, snaveltjes dicht


Verwijderd

code:
1
2
  ReleaseCapture;
  Form1.perform(WM_SYSCOMMAND, $F012, 0);

Deze werkt !
Zet die bij de onMouseDown van je Shape

Verwijderd

Topicstarter
Tnx voor de support, het werkt!
Pagina: 1