Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Rechte Maustaste auf Image blockieren (https://www.delphipraxis.net/47963-rechte-maustaste-auf-image-blockieren.html)

Stony2k 18. Jun 2005 15:14


Rechte Maustaste auf Image blockieren
 
Moin,

es geht um folgendes. Ich benutze in meinem Programm selbst erstellte Buttons, sprich image Dateien, die bei der Mouse Down, bzw. der Mouse Up Event das Bild wechseln und einem label darüber, wo beim klick der Left und Top Wert verändert wird.
Funzt auch alle prima soweit. Nun mein Problem:
Man kann auch mit der rechten Maustaste auf den "Button" klicke, was ich aber für ziemlich unestetisch halte, da man bei den original Buttons auch nicht rechts drauf klicken kann.
Bei meiner Suche nach einem passenden Thread habe ich nun folgedes gefunden:
Code:
If (GetAsyncKeyState(VK_RButton) < 0) Then
funzt auch soweit, allerdings verschiebt sich das Label komischerweise nach oben Rechts, aber ungewollt ebend.
Kennst einer von euch vllt. eine Lösung auf mein Problem? :)

dizzy 18. Jun 2005 15:16

Re: Rechte Maustaste auf Image blockieren
 
Die OnClick-Methode liefert dir unter anderem auch den Parameter "Shift" mit. Schau dir da mal die OH zu TShiftState an ;)

\\edit: Oha, TImage tut dies nicht... sorry -> falsch

Nimm dann anstelle von OnClick besser OnMouseUp, da bekommste Shift mitgeliefert.

SirThornberry 18. Jun 2005 15:32

Re: Rechte Maustaste auf Image blockieren
 
im OnMouseDown und OnMouseUp bekommst du doch als Parameter welcher Mousebutton down bzw. up ging. Reagiere in den Events also nur wenn sie durch den linken Mousebutton ausgelöst wurden.

Stony2k 18. Jun 2005 15:41

Re: Rechte Maustaste auf Image blockieren
 
Ja ich arbeite ja mit Mouse Down und mit Mouser UP, nicht mit Click.
Aber die Frage ich wie ich das ganze mit dem Shift Integer abfrage :)

Ultimator 18. Jun 2005 15:47

Re: Rechte Maustaste auf Image blockieren
 
Delphi-Quellcode:
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if ssRight in Shift then
 exit;
end;

Das dürfte klappen *g*

SirThornberry 18. Jun 2005 16:03

Re: Rechte Maustaste auf Image blockieren
 
warum shift, du hast doch den Parameter "Button"
Delphi-Quellcode:
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin

  end;
end;

Stony2k 18. Jun 2005 16:13

Re: Rechte Maustaste auf Image blockieren
 
Ok ihr wart alle schneller.
Habe es während ich gerade offline war mit Mühe in der Delphi Hilfe gefudnen (Stolz ist).
Code:
begin
if ssLeft in Shift then
  begin
    image1.Picture:=img_btn_gedrueckt.Picture;
    Label1.Top:=Label1.Top+2;
    Label1.Left:=Label1.Left-1;
    sendText(befehle[1].befehl);
  end;
Das Problem war folgendes:
Code:
procedure Tfrm_main.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
image1.Picture:=img_btn_normal.Picture;
    Label1.Top:=Label1.Top-2;
    Label1.Left:=Label1.Left+1;
end;
so war der andere Code.
Die Rechte Maustaste ging zwar nicht aber die Mouse Up Event wurde ja dennoch ausgelöst, darum hat sie das Label dann auch immer verschoben. So sieht nun der neue Code aus und es funzt wunderbar, ich muss sagen ohne euch wäre ich nicht darauf gekommen :)

Code:
procedure Tfrm_main.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then
  begin
    image1.Picture:=img_btn_normal.Picture;
    Label1.Top:=Label1.Top-2;
    Label1.Left:=Label1.Left+1;
  end;
end;

SirThornberry 18. Jun 2005 16:26

Re: Rechte Maustaste auf Image blockieren
 
und was spricht gegen
Delphi-Quellcode:
procedure Tfrm_main.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    image1.Picture:=img_btn_normal.Picture;
    Label1.Top:=Label1.Top-2;
    Label1.Left:=Label1.Left+1;
  end;
end;

Stony2k 19. Jun 2005 13:20

Re: Rechte Maustaste auf Image blockieren
 
jau danke nun funzt es wunderbar.
Hatte nämlich später das Problem, dass die Mouse UP Event nicht mehr ausgelöst wurde.
Aber so scheint es nun zu funzen, danke. Ansonsten melde ich mich.

Stony2k 20. Jun 2005 14:11

Re: Rechte Maustaste auf Image blockieren
 
*hochschieb*
Weiss keiner nen Rat? :)

Olli 20. Jun 2005 14:42

Re: Rechte Maustaste auf Image blockieren
 
Zitat:

Zitat von Stony2k
Man kann auch mit der rechten Maustaste auf den "Button" klicke, was ich aber für ziemlich unestetisch halte, da man bei den original Buttons auch nicht rechts drauf klicken kann.

... ich auch :roll:

Zitat:

Zitat von Stony2k
*hochschieb*
Weiss keiner nen Rat? :)

Erklär dich mal! Rat wozu? Du hast doch direkt obendrüber gesagt:
Zitat:

Zitat von Stony2k
jau danke nun funzt es wunderbar.
Hatte nämlich später das Problem, dass die Mouse UP Event nicht mehr ausgelöst wurde.
Aber so scheint es nun zu funzen, danke. Ansonsten melde ich mich.

Generell bearbeitet Windows - und im Endeffekt dein Programm - nur jene Nachrichten, für die auch eine (Callback-)Funktion zur Verfügung steht.

Stony2k 21. Jun 2005 13:54

Re: Rechte Maustaste auf Image blockieren
 
Hatte garnicht drauf geachtet, den Post nochmal zu Editieren

Zitat:

Zitat von Stony2k
Die Rechte Maustaste ging zwar nicht aber die Mouse Up Event wurde ja dennoch ausgelöst, darum hat sie das Label dann auch immer verschoben. So sieht nun der neue Code aus und es funzt wunderbar, ich muss sagen ohne euch wäre ich nicht darauf gekommen

Folgendes: Ich habe nun die Anfrage ob man die linke Maustaste drückt eingefügt.
Und zwar bei der Mouse up und bei der Mouse down Event.
Wenn ich die Rechte Maustaste drücke passiert nicht - so wie ich es wollte.
Das problem ist, dass aber nun die Mouse up Event auch nicht mehr ausgelöst wird, was zur folge hat, dass der Buttons im gedrückten zustand bleibt, da die Mouse Up event, die Grafik des Buttons wieder in den Normalzustand wechselt.
Und darum habe ich ja gefragt ob wer weiss, weiso die Mouse UP event nicht nicht mehr ausgelöst wird.
Nur wenn ich dort die Abfrage zur linken Maustaste enferne, geht es wieder, sonst nicht.

Tonic1024 21. Jun 2005 14:15

Re: Rechte Maustaste auf Image blockieren
 
Du verwirrst mich...

Wenn du rechts klicks passiert nichts, aber der Button wird trotzdem groß? Was denn nun?

Irgendwie solltest du mal einen Schnipsel Code posten, damit man sich mal ein Bild davon machen kann.

Ein Lösungsansatz wäre die MouseUp-Funktion manuell aufzurufen (mitt allen parametern, die du ja hast:
Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Image1MouseUp(Sender, Button, Shift, X, Y);
end;
Sauberer wäre es je Eine Funktion zu erstellen, die du dann im Event nach bedarf aufrufst.


Aber vielleicht solltest du zuerst mal deine Struktur Überdenken. :gruebel: Kommt mir doch etwas seltsam vor...

regards

Toni

Stony2k 22. Jun 2005 12:18

Re: Rechte Maustaste auf Image blockieren
 
Irgentwie scheintst du es echt nicht zu verstehen, gut hier nochmal die Code schnipsel:

Code:
procedure Tfrm_main.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
  begin
    image1.Picture:=img_btn_gedrueckt.Picture;
    Label1.Top:=Label1.Top+2;
    Label1.Left:=Label1.Left-1;
  end;
end;
Code:
procedure Tfrm_main.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
  begin  
    image1.Picture:=img_btn_normal.Picture;
    Label1.Top:=Label1.Top-2;
    Label1.Left:=Label1.Left+1;
  end;
end;

Und nun nochmal wo das Problem ist. Ich klicke mit der linken Maustaste auf das Image und es passiert wie im Code folgendes:
Code:
    image1.Picture:=img_btn_gedrueckt.Picture;
    Label1.Top:=Label1.Top+2;
    Label1.Left:=Label1.Left-1;
Soweit so gut. Das Image ändert seine Grafik auf die eines gedrückten Buttons.
Sobald ich nun die Maustaste loslasse, sollte ja an für sich die "procedure Tfrm_main.Image1MouseUp" ausgelöst werden. Tut

sie aber nicht. Heisst, dass die Grafik des gedrückten Buttons bestehen bleibt.
Ändere ich nun
Code:
procedure Tfrm_main.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
  begin  
    image1.Picture:=img_btn_normal.Picture;
    Label1.Top:=Label1.Top-2;
    Label1.Left:=Label1.Left+1;
  end;
end;
in
Code:
procedure Tfrm_main.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  image1.Picture:=img_btn_normal.Picture;
   Label1.Top:=Label1.Top-2;
   Label1.Left:=Label1.Left+1;
end;
wird die "procedure Tfrm_main.Image1MouseUp" ausgelöst und die Grafik geändert, in die des Buttons im Normaozustand.
Und meine frage war nun wieso die "procedure Tfrm_main.Image1MouseUp" nicht ausgelöst wird, sobald ich diese
Code:
if Button = mbLeft then
Abfrage drin habe.

Tonic1024 22. Jun 2005 12:39

Re: Rechte Maustaste auf Image blockieren
 
Zitat:

Zitat von Stony2k
Irgentwie scheintst du es echt nicht zu verstehen, gut hier nochmal die Code schnipsel:

Irgendwie schreibst du auch IMHO sehr mißverständlich.

Egal... Ich hab jetzt mal ein Formular aufgemacht, Drei TImages drauf gezogen und davon in die beiden ersten ein Bild geladen für Button gedrückt und Butten nicht gedrückt. Dann noch ein Label auf das Dritte TImage gezogen und deinen Code in die OnMouseDown und OnMouseUp kopiert (Namen angepasst)

Delphi-Quellcode:
procedure TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    image3.Picture:=Image1.Picture;
    Label1.Top:=Label1.Top+2;
    Label1.Left:=Label1.Left-1;
  end;
end;

procedure TForm1.Image3MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    image3.Picture:=Image2.Picture;
    Label1.Top:=Label1.Top-2;
    Label1.Left:=Label1.Left+1;
  end;
end;
Was soll ich sagen... Erwartungsgemäß arbeitet es sehr gut und regelmäßig. Dein Problem muss woanders liegen.

[Edit]Hast du mal geschaut ob du im Label1OnMouseDown und Label1OnMouseUp was hinterlegt hast? Wenn du nämlich auf die Schrift klickst, passiert garnichts - was für ein Button eher unüblich wäre. Du müsstest also diese Funktionen auch in diesen Events aufrufen. (diese Redundanz habe ich übrigens mit "Überdenke deine Struktur" gemeint. Dann kann sowas nicht passieren. - Nur ne Vermutung...[/Edit]

regards

Toni

Stony2k 22. Jun 2005 19:28

Re: Rechte Maustaste auf Image blockieren
 
Wenn man auf das Label drückt, wird die Mouse down Event ausgelöst, daran habe ich bereits gedacht.
Aber gut dass du es ansprichst.
Ich habe echt das wichtigste vergessen zu posten:
Die Mouse Down Event schaut so aus:
Code:
procedure Tfrm_main.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
  begin
    sendText(befehle[1].befehl);
    image1.Picture:=img_btn_gedrueckt.Picture;
    Label1.Top:=Label1.Top+2;
    Label1.Left:=Label1.Left-1;
  end;
end;
Bei "(befehle[1].befehl)" handelt es sich um ein Record, in dem z.B. ein String gespeichert ist.
Der Fehler muss an dem Send Text liegen. Dieser Befehl sendet nämlich einen Text an ein Fenster namens Ultima Online, einem Online Rollenspiel. Wenn aber dieses Fenster geschlossen ist, kommt eine Fehlermeldung. Und genau dann wird die Mouse Up Event nicht ausgelöst. Ich konnte nur nicht herausfinden, was die Mouse Up Event blocked bei der "Send Text Funktion", da ich sie nicht geschrieben habe.

Code:
function SendText( Command: String ): HWND;
var
    Handle: HWND;
    i: Integer;
begin
    Handle := FindWindow( 'Ultima Online', nil );
    if ( Handle = 0 ) then
        Handle := FindWindow( 'Ultima Online Third Dawn', nil );

    if Handle = 0 then
    begin
        Application.MessageBox( PChar( 'Der Ultima Online Client muss gestartet sein !'{'The Command ''' + Command + ''' couldn''t be sent, please start your UO Client.'} ), 'Fehler!', MB_OK+MB_ICONERROR );
        Result := 0;
        exit;
    end;
    // Send an enter first
    SendMessage( Handle, WM_CHAR, 13, 0 );
    // Send the command char
{    //cChar := Config.GetString( 'commandchar' );
    cChar := '.';
    for i := 0 to length( cChar ) do
        SendMessage( Handle, WM_CHAR, Ord( cChar[i] ), 0 ); }
    for i := 0 to length( Command ) do
        SendMessage( Handle, WM_CHAR, Ord( Command[i] ), 0 );
    // Send an enter at the end
    SendMessage( Handle, WM_CHAR, 13, 0 );
    Result := Handle;
end;

Tonic1024 23. Jun 2005 07:30

Re: Rechte Maustaste auf Image blockieren
 
Hm... Das ist nun echt schwierig zu testen, wenn man den UO Client nicht hat.

Du könntest mal versuchen den kompletten Quelltext aus der Funktion auszukommentieren. Dann sollte zumindest der Button richtig funzen. Wenn das so ist, weisst du, dass der Fehler ganz bestimmt in dieser Funktion steckt.

Danach würde ich einen Haltepunkt am Anfang der Funktion setzen und mit F8 durchsteppen (Kommentar-Tags entfernen - logisch). Dann solltest du ja sehen was er macht und wo er aussteigt.

regards

Toni

Stony2k 23. Jun 2005 13:56

Re: Rechte Maustaste auf Image blockieren
 
Haette ich zwar nicht erwartet, aber es lag an der Messagebox.
Habe diese mal auskommentiert und siehe da, es ging wieder.
Die messagebox scheint wohl irgentwie das wieder Hochgehen der Maustaste "abzufangen0", sodass es nicht mehr für die Mouse Up Event ausgelöst wird. Jedman eine Idee, wie ich dieses "Abfangen" verhindern kann?

Khabarakh 23. Jun 2005 14:44

Re: Rechte Maustaste auf Image blockieren
 
Du bekommst doch das Handle von SendText zurückgeliefert. Wenn das Handle 0 ist, wird ja die MessageBox angezeigt. Füge also in diesem Fall nicht das Bild des gedrückten Buttons ein, sodass immer noch der "normale" Button zu sehen ist.

Tonic1024 23. Jun 2005 16:17

Re: Rechte Maustaste auf Image blockieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab mich eben noch mal reingedacht. Habs nun aber ein wenig eilig -> Feierabend :???: :wink:

Schau dir mal diesen Code an. Ausführliche Erklärung folgt morgen. Hat mit Focusverlust zu tun (der Event wird über dem Button nicht ausgelöst, weil es nicht mehr das aktuelle Element ist).

MfG

Toni

Stony2k 25. Jun 2005 15:08

Re: Rechte Maustaste auf Image blockieren
 
Hi Toni,
deine Lösung sieht zwar gut aus, aber der Grafische Aufbau meines Programmes lässt es nicht zu Panels oder auch Labels anstatt von Messageboxen zu verwenden, da es auf gut deutsch "beschissen" aussehen würde. Aber du hast den Focusverlust mit dem aktiven Fenster angesprochen. Gibt es eine Möglichkeit diesen Focusverlust zu unterbinden?

@Khabarakh:
Deine Lösungs klingt, gut, da bin ich noch garnicht drauf gekommen. Ich werde es mal versuchen.

Stony2k 26. Jun 2005 10:39

Re: Rechte Maustaste auf Image blockieren
 
So, ich habe das ganze nun folgendermassen gelöst:

Code:
function SendText( Command: String ): HWND;
var
    Handle: HWND;
    i: Integer;
begin
    Handle := FindWindow( 'Ultima Online', nil );
    if ( Handle = 0 ) then
        Handle := FindWindow( 'Ultima Online Third Dawn', nil );

    if Handle = 0 then
    begin
        Result := 0;
        MouseUpFix:=Result;
        exit;
    end;
    // Send an enter first
    SendMessage( Handle, WM_CHAR, 13, 0 );
    // Send the command char
{    //cChar := Config.GetString( 'commandchar' );
    cChar := '.';
    for i := 0 to length( cChar ) do
        SendMessage( Handle, WM_CHAR, Ord( cChar[i] ), 0 ); }
    for i := 0 to length( Command ) do
        SendMessage( Handle, WM_CHAR, Ord( Command[i] ), 0 );
    // Send an enter at the end
    SendMessage( Handle, WM_CHAR, 13, 0 );
    Result := Handle;
end;
Code:
procedure Tfrm_main.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
If Button = mbLeft then
  begin
    image1.Picture:=img_btn_normal.Picture;
    Label1.Top:=Label1.Top-2;
    Label1.Left:=Label1.Left+1;
      If MouseUpFix = 0 Then begin
        Application.MessageBox( PChar( 'Der Ultima Online Client muss gestartet sein !'),'Fehler!', MB_OK+MB_ICONERROR );
        MouseUpFix := 1;
      end;
  end;
end;
Funzt alles wunderbar.
Aber ich habe bemerkt, wenn man ganz schnell hintereinander auf das "Ok" der Fehlermeldung und auf das Image klickt, wird manchmal die Mouse Down nicht ausgeführt, heisst, das Label verschiebt sich immer weiter nach oben. Muss wohl was mit dem "Fokusverlust" zutun haben.
Wenn wer Rat weiss, der möge sich melden :)

Tonic1024 27. Jun 2005 07:37

Re: Rechte Maustaste auf Image blockieren
 
Okay, da dein Form wohl eh relativ "unsauber" geproggt ist - Khabarakh's Vorschlag würde ich da auch dazuzählen - könnte ich dir mal eine Weitere "unsaubere" Lösung anbieten.

Starte beim OnMouseDown einen Timer, der die Werte prüft. Sollte beim OnMouseUp irgendetwas schiefgegangen sein setze die Werte nach 1000ms mauell zurück. Das ist zwar etwas aufwand, sollte das Problem aber eindeutig beheben. Du kannst im Timer auch noch abfragen ob die Maustaste noch immer gedrückt ist und dann nicht manuell zurücksetzen, falls der user es "witzig" findet 30 sec auf den Button zu drücken. Musst nur Im Timer den Timer selbst wieder disablen, damit der reset nicht willkürlich gemacht wird.

regards

Toni


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz