Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Deaktivierte CheckBox im onMouseDown aktivieren
AndreM - Do 02.07.09 08:29
Titel: Deaktivierte CheckBox im onMouseDown aktivieren
Hallo zusammen,
ich stehe derzeit vor einem kleinen Problem wo die Lösung dich so einfach scheint ich aber einfach nicht auf eine Lösung komme.
Und zwar habe ich eine CheckBox bei die ich standardmäßig "enabled := false" gesetzt habe. Jetzt möchte ich das dem User bei einem rechtsklick auf die Checkbox ein PopUp angezeigt wird in dem er auswählen kann ob die Checkbox aktiviert werden soll. PopUp ist soweit ja kein Problem, nur solange die Checkbox "enabled := false" hat, werden die onClick und onMouse-Events erst überhaupt nicht ausgeführt.
Wie also kann ich per Mausklick auf eine Checkbox einen Checkbox aktivieren, die eigentlich deaktiviert ist und somit eigentlich gar nicht angeklickt werden kann. :(
Gruß
André
Niko S. - Do 02.07.09 08:38
Ist vielleicht nicht unbedingt eine elegante Lösung aber:
State auf cbGreyed setzen & bei OnClick den Status immer wieder herstellen solange bsp, der Tag auf 0 (Disable) steht
was er ja auch standartmäßig macht.
jaenicke - Do 02.07.09 10:20
Sehr einfach:
Beim Formular KeyPreview auf True und dann einfach im OnMouseDown des Formulars prüfen, ob die rechte Maustaste gedrückt wurde und das über der CheckBox. Das dann noch ggf. in einer Schleife für alle CheckBoxen. ;-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TFormX.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var PopupPoint: TPoint; begin PopupPoint := ClientToScreen(Point(X, Y)); if (Button = mbRight) and PtInRect(CheckBoxX.BoundsRect, Point(X, Y)) then CheckBoxX.PopupMenu.Popup(PopopPoint.X, PopupPoint.Y); end; |
Sollte so klappen. ;-)
Gausi - Do 02.07.09 10:31
Das mag funktionieren, allerdings solltest du dir überlegen, ob so ein Verhalten deiner Anwendung intuitiv und für den Anwender ersichtlich ist. Ein deaktiviertes Element auf einer Form ist deaktiviert - da erwartet man als Windowsuser keine Reaktion, wenn man darauf klickt.
Evtl. wäre dafür eine Einstellmöglichkeit in einem separaten Settings-Dialog oder eine weitere Checkbox sinnvoller. Oder auch ein "globales" Popupmenü für die Groupbox oder das Panel, in dem diese Checkbox liegt.
AndreM - Do 02.07.09 14:57
Erstmal besten dank für die Lösungsansätze, werd ich morgen mal in Ruhe versuchen.
@Gausi: Es soll auch nicht für jeden Benutzer ersichtlich sein, dass es diese Möglichkeit gibt. Soll quasi mehr zu Debugzwecken für den Admin genutzt werden um schnell eine andere Anzeige erzwingen zu können, ohne das er den Benutzer ausloggen oder das Programm neu starten muss. ;)
jaenicke - Do 02.07.09 15:00
Dann würde ich auch Shift prüfen, und das nur anzeigen, wenn Strg + Shift oder so beim Rechtsklick gedrückt sind oder so. ;-)
ffgorcky - Do 02.07.09 17:42
Das ist jetzt zwar eine nicht so erstrebenswerte, weil doch recht unsaubere Lösung, aber Du könntest doch auch direkt dadrüber ein Label ohne Text setzen, welches nur dann
visible=false ist, wenn in dem Popup, welches Du durch einen Click auf das Label anzeigen lässt, dann das Ankreuzen erwünscht wurde, also z.B. so
(in
procedure LabelDeckschicht.OnMouseDown(ParameterWeißIchJetztGeradeNichtAuwendig)):
Delphi-Quelltext
1: 2: 3: 4: 5:
| if (Button=mbRight) and (MessageBox(Form1.WindowHandle,'Soll die Checkbox wirklich aktiviert werden?','Checkbox aktivieren?',MB_YesNo)=IDYES) then begin LabelDeckschicht.Visible:=False; CheckboxWieAuchImmerSieHeisst.Checked:=True; end; |
AndreM - Fr 03.07.09 10:50
Moin zusammen,
den obigen Code noch etwas ergänzt, dann klappt es genau so wie ich mir das vorgestellt habe.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TFormX.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var PopupPoint: TPoint; begin PopupPoint := ClientToScreen(Point(X, Y)); if (Button = mbRight) and PtInRect(CheckBoxX.BoundsRect, Point(X, Y)) then begin CheckBoxX.PopupMenu.Popup(PopopPoint.X, PopupPoint.Y); MainForm.Auswahlaktivieren1Click(CheckBoxX); end; end; |
Auswahlaktivieren1Click sieht dann so aus:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TMainForm.Auswahlaktivieren1Click(Sender: TObject); begin if Sender Is TCheckBox then (Sender As TCheckBox).Enabled := TRUE; end; |
jaenicke - Fr 03.07.09 10:55
Wobei es wie gesagt wohl sinnvoll wäre, das unzugänglicher zu machen, um es nicht zufällig zu finden, wenn das nur der Admin machen soll.
Delphi-Quelltext
1:
| if (Button = mbRight) and (ssCtrl in Shift) and PtInRect(CheckBoxX.BoundsRect, Point(X, Y)) then |
So muss man Strg gedrückt haben derweil.
Nersgatt - Fr 03.07.09 11:34
Ich denke, bei solchen "Geheimfunktionen" muss man bei der Sicherung abwägen, wie gefährlich sie sind. Wenn es nur ein paar Debuginfos ausgibt -> muss man nicht wirklich sichern. Wenn man an eine Funktion kommt, mit der man evtl. Mist machen kann -> Muss man besser sichern. Wir habe z.B. in unseren Produkten eine Möglichkeit SQL-Befehle einzugeben und auszuführen. Da kommt man nur mit einer (nicht dokumentierten) Tastenkombination dran. Und wenn ein User diese Kombination doch mal rausbekommt, dann muss er noch einen 3-stelligen Code eingeben.
Jaaa, ich weiß, das ist leicht zu knacken. Aber wenn der User da rein will, kann er auch gleich mit IBExpert auf die DB zugreifen. Und dann ist er sowieso für ein Tun und seine Daten selbst verantwortlich.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!