Autor Beitrag
AndreM
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Win2k, WinXP, Suse 10
D7 Ent
BeitragVerfasst: Do 02.07.09 08:29 
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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. ;-)
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.

_________________
We are, we were and will not be.
AndreM Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Win2k, WinXP, Suse 10
D7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: 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)):
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Win2k, WinXP, Suse 10
D7 Ent
BeitragVerfasst: 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.

ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TMainForm.Auswahlaktivieren1Click(Sender: TObject);
begin
  if Sender Is TCheckBox then (Sender As TCheckBox).Enabled := TRUE;
end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)