PageControl setFocus Error

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Lowpix
Beiträge: 2
Registriert: Mi 20. Mai 2015, 10:49

PageControl setFocus Error

Beitrag von Lowpix »

Hallo,
ich versuche mein Problem mal zu erklären.Ich habe ein Formular auf diesem Formular habe ich eine PageControl mit 3 Tabsheets. Auf diese 3 Tabsheets sind mehrere TLabeledEdit verteilt quasi Pro Tabsheet eine "Kategorie" finde ich für die Übersicht schöner. Ich überprüfe ein paar Pflichtfelder mit der folgenden Procedur.

Code: Alles auswählen

procedure TForm.Edit1TextExit(Sender: TObject);
var q: Integer;
 
begin
  q:= trim(Length(TLabeledEdit(Sender).Text)) ;
  if (q <=3) then
    begin
    ShowMessage('Bitte Text eingeben. Größer 3');
    TLabeledEdit(Sender).color:=clRed;
    TLabeledEdit(Sender).setFocus;
    Abort;
    end
  else
    TLabeledEdit(Sender).color:=clDefault;
end; 
Diese Procedur wird im onExit Ereignis aufgerufen.Das klappt auch soweit ganz gut.
Mein Problem ist wenn ein User jetzt z.b. die Message angezeigt bekommt geht der Focus auf das Feld zurück und es wird Rot wechselt der Benutzer jetzt aber den Tab (möchte also erstmal andere Felder ausfüllen) dann bekomme ich einen Error "Cannot Focus a disabled ..." was natürlich auch klar ist weil die ActivePage ja dieses TLabeledEdit Feld ja nicht anzeigt.
Meine Frage jetzt wie kann ich das umgehen?
Überlegung :
In der Procedur das Aktuelle Tabsheet(AktivePage) abfragen und dann den Focus auf das Feld zurück?Quasi solange das Feld nicht richtig ausgefüllt ist kommt der Benutzer auch nicht auf Tabsheet2 die nicht aktiven Tabsheets un klickbar machen (Bitte mit Code?)
Eine Möglichkeit findet sobald man auf einen anderen Tab klickt den setFocus abbrechen( Wenn das geht wie mit Code).
Welche Daten stehen im (Sender: TObject)?
Andere Möglichkeit.?

Vielen Dank

wp_xyz
Beiträge: 5147
Registriert: Fr 8. Apr 2011, 09:01

Re: PageControl setFocus Error

Beitrag von wp_xyz »

Nach meiner Erfahrung führt jede Fehlerbehandlung während der Eingabe (OnKeyPress) bzw beim Verlassen eines Controls (OnExit) zu solchen Verwirrungen beim Benutzer (und beim Programmierer), falls die Eingabe nicht in der vorgesehenen Weise erfolgt. Viel leichter ist es, den Benutzer drauflos tippen zu lassen, und erst beim Schließen des Formulars bzw. in deinem Fall beim Wechseln des Tab die Eingabe zu prüfen, in das fehlerhafte Feld zurückzuwechseln und eine Fehlermeldung auszugeben. Üblicherweise habe ich für die Eingabeprüfung eine Methode "ValidData", die Fehlermeldung und das fehlerhafte Control, sowie einen bool'schen Wert zurückgibt:

Code: Alles auswählen

 
function TForm1.ValidData(var C:TWinControl; var ErrMsg: String): Boolean;
begin
  Result := false;
  if Length(LabeledEdit1.Text) <= 3 then
  begin
    C := LabeledEdit1;
    ErrMg := 'Bitte Text eingeben, mehr als drei Zeichen.';
    exit;
  end;
  // weitere Fälle prüfen, jeweils mit "exit" rausspringen
  // ...
  // Wenn die Routine bis hierher kommt, muss alles richtig sein:
  C := nil;
  ErrMsg := '';
  Result := true;
end;
 
procedure TForm1.FormCloseQuery(Sender: TObject; var Allowchange: Boolean);
// oder: procedure TForm1.PageControl1Changing(Sender: TObject; var AllowChange: Boolean);
// oder: procedure TForm1.OKButtonClick(Sender: TObject):  --> hier im Fehlerfall ModalResult of mrNone setzen
var
  C: TWinControl;
  msg: string;
begin
  if not ValidData(C, msg) then
  begin
    C.SetFocus;
    MessageDlg(msg, mtError, [mbOK], 0);
    AllowChange := false;  // bzw. ModalResult := mrNone im Fall des OKButtons
  end else
    AllowChange := true;  // Im Fall des OKButtons kann dieser Zweig entfallen.
end;
 

Lowpix
Beiträge: 2
Registriert: Mi 20. Mai 2015, 10:49

Re: PageControl setFocus Error

Beitrag von Lowpix »

@wp_xyz:
Vielen Dank für Deinen Code. :D

Antworten