Avatar billede zerohero Nybegynder
17. januar 2001 - 13:19 Der er 29 kommentarer og
2 løsninger

MouseMove Event på en Gauge

Hejsa mine små computer nørder...
Jeg har et lille problem som I kloge hoveder sikkert hurtigt kan løse.
Jeg vil gerne have en OnMouseMove Event sat på en Gauge, men jeg ved ikke hvordan man gør. Help me....
Avatar billede borrisholt Novice
17. januar 2001 - 13:27 #1
zerohero >

Det gør du ved at overstyre Windows funktionen på dit komonent, og husket at gemme den gamele ...

Så er der bare at tjekke for VM_MOUDEMOVE og vupti du er i luften ...

Altså sæt en gauge på en form og før det følgende :

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Gauge1: TGauge;
    procedure FormCreate(Sender: TObject);
  private
    OldWindowPoc : TWndMethod;
    procedure GaugeWindowPoc(var Message : TMessage);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  OldWindowPoc := Gauge1.WindowProc;
  Gauge1.WindowProc := GaugeWindowPoc;
end;

procedure TForm1.GaugeWindowPoc(var Message: TMessage);
begin
  if message.Msg = WM_MOUSEMOVE then
  begin
    Caption := \'Do your stuff here\';
    message.Result := 0;
  end;
  OldWindowPoc(Message);
end;

end.

Jens B
Avatar billede zerohero Nybegynder
17. januar 2001 - 13:43 #2
Jo men hvis jeg vil bruge X, Y akser og button=mbleft osv. hvad gør jeg så?
Avatar billede martinlind Nybegynder
17. januar 2001 - 13:44 #3
Dette skulle være nok til en ny komponent som har OnMouseMove Event\'en Published, den skal selvfø\'lig lige installeres som en Komp.


  TGauge = class(TGraphicControl)
  published
    property OnMouseMove;
  end;


/Martin
Avatar billede zerohero Nybegynder
17. januar 2001 - 13:46 #4
ligesom en eks: procedure Tform1.formmousemove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
Avatar billede borrisholt Novice
17. januar 2001 - 13:47 #5
zerohero >> Hvis nu jeg siger online hjælp hvad siger du så ?

Jens B
Avatar billede zerohero Nybegynder
17. januar 2001 - 13:49 #6
Ja Ja.... Jens B. Jeg ved det godt...*S*
Avatar billede martinlind Nybegynder
17. januar 2001 - 13:50 #7
Du kan bare gøre som jeg har beskrevet så har du X,Y som passer til Gaugen

/Martin
Avatar billede borrisholt Novice
17. januar 2001 - 13:51 #8
sæt markøren på WM_MOUSEMOVE og tryk F1. Den der med musend placering får du ved GetCursorPos() funktionen.

Jens B
Avatar billede martinlind Nybegynder
17. januar 2001 - 13:51 #9
En lille rettelse

TMyGauge = class(TGauge)
  published
    property OnMouseMove;
  end;



/Martin
Avatar billede zerohero Nybegynder
17. januar 2001 - 13:59 #10
Martinlind >> Jeg meget langsom til at opfatte ting (please be patient)...Hvor er det lige jeg skal skrive...

Tmygauge = class(Tgauge)
published
property OmMouseMove;
end;

(føler mig helt flovt ved at spørge)...
Avatar billede borrisholt Novice
17. januar 2001 - 14:01 #11
zerohero >> martinlind\'s pointe er at du skal lave et nyt komponent der arver fra TGauge. der efter skal det instaleres og sættes på din form ....

Jens B
Avatar billede martinlind Nybegynder
17. januar 2001 - 14:04 #12
Du skal køre den wizard der er til at lave en ny component og så skal du nedarve fra TGauge og tilføje den line der heder property OnMouse....
under published, du har så lavet en ny component som kan det du gerne vil havde og det har taget dig 2 min. og uden at skrive noget kode ( sort set *S* ), Delphi er Genialt *S*

/Martin
Avatar billede zerohero Nybegynder
17. januar 2001 - 14:07 #13
Nå ok... nu er jeg med igen... Jeg har bare aldrig prøvet at lave en komponent før... men så har man jo Online Help...

1000 tak for jeres gode forslag og svar...

(I er de sejeste)
Avatar billede martinlind Nybegynder
17. januar 2001 - 14:10 #14
Jeg har lige en sidste bemærkning, det er klogt at holde sig fra WndProc\'en hvis der overhovedet er mulighed for det, det er ihvertfald min erfaring

/Martin
Avatar billede zerohero Nybegynder
17. januar 2001 - 14:12 #15
Hvorfor da det???
Avatar billede borrisholt Novice
17. januar 2001 - 14:13 #16
martinlind >> Det mange mennesker glemmer er at gemme den gamle procedure .. inden de giver en ny ... Hvis du gør som jeg har vist er der ingen risiko ved den metode, og du kan lave ganske mange sjove tinge der inde .....

Det imod er ujeg modstanner af at lave uendelige mængder af komponenter der skal distribueres sammen med dit projekt, mest pga. Delphis tåbelige håndtering af samme.

Jens B
Avatar billede martinlind Nybegynder
17. januar 2001 - 14:19 #17
Jens B >> Rigtigt, men det er vel også en exefil han skal distribueres, mht. til wndproc foretrækker jeg at override den istedet, men det er stadig at foretrække at undgå den, det er også noget skod og debug inden i en wndproc.

zerohero >> har du fået løst dit problem

/Martin
Avatar billede borrisholt Novice
17. januar 2001 - 14:26 #18
martinlind  >> problemer er her at du ikke kan override winproc i det her ikke er tale om en nedarvning ... derfor er du nødtil at selv holde styr på \"hvor  du kommer fra\".

Jens B
Avatar billede martinlind Nybegynder
17. januar 2001 - 14:29 #19
Jens B. >> Ikke helt rigtigt : fra TWinControl :
procedure WndProc(var Message: TMessage); override;

Delphi is Great *S*

/Martin
Avatar billede borrisholt Novice
17. januar 2001 - 14:33 #20
martinlind >> Den er jeg helt med på ..... MEn du fik vist ikke pointen TGauge arver ikke derfra ...

Måske du vil illustere den der med at override WndProc på en gauge UDEN at lave et nyt komponent ..

Jens B
Avatar billede zerohero Nybegynder
17. januar 2001 - 14:33 #21
Jeg fatter stadig ikke helt hvordan man laver en komponent...(har aldrig prøvet før)...
ville det være for meget at forlange hvis du lavede sådan en komponent som du snakker om og sendte den til mig så kan jeg nok bedere se hvordan det skal gøres... min mail er:

info@electronicbugs.org
Avatar billede zerohero Nybegynder
17. januar 2001 - 14:35 #22
Og jeg kan da slet ikke følge Borrisholt og Martinlinds samtale...(men det er nok heller ikke meningen)...
Avatar billede borrisholt Novice
17. januar 2001 - 14:38 #23
zerohero >> Hvis du ikke er med på hvordan man laver og instalerer et komponent så brug min løsning ... Der er ikke noget der skal instaleres ...

Jens B
Avatar billede zerohero Nybegynder
17. januar 2001 - 14:42 #24
Jeg ved ikke, men... når man eksempelvis vil sætte en canvas på en Tpanel kan man gøre det helt uden at lave en komponent:

MyCanvas := Tcontrolcanvas.create;
Mycanvas.control := control(panel);

eller sådant noget lign... så troede jeg egentligt bare at man stort set kunne gøre noget lign men OnMouseMove, OnMouseDown og OnMouseUp...
Men der har jeg måske taget helt fejl...
Avatar billede martinlind Nybegynder
17. januar 2001 - 14:46 #25
Jens B. >> TGauge arver fra en tControl som har en virtuel WndProc, så ja jeg havde ret. men det var nu mere generelt jeg mente.

Zero >> jeg sender den om 2min.

/Martin
Avatar billede zerohero Nybegynder
17. januar 2001 - 14:48 #26
Jens B>> Jeg prøvet dit forslag. men havd skal jeg gøre hvis jeg vil have x, y kordinaterne frem i form1.caption når jeg føre musen hen over min gauge1
Avatar billede borrisholt Novice
17. januar 2001 - 14:48 #27
martinlind >> Så tag lige og vis hvordan du vil lave en override UDEN at lave et nyt komponent ?

Jens B
Avatar billede zerohero Nybegynder
17. januar 2001 - 14:56 #28
Jens B>> hvad skal jeg skrive for at få x, y kordinaterne vist i form1.caption  når jeg føre musen hen over min gauge1???...
Avatar billede martinlind Nybegynder
17. januar 2001 - 14:59 #29
Jens B >> Nedarvning kan selvfø\'li ikke gøres uden en ny component.

Zero >> kig efter mail,
Form1.Caption := Format(\'X : %d  Y : %d\'[X,Y]);

/Martin
Avatar billede borrisholt Novice
17. januar 2001 - 15:07 #30
Der er to metoder til at gøre det her med :

En ten bruger du GetCursorPos() ellers skal du bruge de data du får i din message ....

Begge metoder er illusteret her :

procedure TForm1.GaugeWindowPoc(var Message: TMessage);
var
  x, y : Integer; //skal kun brugews i metode 2
  Point : TPoint; //skal kun brugews i metode 1
begin
  if message.Msg = WM_MOUSEMOVE then
  begin
    //Metode 1 : Kan bruge alle steder :
      GetCursorPos(Point);
      Caption := \'x : \' + IntToStr(Point.x) + \' y : \' + IntToStr(Point.y);
    //end Metode 1

    //Metode 2 : Kan lidt mere langhåret kan kun bruges her :
    x := Lo(Message.LParam);
    y := Hi(Message.LParam);
    Caption := \'x : \' + IntToStr(Point.x) + \' y : \' + IntToStr(Point.y);
    //end Metode 2
    message.Result := 0;
  end;
  OldWindowPoc(Message);
end;

Jens B
Avatar billede martinlind Nybegynder
17. januar 2001 - 15:11 #31
ZeroHero >> Og det gælder jo også her, det med point\'ene *S*

/Martin
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