Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 02:34

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Maus über einem bestimmten Panel?
BeitragVerfasst: So Nov 09, 2003 21:49 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
Hallöchen :)

Also, ich hab da ein kleines Problem:

Code:
  1.  
  2. ----------------------------------
  3. | Datei | Bearbeiten..           |
  4. ----------------------------------
  5. |                                |
  6. | ----------------------         |
  7. | |  ---------         |         |
  8. | |  |       |  ------ |         |
  9. | |  |   1   |  | 2  | |         |
  10. | |  |       |  ------ |         |
  11. | |  ---------         |         |
  12. | |                    |         |
  13. | |                    |         |
  14. | ----------------------         |
  15. |                                |
  16. |                                |
  17. ----------------------------------
  18.  


Also, im obigen "seht" ihr eine Form mit Menü und darin ein Panel mit weiteren 2 geschachtelten Panels (1,2). So, ich möchte nun den moment haben, wann der Cursor auf Panel1 oder Panel2 ist.
Bisher hab ich das so gelöst, dass ich in einer OnIdle-Prozedur die Aktuelle Mausposition ermittle (Mouse.CursorPos) und dann mittels der Position der Form und den Abständen der einzelnen Panels zueinander (left,top) 2 Punkte zu jedem panel ermittle (links oben und rechts unten eines jeden Panels) und dann überprüfe, ob sich der Cursor in dem sich aufspannenden Rechteck befindet. ist es so, weiss ich, dass die Maus auf dem einen ist oder dem anderen oder gar nicht.
DAs problem das dabei aber entsteht ist, dass ich ganz einfach die höhe des Menüs und des echten rahmens des fensters (Caption bereich) nicht abmessen kann (kann ja von system zu system irgendwie variieren).
Im Form.OnMouseMove kann ich die abfrage auch nicht realisieren, da - sobald die maus über einem der panels ist - dieses ereignis nicht mehr ausgelöst wird, zumal die panels nachher wohl die gesamte oberfläche der form verwenden werden..
Also: wie löse ich das problem?

gruß
rochus

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 21:57 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
wie wärs, wenn du die OnMouseMove Ereignisse der Panels verwendest?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 21:58 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
das hab ich schon probiert, allerdings wird da ja nur wiedergegeben wenn die maus drüber ist, d.h. wenn die maus das panel verlässt bleibt die letzte mausposition die aktuelle und so komm ich nicht weiter..

[EDIT]: war wohl bisschen unverständlich.

also, ich kann in einem panel überprüfen, ob die maus bewegt wird, klar, allerdings wird da nur zurückgeliefert, wo die maus ÜBER dem panel ist, nicht, ob sich die maus überhaupt auf dem panel befindet oder wo anders.. wenn ich die maus wo anders hin bewege, dann ist die letzte "im Panel gespeicherte" Mauskoordinate die, wo sich die Maus zuletzt vor verlassen des Panels befand. Ich kann also über die onmousemove im panel nicht überprüfen, ob die maus gerade über einem gewissen panel isT!

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 22:50 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Eine andere Idee wäre mit WindowFromPoint das aktuelle Fenster unter dem Mauszeiger zu ermitteln und dann mit dem Handle des Panels zu vergleichen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 23:14 
Offline
DGL Member

Registriert: Sa Aug 30, 2003 22:23
Beiträge: 36
Wohnort: Hamburg
wenn du für jedes objekt das onmouse over event benutzt, dann wird die position doch auch geändert wenn du das panel verlässt und meinetwegen wieder über der form bist?!

_________________
<< Ich werde Ewig leben oder beim Versuch dies zu erreichen, sterben! >>


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 23:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das dürfte helfen :

Code:
  1. FindVCLWindow
  2.  
  3. Gibt das fensterorientierte Steuerelement (sofern vorhanden) an der angegebenen Position zurück.
  4.  
  5. Unit
  6. Controls
  7.  
  8. Kategorie
  9. Maussteuerung
  10.  
  11. Delphi-Syntax:
  12. function FindVCLWindow(const Pos: TPoint): TWinControl;
  13.  
  14. Beschreibung
  15. Mit FindVCLWindow können Sie das fensterorientierte Steuerelement, das sich an einer bestimmten Position befindet, ermitteln. Beispielsweise läßt sich mit FindVCLWindow das fensterorientierte Steuerelement ermitteln, auf dem sich der Mauszeiger befindet, wenn ein anderes Steuerelement alle Mausbotschaften abfängt. Der Parameter Pos bezeichnet die Position, unter der sich das zurückgegebene Steuerelement befinden muß. Wenn sich an dieser Stelle kein fensterorientiertes Steuerelement befindet, gibt FindVCLWindow den Wert nil (Delphi) oder NULL (C++) zurück.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 23:26 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
klasse :) ich wusste doch noch was von so einer funktion (hab sie schonmal verwendet.. jahre her *g*)

danke euch allen :)

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 23:36 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
[Edit]: hat sich geklärt..

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 10, 2003 18:11 
Offline
DGL Member

Registriert: Mo Nov 03, 2003 20:23
Beiträge: 66
öhm... es gibt noch ne windowmessage für den fall, dass die maus eine fläche verlässt... ich guck mal... [hab aber leider grad wenig zeit :(]

...daraus kann man nen neues ereigniss machen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 10, 2003 21:08 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
CM_MOUSEENTER
CM_MOUSELEAVE

habe es damit nun gelöst (eigenes Panel abgeleitet..), habe aber in keiner Doku (D7 Hilfe, Win-SDK das bei Delphi dabei ist, Platform SDK) über diese messages was gefunden! bin ich zu blind dazu??

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 10, 2003 22:57 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Diese CM Messages werden nur von VCL Fenstern gesendet und empfangen. In der Datei controls.pas sind die alle definiert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 11, 2003 08:25 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
ah ok :) fragt sich nur warum die nicht in der delphi hilfe auftauchen..

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 11, 2003 11:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Warum machst du es denn nicht mit FindVCLWindow?Da musst du nur die aktuelle Mausposition angeben, und falls sich da ein fensterorientiertes Steuerelement befindet, bekommst du das zurückgeliefert. Herausfinden obs ein Panel ist kannst du dann doch ganz einfach mit dem is-Operator, bevor du dann typecasten kannst.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 11, 2003 12:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich würde das auch über eine abgelittene Klasse machen. Ist irgendwo auch schneller. Wenn du einmal die Message bekommst, dass sich die Maus über dem Panel1 befindet, dann ändert man ein Flag (boolean) und sobald man die Andere bekommt löscht man es wieder. Damit kann praktisch ohne Geschwindigkeitsverlusst immer wieder abfragen ob die Maus über Panel 1 ist. Wenn du das mit der Methode machst, dann sucht die VCL dir ein Fenster heraus und du musst abfragen was es ist (TPanel). Wenn man das sehr oft abfragt ist das nicht unbedingt die beste Lösung. Es wird aber sicherlich nicht so wahnsinn an Zeit kosten aber der Aufwand mit dem Flag ist auch nicht groß. In Meinen Augen ist das reine Geschmackssache. Aber ich würde auch die Klassen nehmen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 11, 2003 16:21 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
also ich hab ja beide methoden jetzt gemacht und:


1. die FindVCLWindow ist schon okay, aber mit nem eigenen Panel is das schon schicker!
2. der Mehraufwand war so gering, dass es eigentlich nicht wirklich mehraufwand war, zumal ich nun nicht mehr gesondert testen muss, welches panel es ist sondern direkt im onmouseenter sehe, welches panel es ist :) also ist es doch eigentlich mit dem eigenen panel wieder schneller...

hier mal der Quellcode für das Panel, das sich auf der registerseite 'rochus' installiert (hab noch 3 andere componenten leicht verändert und damit ich die finde hab ich die auf rochus drin *g*)
Code:
  1.  
  2. unit RoPanel;
  3.  
  4. interface
  5.  
  6. uses
  7.   SysUtils, Classes, Controls, ExtCtrls, Messages;
  8.  
  9. type
  10.   TRoPanel = class(TPanel)
  11.   private
  12.      { Private-Deklarationen }
  13.      FOnMouseEnter : TNotifyEvent;
  14.      FOnMouseLeave : TNotifyEvent;
  15.   protected
  16.      { Protected-Deklarationen }
  17.      procedure MouseEnter; virtual;
  18.      procedure MouseLeave; virtual;
  19.  
  20.      procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
  21.      procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  22.   public
  23.      { Public-Deklarationen }
  24.   published
  25.      { Published-Deklarationen }
  26.      property OnMouseEnter:TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
  27.      property OnMouseLeave:TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  28.   end;
  29.  
  30. procedure Register;
  31.  
  32. implementation
  33.  
  34. procedure Register;
  35. begin
  36.   RegisterComponents('rochus', [TRoPanel]);
  37. end;
  38.  
  39. { TRoPanel }
  40.  
  41. procedure TRoPanel.CMMouseEnter(var Msg: TMessage);
  42. begin
  43.     inherited;
  44.     MouseEnter;
  45. end;
  46.  
  47. procedure TRoPanel.CMMouseLeave(var Msg: TMessage);
  48. begin
  49.     inherited;
  50.     MouseLeave;
  51. end;
  52.  
  53. procedure TRoPanel.MouseEnter;
  54. begin
  55.     if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
  56. end;
  57.  
  58. procedure TRoPanel.MouseLeave;
  59. begin
  60.     if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
  61. end;
  62.  
  63. end.
[/pascal]

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]