Einzelnen Beitrag anzeigen

OLLI_S

Registriert seit: 20. Aug 2006
19 Beiträge
 
Delphi 7 Architect
 
#1

Verhalten diverser Komponenten ändern

  Alt 15. Okt 2006, 20:02
Liebe Community,

ich habe in meiner Anwedung eine Schaltfläche (mit dem Symbol des Hilfepfeil crHelp als Bild).
Klickt der Anwender diese Schaltflähe und anschließend auf ein Element, wird in der Statuszeile eine Hilfe zu dem entsprechenden Element angezeigt.
Eigentlich nichts kompliziertes.

Dazu habe ich in meinem Hauptformular eine Funktion ZeigeHilfe, die überprüft, ob der Hilfemodus aktiv ist oder nicht (sobald man den Button Hilfe klickt, wird der Hilfemodus auf True gesetzt). Ist der Hilfemodus aktiv, wird ein übergebener Text als Hilfe in der Statuszeile angezeigt, der Hilfemodus auf False gesetzt (und der Cursor auf crDefault) und die Funktion liefert ein TRUE zurück (also dass eine Hilfe anzuzeigen war).
Ist der Hilfemodus nicht aktiv, wird nur ein False zurückgeliefert (bedeuted dass nichts anzuzeigen war).

Der Code dazu schaut so aus:

Delphi-Quellcode:
function TfrmHauptFenster.ZeigeHilfe(aHelpText: string): Boolean;
begin
   if HilfeModus then
   begin
      ZeigeHinweisInStatusbar(aHelpText);
      HilfeModus := False;
      Result := True
   end
   else
   begin
      Result := False;
   end;
end;
Bei einer normalen Schaltfläche (z.B. Button "Neuer Datensatz") führe ich folgendes aus:

Delphi-Quellcode:
procedure TfrmHauptFenster.btnToolbarNewClick(Sender: TObject);
begin
   if not ZeigeHilfe(HilfeTextFuerNeuenDatensatz) then
   begin
      // Es soll keine Hilfe angezeigt werden -> hier kommen Aktionen für den neuen Datensatz (habe ich hier im Forum weg gelassen)
   end;
end;
Das ganze funktioniert also ganz gut.

Bei Buttons habe ich das Event "OnClick" verwendet, um die Hilfe anzuzeigen.
Bei Eingabelfern (TEdit und TDBEdit) habe ich auch das Event "OnClick".

Eine Bitte an dieser Stelle:
Bitte bewertet hier nicht meinen bisherigen Code. Manch einer könnte sagen, dass man das letzte begin...end bei "ZeigeHilfe" weglassen kann, aber das ist nicht mein Problem. Es soll hier keine Diskussion über meinen Code entstehen, sondern auf mein Problem eingegangen werden.
Mein Problem folgt hier....

Jetzt habe ich das Problem mit folgenden Komponenten:
- TComboBox
- TDBComboBox
- TKADaoDBGrid
- TCheckBox
- TDBCheckBox

Bei Checkboxen wird bei OnClick und bei OnMouseDown immer die CheckBox angehakt.
Einfach nur die Checkbox im Hilfemodus wieder abhaken (also Checkbox.checked := not Checkbox.checked) ist bescheuert, da manche Checkboxen Datensatzfilter auslösen und man dann beim Klicken der Checkbox mit dem Hilfecursor einen ganz anderen Kunden (dann ist der Filter aktiv) angezeigt bekommt und dann wieder plötzlich alle Kunden (aber auch nicht den aktuellen).
Gibt es einen Weg bei einer Checkbox beim OnClick die Checkbox NICHT anzuhaken?

Bei ComboBoxen habe ich das Problem, dass ich gerne das aufklappen der Liste verhinder würde.

Bei folgendem Quelltext:
Delphi-Quellcode:
procedure cboKundenArtMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
   if (HilfeModus) then
      ShowMessage('Hilfe zu KundenArt') else
      cboKundenArt.DropDown;
end;
wird die Liste NICHT aufgeklappt und nur der Hinweis angezeigt (in einem Hinweisfenster).
Ersetze ich das "ShowMessage" durch "ZeigeHilfe" wird zwar der Hinweistext in der Statuszeile angezeigt, aber die Listbox klappt auf.
Wie kann ich das Aufklappen der ComboBoxen beim Anklicken verhindern?

Bei dem TKADaoDBGrid habe ich das Problem, dass auch im Hilfemodus der aktuelle Datensatz gewechselt wird (die TKADaoDBGrid wird zur auswahl eines Kunden und damit zur Datensatznavigation verwendet). Im Hilfemodus soll aber kein Datensatz gewechselt werden.
Ich verwende hier den Event "OnMouseDown" , da der Event "OnCellClick" nur bei Datenzeilen funktioniert. Wenn das Grid selbst aber nur wenige Datensätze enthält und der User klickt in den weißen Bereich unterhalb des letzten Datensatzes, passiert nichts (kein Event "OnCellClick").
Wie kann ich hier die Datensatznavigation unterbinden?


Vielen Dank für Eure Hilfe

Gruß

OLLI
  Mit Zitat antworten Zitat