Autor Beitrag
Killi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 299

Win*
D6 Prof
BeitragVerfasst: Mi 10.12.03 15:20 
Hi!

Ich will in meinem StringGrid Zellen MARKIEREN und einzelne Zellen ANKLICKEN können - wenn man sie anklickt springt man zum TAG - das mach ich über SelectCell! Das GEHT allerdings nicht mehr, seit ich die Markierungen so eingebaut habe:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TFMain.FrameWoche1SGridMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
   BCol, BRow, b: integer;
   DatumCount: TDateTime;
   Zeit, ZeitStd, ZeitMin: string;
   ZeitPos: integer;
   BRect: TGridRect;
   Zeittmp: TTime;
begin
      SelectTag:= True;
.......(Procedures beim RECHTS-Klick)
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TFMain.FrameWoche1SGridMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
     SelectTag:= False;
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
     if SelectTag = True then
     begin
          FrameWoche1.SGrid.Refresh; // Um die Markierungen neu zu zeichnen
     end;



da stört natürlich das OnMouseDown den OnSelectCell.......wie kann ich das lösen? Wie kann ich es machen, dass bei einem EINFACHEN KLICK meine Sachen in OnSelectCell ausgelöst werden und beim linke-Maustatse-gedrückt-halten meine Markierungen?

_________________
----
Life is hard and then you die


Zuletzt bearbeitet von Killi am Do 11.12.03 14:25, insgesamt 1-mal bearbeitet
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Do 11.12.03 10:23 
also je nach status deiner linken Mousetaste zur zeit des OnCellSelect Events willst du verschieden reagieren (so versteht ichs mal). Der Ansatz mit dem Bool is ja eigentlich Ok, ich geh mal davon aus das du im OnCellSelect so abfragen willst ob die Taste noch gedrückt ist oder nicht
und je nachdem dann deine Procs aufzurufen. Wenn er aber das OnSelectEvent nun kurz nach dem MouseDown auslöst und dies vermutlich vor dem MouseUp, so scheint die boolische Lösung nicht wirksam, mir fällt spontan dazu nur Application.ProcessMessages ein die vielleicht dazu führt dass das leicht temporär verzögerte MouseUpEvent vorgezogen wird und danach in deine OnCellSelect zurückkehrt. Eine Andere variante wäre den Tastenstatus zu ermitteln, in der WndProc könntest du die entsprechenden Messages abfangen bzw. Application.OnMessage und somit frühzeitiger als die Komponente erhalten (so könntest du auch sichergehn das die Messages vom MouseUp verarbeitet wird falls es mit dem MouseUpEvent nicht funktionieren sollte).

_________________
mfg
Tana´Ri
Killi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 299

Win*
D6 Prof
BeitragVerfasst: Do 11.12.03 10:30 
Die Boolean-Variante funzt wunderbarschdens, sonst würde sich meine Grid ja nicht aktualisieren :)
Klingt alles n bisschen kompliziert.....ich werd mal versuchen, die Boolean-Variable anders reinzumachen bzw. ne neue dazu...z.Bsp. linke Maustaste gedrückt (in OnMouseDown) und ERST im OnMouseMOVE dann SelectTag = True setzen WENN linke gedrückt....so hab ich vielleicht n kleinen Trick, der dann dazu führt dass - wenn man auf ne Zelle klickt (kurz) und die Maus nicht bewegt (was man ja bei nem einfachen Klick meist nicht tut) dann das OnSelectSell aufgerufen wird....
Versuch isses wert....

_________________
----
Life is hard and then you die
Killi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 299

Win*
D6 Prof
BeitragVerfasst: Do 11.12.03 10:36 
tut NICHT :cry:

_________________
----
Life is hard and then you die
Killi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 299

Win*
D6 Prof
BeitragVerfasst: Do 11.12.03 10:49 
OnSelectCell wird eindeutig VOR OnMouseDOWN aufgerufen, was total Schwachsinnig für die Kompo ist..........es wird meine Boolean aber nicht verändert (in MDown)....

_________________
----
Life is hard and then you die
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Do 11.12.03 13:19 
dann wird die Reihenfolge

OnEvent: CellSelect -> MouseDown -> MouseUp

sein.

Ich würd mal versuchen die logische verknüpfung per Application.ProcessMessages zu manipulieren, d.h. im OnCellSelect rufst du diese Proc auf, könnte eventuell die Abarbeitrungsreihenfolge ändern. Ansonsten könntest du nach ner Message für deine Anwendung suchen die einer MouseUp oder MouseMove entspricht [PeekMessage]. Eine funktion wie GetKeyState für die Mouse fällt mir grad nicht ein. Aber ein Versuch könnte es wert sein.

_________________
mfg
Tana´Ri
Killi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 299

Win*
D6 Prof
BeitragVerfasst: Do 11.12.03 14:24 
HABS!

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:
procedure TFMain.FrameWoche1SGridMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
   if Button = mbLeft then
   begin
      SelectTag:= True;
   end;
end;

procedure TFMain.FrameWoche1SGridMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
if SelectTag = True then
begin
     if MouseMoveFirst = True then
     begin
          MouseX:= X;
          MouseY:= Y;
          MouseMoveFirst:= False;
     end;

     if (Y > MouseY + 10or (Y < MouseY - 10then
     begin
          MouseMoved:= True;
     end
     else
     begin
          MouseMoved:= False;
     end;
end;
end;

procedure TFMain.FrameWoche1SGridMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if MouseMoved = True then
begin
     showmessage('!markieren!');
end
else
begin
     showmessage('springen!');
end;
     SelectTag:= False;
     MouseLeft:= False;
     MouseMoveFirst:= False;
     MouseMoved:= False;
end;


procedure TFMain.FrameWoche1SGridSelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
MouseLeft:= True;
MouseMoveFirst:= True;
end;



Det wars! Ich prüf somit, ob meine Maus in der Zeit zw. MouseUp&Down bewegt wurde (min.10 Pixel hoch/runter) un in MouseUp hab ich dann das Ergebnis...jetzt muss ich die Variablen noch weitergeben und fettich das Ganze!!!

THX

_________________
----
Life is hard and then you die