Autor Beitrag
wisher
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 54
Erhaltene Danke: 1



BeitragVerfasst: Fr 16.06.06 11:01 
Hallo,

folgendes:

Abhängig ob ich mich mit dem Maus Zeiger über einer Zelle in einem StringGrid befinde oder nicht, verändere ich deren Inhalt. Mit dem OnMouseMove - Event klappt das auch ganz gut.

Das Problem ist jetzt, wenn ich den Mauszeiger sehr schnell aus dem StringGrid heraus,
bzw. auf die Scrollbar des Grids bewege, bekommt das OnMouseMove Event nicht mehr mit,
dass es sich nicht mehr auf Zelle "xyz" befindet und der Inhalt der Zelle bleibt fälschlicherweise stehen.

Meine erste Idee wäre, mit Hilfe eines OnMouseMove-Events der ganzen Applikation zu prüfen, ob sich der Mauszeige überhaupt noch über dem Grid befindet und wenn nicht,
den Inhalt der Zelle zu korrigieren.

Meine erste Frage ist: Hat jemand eine bessere Lösung für das Problem und wenn nicht...
kann ich die Cursor-Position der ganzen Applikation ermiteln ? Die OnMouseMove - Events der einzelnen Container (Formluar, Panls, etc.) nützen mir nix.

Vielen Dank schonmal !

Sascha
Arno Nym
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131



BeitragVerfasst: Fr 16.06.06 17:05 
Hi, das abfangen von Botschaften ist relativ einfach, wird dir aber in dem Fall wahrscheinlich nicht viel nützen, da die Botschaft (OnMouseMove) für das Formular nicht abgefeuert werden wird wenn du auf dem Scrollbalken des Grids bleibst. Ich schicke trotzdem mal den Code, da die Frage ja hier häufig gestellt wird. Das Beispiel bezieht sich auf das Abfangen bei einem Formular, und beinhaltet bereits ein kleines Aufarbeiten der Message.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
type
  TForm1 = class(TForm)
  procedure wndProc(var Message:TMessage); override;
  Procedure myMousedown(MB,X,Y:Integer);
  Procedure myMouseup(MB,X,Y:Integer);
  Procedure myMousewheel(A:Integer);
  Procedure myMousemove(X,Y:Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  keys: array[0..255] of boolean; // Tasten-Status des Keyboards

implementation

{$R *.DFM}

Procedure TForm1.myMousedown(MB,X,Y:Integer);
begin;
end;

Procedure TForm1.myMouseup(MB,X,Y:Integer);
begin;
end;

Procedure TForm1.myMousewheel(A:Integer);
begin;
 IF A = 120 Then begin
  //hoch scrollen
 end
 else begin
  //runter scrollen
 end;
end;

Procedure TForm1.myMousemove(X,Y:Integer);
begin;
end;

procedure TForm1.wndProc(var Message:TMessage);
begin;
with Message do begin;
 case (msg) of
  WM_CREATE: // Wenn Programm gestartet wird (onCreate)
   begin
   end;
  WM_CLOSE:  // Wenn Programm beendet wird (onClose)
   begin
    PostQuitMessage(0);
    result := 0
   end;
  WM_KEYDOWN: // Reaktion auf Tastendruck (onKeyDown)
   begin
    keys[wParam] := true;
    result:= 0;
   end;
  WM_KEYUP: // Reaktion auf loslassen einer Taste (onKeyUp)
   begin
    keys[wParam] := false;
    result := 0;
   end;
  WM_SIZE:  // Größe des Fensters anpassen
   begin
    result := 0;
   end;
  WM_TIMER: // Timer-behandlung
   begin
   end;
  WM_LBUTTONDOWN:
   begin;
    myMousedown(0,LOWORD(lParam),HIWORD(lParam));
   end;
  WM_RBUTTONDOWN:
   begin;
    myMousedown(1,LOWORD(lParam),HIWORD(lParam));
   end;
  WM_LBUTTONUP:
   begin;
    myMouseup(0,LOWORD(lParam),HIWORD(lParam));
   end;
  WM_RBUTTONUP:
   begin;
    myMouseup(1,LOWORD(lParam),HIWORD(lParam));
   end;
  WM_MOUSEMOVE:
   begin;
    myMousemove(LOWORD(lParam),HIWORD(lParam));
   end;
  WM_MOUSEWHEEL:
   begin;
    myMousewheel(HIWORD(wParam));
   end;
  else //alle anderen Messages durchleiten
   inherited WndProc(Message);
   //result := DefWindowProc(Form1.WindowHandle, msg, wParam, lParam);
 end;
 end;
end;


MFG, Arno Nym
PLuS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98

Win XP, Suse Linux 9.0
D5 Standard, D2005 Personal; Perl; PureBasic
BeitragVerfasst: Fr 16.06.06 17:27 
Zum Ermitteln der Mouse-Position:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
var
  Point: TPoint;
//...
GetCursorPos(Point);



Warum fragst du nicht einfach im OnMouseMove-Event ab, ob du über einem Item bist?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Item: TListItem;
begin
  with Sender as TListView do
  begin
    Item := GetItemAt(X, Y);
    if assigned(Item) then
      //Do something
  end;  
end;

_________________
Der letzte macht die Tür zu!