Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TabSheet aktivieren auf dem ein Control ist (https://www.delphipraxis.net/208269-tabsheet-aktivieren-auf-dem-ein-control-ist.html)

mjustin 6. Jul 2021 13:52

TabSheet aktivieren auf dem ein Control ist
 
Wenn nach einer Validierung der eingegebenen Werte feststeht, dass ein Control einen ungültigen Wert enthält, soll dieses aktiviert werden (mit SetFocus). Das geht nicht, wenn das Control auf einem inaktiven TabSheet eines PageControls ist.

Mit diesem Code soll das TabSheet aktiviert werden, auch in dem Fall dass das PageControl selber auf einem TabSheet ist.
Gibt es einfachere Lösungen, oder sogar etwas in gängigen Bibliotheken wie z.B. Jedi?

Delphi-Quellcode:
procedure TryActivateTabSheetContaining(const AControl: TControl);
var
   PC: TPageControl;
 
   function FindPageControlRecursiveFor(const AControl: TControl): TPageControl;
   begin
      if AControl.Parent is TForm then
         Exit(nil)
      else if AControl.Parent is TTabSheet then
      begin
         Result := AControl.Parent.Parent as TPageControl;
         Result.ActivePage := AControl.Parent as TTabSheet;
         Exit;
      end
      else
         Exit(FindPageControlRecursiveFor(AControl.Parent));
   end;

begin
   PC := FindPageControlRecursiveFor(AControl);
   if PC = nil then
      Exit
   else
      TryActivateTabSheetContaining(PC);
end;

(Als Umgebung wird Delphi 10.2 verwendet)

Uwe Raabe 6. Jul 2021 14:54

AW: TabSheet aktivieren auf dem ein Control ist
 
Zitat:

Zitat von mjustin (Beitrag 1491949)
Gibt es einfachere Lösungen

Gibt es:
Delphi-Quellcode:
procedure ForceFocus(const AControl: TWinControl);
var
  control: TControl;
begin
  control := AControl;
  while control <> nil do begin
    if control is TCustomForm then Break;
    if control is TTabSheet then
      TTabSheet(control).PageControl.ActivePage := TTabSheet(control);
    control := control.Parent;
  end;
  AControl.SetFocus;
end;

Der schöne Günther 6. Jul 2021 17:29

AW: TabSheet aktivieren auf dem ein Control ist
 
Es geht noch viel einfacher: Einfach das entsprechende TEdit mit
Delphi-Quellcode:
Show()
sichtbar machen, das PageControl wechselt dabei automatisch auf das richtige TabSheet:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   asNumber: Integer;
begin
   if(not Integer.TryParse(Edit1.Text, asNumber)) then
      begin
         Edit1.Show();
         Edit1.SetFocus();
      end;
   if(not Integer.TryParse(Edit2.Text, asNumber)) then
      begin
         Edit2.Show();
         Edit2.SetFocus();
      end;
end;

mjustin 7. Jul 2021 08:36

AW: TabSheet aktivieren auf dem ein Control ist
 
Vielen Dank für die Antworten! Beide Lösungen habe ich erfolgreich getestet.
Die Show Methode ist in ihrer Kompaktheit kaum noch zu überbieten.

Vielleicht poste ich dies mal auf Stackoverflow ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz