Entwickler-Ecke
Sonstiges (Delphi) - StringGrid SelectCell/Markiere Cell Problem (erledigt)
Killi - Mi 10.12.03 15:20
Titel: StringGrid SelectCell/Markiere Cell Problem (erledigt)
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:
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; |
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TFMain.FrameWoche1SGridMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SelectTag:= False; end; |
Delphi-Quelltext
1: 2: 3: 4:
| if SelectTag = True then begin FrameWoche1.SGrid.Refresh; 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?
Tana´Ri - 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).
Killi - 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....
Killi - Do 11.12.03 10:36
tut NICHT :cry:
Killi - 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)....
Tana´Ri - 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.
Killi - Do 11.12.03 14:24
HABS!
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 + 10) or (Y < MouseY - 10) then 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!