Avatar billede zpejder Nybegynder
24. juni 2003 - 20:26 Der er 11 kommentarer og
1 løsning

Problemer med OnMouseMove

Hejsa

Er ved at lave et program (funktionen er ligemeget), og heri har jeg nogle knapper, der udøver forskellíge funktion. Når man kører musen over en af disse knapper, skal der komme en beskrivelse af hvad knappen gør og vises et billede.

Jeg har også fået det til at virke med event'en OnMouseMove, men så snart musen bevæges en smule (også selvom den stadig er inde over knappen) kommer billedet og teksten til at "flimre" fordi den loades igen.
- Hvad kan man gøre ved det??

Kode:
procedure TSetupWindow.Install_miktexMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);

begin
if Desc.Caption = 'Standardtext' then
    Begin
    Desc.Caption := 'Beskrivelse';
    Program_Logo.Picture.LoadFromFile('Picz/miktex.bmp');
    End
  else
    Begin
    Desc.Caption := 'Standardtext';
    Program_Logo.Picture.LoadFromFile('Picz/blank.bmp');
    End
end;

- Steffen
Avatar billede cautoo Nybegynder
24. juni 2003 - 20:34 #1
kunne du ikke droppe delen
  else
    Begin
    Desc.Caption := 'Standardtext';
    Program_Logo.Picture.LoadFromFile('Picz/blank.bmp');
    End
Avatar billede zpejder Nybegynder
24. juni 2003 - 20:36 #2
Vil have den til at gå tilbage til udgangspunktet når musen fjernes fra knappen igen...
Men det kakn være man kan lave det på en anden måde??

- Steffen
Avatar billede eht Nybegynder
24. juni 2003 - 20:45 #3
Det du har brug for er at bruge OnMouseEnter og OnMouseLeave.
De findes ikke i de fleste standartkomponenter men dem kan du.selv tilføje
Du laver et nyt component der bygger på TButton hvor der er tilføjet følgende events: OnMouseEnter og OnMouseLeave.

Du laver en unit med følgende indhold:

//******************************************************
unit MyButtonunit;

interface

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

type
  TEntrerEvent = procedure(Sender: TObject) of object;
  TLeaveEvent = procedure(Sender: TObject) of object;
  TMyButton = class(TButton)
  private
    { Private declarations }
    FOnEnter: TEnterEvent;
    FOnExit: TLeaveEvent;
    procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property OnMouseEnter: TEnterEvent read FOnEnter write FOnEnter;
    property OnMouseLeave: TLeaveEvent read FOnExit write FOnExit;

  end;

procedure Register;

implementation

procedure TMyButton.CMMouseEnter(var msg: TMessage);
begin
  inherited;
 
  if Assigned(FOnEnter) then FOnEnter(Self);
end;

procedure TMyButton.CMMouseLeave(var msg: TMessage);
begin
  inherited;
  if Assigned(FOnExit) then FOnExit(self);
end;

procedure Register;
begin
  RegisterComponents('Additional', [TMyButton]);
end;

end.
//******************************************************
Denne unit gemmer du og registrerer som et nyt component.
Når det er installeret har du et component der hedder TMyButton som findes under Additional, Det fungerer fuldstændigt som TButton bortset fra de 2 nye events.
Det kan naturligvis og laves med andre komponenter.

//Erik
Avatar billede zpejder Nybegynder
24. juni 2003 - 21:57 #4
Hej..

Er lige begyndt med Delphi, så du (eller en anden) bliver nødt til at hjælpe mig med at få lavet det komponent!

- Steffen
Avatar billede dkn Nybegynder
24. juni 2003 - 22:56 #5
eht's metode ville være det bedste.

Men du kunne også lave en variabel så du altid ved hvad for et image der bliver vist.

var
FVist:string;

...

procedure TSetupWindow.Install_miktexMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
if Desc.Caption = 'Standardtext' then
    Begin
      if FVist = 'miktex.bmp' then exit;
      Desc.Caption := 'Beskrivelse';
      Program_Logo.Picture.LoadFromFile('Picz/miktex.bmp');
      FVist := 'miktex.bmp';
    End
  else
    Begin
      if FVist = 'blank.bmp' then exit;
      Desc.Caption := 'Standardtext';
      Program_Logo.Picture.LoadFromFile('Picz/blank.bmp');
      FVist := 'blank.bmp';
    End;
end;
Avatar billede lanstorp Nybegynder
25. juni 2003 - 16:11 #6
Skal det være simpelt, kan du bruge en TLabel som knap.
Den har eventene: OnMouseEnter og OnMouseLeave.
Avatar billede zpejder Nybegynder
25. juni 2003 - 18:30 #7
@dkn:
Det hjælper ikke mod at den flimrer når musen bevæges over knappen.

Vil gerne have hjælp til at få lavet det komponent som eht beskrev

- Steffen
Avatar billede eht Nybegynder
26. juni 2003 - 00:09 #8
Hej Steffen
Jeg har været lidt optaget, men gør sådan her.

1.Åbn delphi og of klik "File/new/unit".
2.Gem unit'en som MyButtonUnit i en mappe.
3.Slet derefter alt koden i unit'en.
4.Kopier teksten fra mit tidligere svar og indsæt i den tomme unit. (dog undtaget mine kommentarer øverst og nederst).
5. Tilføj under "uses" ordet:  ,StdCtrls (det havde jeg glemt)
5. Klik på "File/Save"

Nu skal komponenten registreres.

1. Klip på "Component/install Component"
2. Find den unit du gemte stien står under "Unit filename"
3. Klik på "Into new package" og skriv et navn under "Package filename" f.eks "Buttons"
4 Klik OK
5 Klik Yes.
6 Klik Install
7 Komponenten finde nu under "Additional"

Slut
Avatar billede lanstorp Nybegynder
26. juni 2003 - 08:50 #9
samt erstat:
TEntrerEvent = procedure(Sender: TObject) of object;
med:
TEnterEvent = procedure(Sender: TObject) of object;
:)
Avatar billede zpejder Nybegynder
26. juni 2003 - 18:11 #10
Hejsa..

får følgende fejl når pakken buildes:

[Fatal Error] Program or unit 'Buttons' recursively uses itself

- Steffen
Avatar billede eht Nybegynder
26. juni 2003 - 23:29 #11
Hej Steffen
Med lanstorps rettelse fungerer det her hos mig.
Jeg ved ikke hvorfor du får den fejl.
Men prøv igen at installere komponenten og vælg et andet navn til pakken f.eks.
"Knapper".

Fejlen (Program or unit 'Buttons' recursively uses itself) får man hvis to uniter henviser til hinanden under "uses" øverst under "interface".
Det kan normalt løses ved istedet at tilføje uniten i "uses" under "implementation"

recursively uses itself
Avatar billede zpejder Nybegynder
27. juni 2003 - 17:40 #12
Hej

Når jeg kaldes pakken knapper virker det!

Så mange tak for hjælpen!

- Steffen
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