![]() |
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:
funzt auch soweit, allerdings verschiebt sich das Label komischerweise nach oben Rechts, aber ungewollt ebend.
If (GetAsyncKeyState(VK_RButton) < 0) Then
Kennst einer von euch vllt. eine Lösung auf mein Problem? :) |
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. |
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.
|
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 :) |
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* |
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; |
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:
Das Problem war folgendes:
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;
Code:
so war der andere 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; 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; |
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; |
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. |
Re: Rechte Maustaste auf Image blockieren
*hochschieb*
Weiss keiner nen Rat? :) |
Re: Rechte Maustaste auf Image blockieren
Zitat:
Zitat:
Zitat:
|
Re: Rechte Maustaste auf Image blockieren
Hatte garnicht drauf geachtet, den Post nochmal zu Editieren
Zitat:
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. |
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:
Sauberer wäre es je Eine Funktion zu erstellen, die du dann im Event nach bedarf aufrufst.
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin Image1MouseUp(Sender, Button, Shift, X, Y); end; Aber vielleicht solltest du zuerst mal deine Struktur Überdenken. :gruebel: Kommt mir doch etwas seltsam vor... regards Toni |
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:
Soweit so gut. Das Image ändert seine Grafik auf die eines gedrückten Buttons.
image1.Picture:=img_btn_gedrueckt.Picture;
Label1.Top:=Label1.Top+2; Label1.Left:=Label1.Left-1; 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:
in
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;
Code:
wird die "procedure Tfrm_main.Image1MouseUp" ausgelöst und die Grafik geändert, in die des Buttons im Normaozustand.
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; Und meine frage war nun wieso die "procedure Tfrm_main.Image1MouseUp" nicht ausgelöst wird, sobald ich diese
Code:
Abfrage drin habe.
if Button = mbLeft then
|
Re: Rechte Maustaste auf Image blockieren
Zitat:
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:
Was soll ich sagen... Erwartungsgemäß arbeitet es sehr gut und regelmäßig. Dein Problem muss woanders liegen.
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; [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 |
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:
Bei "(befehle[1].befehl)" handelt es sich um ein Record, in dem z.B. ein String gespeichert ist.
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; 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; |
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 |
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? |
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.
|
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 |
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. |
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:
Funzt alles wunderbar.
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; 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 :) |
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