Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Recuperar el ActiveControl en Form Embebido en PageControl (https://www.clubdelphi.com/foros/showthread.php?t=94231)

juniorSoft 12-10-2019 14:11:19

Recuperar el ActiveControl en Form Embebido en PageControl
 
Hola Amigos,

Tengo el siguiente código que con ayuda de nuestro amigo ecfisa realizamos para cambiar el color del control activo cuando tenga el foco

Código Delphi [-]
type
  TForm1 = class(TForm)
    ...
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    procedure ActiveCtrlChange(Sender: TObject);
  ...
  end;

...
implementation

uses TypInfo;

const
  FOCUSEDCOLOR   = clMoneyGreen;
  UNFOCUSEDCOLOR = clWindow;

var
  PrevFocusedCtrl: TWinControl = nil;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Screen.OnActiveControlChange:= ActiveCtrlChange;
end;

procedure TForm1.ActiveCtrlChange(Sender: TObject);
begin
  if not Assigned(PrevFocusedCtrl) then
    PrevFocusedCtrl:= ActiveControl;

  if Assigned(GetPropInfo(PrevFocusedCtrl.ClassInfo, 'Color')) then
  begin
    // SetOrdProp(PrevFocusedCtrl, 'Color', UNFOCUSEDCOLOR);
    if PrevFocusedCtrl.StyleElements = [seBorder] then
           PrevFocusedCtrl.StyleElements:=[seFont, seClient, seBorder];
 end;
  if Assigned(GetPropInfo(ActiveControl.ClassInfo, 'Color')) then
  begin
    SetOrdProp(ActiveControl,'Color', FOCUSEDCOLOR);
    Activecontrol.StyleElements:=[seBorder];
    PrevFocusedCtrl:= ActiveControl;
     
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Screen.OnActiveControlChange:= nil;
end;

El cual realizamos en este hilo Cambiar color de los controles de edicion al entrar en ellos utilizando VCL Styles

El inconveniente surge cuando el formulario esta embebido en un TabSheet del PageControl y el ActiveControl no tiene componente asignado o dicho de otra manera es nil aunque en el Formulario Embebido si se encuentre un control seleccionado. si sustituyo activeControl por Screen.activeControl entonces funciona pero luego de abrir cualquier formulario de búsqueda modal vuelve y se pierde.

Me gustaría encontrar la forma de que se pueda recuperar el activeControl y estoy casi seguro que hacerlo conlleva utilizar las funciones del api de windows pero no tengo mucha experiencia con este tema.

Agradecido enormemente de este Foro.

Saludos,


La franja horaria es GMT +2. Ahora son las 18:18:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi