Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-11-2021
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Inicializando componentes de un form

¡Buenas tardes!
Acá molestando nuevamente...

Normalmente suelo crear los formularios dinámicamente exceptuando los que utilizo frecuentemente, que prefiero que se generan automáticamente al abrir el programa.

En estos últimos, suelo escribir en el evento FormShow código para "resetear" los diversos componentes cuando necesito que el formulario vuelva a la apariencia inicial.
Por ejemplo, cosas como esta:

Código Delphi [-]
  eBuscar.Text           := '';
  seCantidad.Value       := 1;
  seCantidad.Color       := clWindow;
  ckCodigo.Checked       := TRUE;
  ckDescripcion.Checked  := TRUE;
  dbgResultado.TabStop   := FALSE;
  Modulo.Consulta.Active := FALSE;

El problema es que en ciertas PCs se alcanza a notar lo que estaba antes y se ve el "reseteo".
Por ejemplo: Si limpio el texto de un Edit, se alcanza a ver que había algo escrito y lo estoy borrando.

¿Cuál sería la manera correcta de hacer esto?.

Muchas gracias de antemano!
Responder Con Cita
  #2  
Antiguo 22-11-2021
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Como el formulario ya lo tienes creado y lo que haces es mostrarlo nuevamente, limpiando los controles.

Podrías manipular los eventos Show y ShowModal y así establecer los valores iniciales antes de mostrar el formulario.

Ejemplo:

Aplicación con 2 formularios, Form1 y Form2, ambos creados al inicio del programa.

Form1 llama al Form2

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
end;

En Form2, el evento Show limpia el texto de los Edit antes de cambiar el valor a la propiedad "Visible"

Código Delphi [-]
type
  TForm2 = class(TForm)
    Edit1: TEdit;  
    Edit2: TEdit;

    //El FormShow sigue funcionando normal, ejecutando el código al mostrarse
    procedure FormShow(Sender: TObject); 
  private  
    procedure ResetControls;
    { Private declarations }
  public
    procedure Show; reintroduce;
    function ShowModal: Integer; override;
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.FormShow(Sender: TObject);
begin
  Edit1.SetFocus;
end;

procedure TForm2.ResetControls;
  var
    i: integer;
begin
  for i := 0 to Self.ControlCount - 1 do
  begin
    if Self.Controls[i] is TEdit then
      TEdit(Self.Controls[i]).Text := '';
  end;
end;

procedure TForm2.Show;
begin
  ResetControls;

  inherited Show;
end;

function TForm2.ShowModal: Integer;
begin
  ResetControls;

  Result := inherited ShowModal;
end;

end.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #3  
Antiguo 23-11-2021
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Hola movorack!

¡Muchísimas gracias por tu detalladísima respuesta!.
Lo estuve probando y el problema no quiere irse.
Estuve pensando que quizás lo mejor sea también crear estos formularios dinámicamente, ya que los que creo de esa manera no tienen este problema.
Saludos!
Responder Con Cita
  #4  
Antiguo 24-11-2021
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Bueno, sigo haciendo pruebas...

- Volví a probar el código que propuso movorack y no noto mejoras. Lo más triste es que no entiendo el porqué, ya que el código propuesto tiene toda la lógica del mundo.
- Probé de crear los formularios "a demanda" y si bien resuelvo el problema actual, se presenta otro: los formularios tardan más en abrirse, lo cuál también es lógico.

Si estoy siendo demasiado "puntilloso", por favor me lo dicen.

Difícil la vida del programador amateur...
Responder Con Cita
  #5  
Antiguo 24-11-2021
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
En el código propuesto por [movorack] haz un 'hide' al principio de 'ResetControls'. Así te aseguras de que el formulario no está visible durante ese proceso.
Responder Con Cita
  #6  
Antiguo 24-11-2021
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Es algo extraño que los usuarios sigan viendo como limpias los controles, ya que, en el ejemplo que te he dado, eso se hace antes de cambiar el estado de la propiedad visible y por lo tanto el formulario está aún oculto. ¿Podrías compartirnos como lo implementaste en tu formulario?.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #7  
Antiguo 24-11-2021
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Muchas gracias a ambos por responder.


Les dejo el código del formulario en el que lo estoy implementando (le quité el código de los procedimientos que consideré poco relevantes para que no quede tan largo):
Código Delphi [-]
unit Tarjetas;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Spin, IniFiles, XPStyleActnCtrls,
  ActnList, ActnMan, ToolWin, ActnCtrls, StdStyleActnCtrls, Buttons, StrUtils,
  Tipos, System.Actions, PngSpeedButton, System.UITypes;

type
  TForm_Tarjetas = class(TForm)
    ActionManager: TActionManager;
    ActionToolBar: TActionToolBar;
    actAceptar: TAction;
    actCancelar: TAction;
    actCredito: TAction;
    actCtaCte: TAction;
    actDebito: TAction;
    actEfectivo: TAction;
    btnAceptar: TPngSpeedButton;
    btnCancelar: TPngSpeedButton;
    cbCredito: TComboBox;
    cbCtaCte: TComboBox;
    cbDebito: TComboBox;
    eCuotas: TEdit;
    eInteres: TEdit;
    eTotal: TEdit;
    lCuotas: TLabel;
    lInteres: TLabel;
    lTotal: TLabel;
    Panel: TPanel;
    seCuotas: TSpinEdit;
    procedure actAceptarExecute(Sender: TObject);
    procedure actCancelarExecute(Sender: TObject);
    procedure actCreditoExecute(Sender: TObject);
    procedure actCtaCteExecute(Sender: TObject);
    procedure actDebitoExecute(Sender: TObject);
    procedure actEfectivoExecute(Sender: TObject);
    procedure cbCreditoChange(Sender: TObject);
    procedure eInteresExit(Sender: TObject);
    procedure eInteresKeyPress(Sender: TObject; var Key: Char);
    procedure eInteresKeyUp(Sender: TObject; var Key: Word;  Shift: TShiftState);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormShow(Sender: TObject);
    procedure seCuotasChange(Sender: TObject);
    procedure seCuotasKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
    Archivo_Tarjetas : TIniFile;
    Venta : TDatosPago;
    procedure Actualizar_Total(Interes_Personalizado: Boolean);
    procedure ResetControls;
  public
    { Public declarations }
    property DatosPago:TDatosPago read Venta write Venta;
    procedure Show; reintroduce;
    function ShowModal: Integer; override;
  end;

var
  Form_Tarjetas: TForm_Tarjetas;

implementation

{$R *.dfm}

uses
  Principal, Varios;

procedure TForm_Tarjetas.actEfectivoExecute(Sender: TObject);
//Al presionar el botón de "Efectivo"
begin
  cbDebito.Visible  := FALSE;
  cbCredito.Visible := FALSE;
  cbCtaCte.Visible  := FALSE;
  lCuotas.Visible   := FALSE;
  seCuotas.Visible  := FALSE;
  eCuotas.Visible   := FALSE;
  lInteres.Visible  := FALSE;
  eInteres.Visible  := FALSE;

  eTotal.Text := Venta.Total;
end;

procedure TForm_Tarjetas.actDebitoExecute(Sender: TObject);
//Al presionar el botón de "Tarjeta de Débito"
begin
  cbDebito.Visible  := TRUE;
  cbCredito.Visible := FALSE;
  cbCtaCte.Visible  := FALSE;
  lCuotas.Visible   := FALSE;
  seCuotas.Visible  := FALSE;
  eCuotas.Visible   := FALSE;
  lInteres.Visible  := FALSE;
  eInteres.Visible  := FALSE;
//  cbDebito.SetFocus;

  eTotal.Text := Venta.Total;
end;

procedure TForm_Tarjetas.actCreditoExecute(Sender: TObject);
//Al presionar el botón de "Tarjeta de Crédito"
begin
  cbDebito.Visible  := FALSE;
  cbCredito.Visible := TRUE;
  cbCtaCte.Visible  := FALSE;
  lCuotas.Visible   := TRUE;
  seCuotas.Visible  := TRUE;
  eCuotas.Visible   := TRUE;
  lInteres.Visible  := TRUE;
  eInteres.Visible  := TRUE;

  seCuotas.Text  := IntToStr(Venta.Cuotas);
//  cbCredito.SetFocus;

  Actualizar_Total(FALSE);
end;

procedure TForm_Tarjetas.actCtaCteExecute(Sender: TObject);
//Al presionar el botón de "Cuenta Corriente"
begin
  cbCtaCte.Visible  := TRUE;
  cbDebito.Visible  := FALSE;
  cbCredito.Visible := FALSE;
  lCuotas.Visible   := FALSE;
  seCuotas.Visible  := FALSE;
  eCuotas.Visible   := FALSE;
  lInteres.Visible  := FALSE;
  eInteres.Visible  := FALSE;
//  cbCtaCte.SetFocus;

  eTotal.Text := Venta.Total;
end;

procedure TForm_Tarjetas.FormClose(Sender: TObject; var Action: TCloseAction);
//Libera la memoria ocupada por el archivo INI
begin
  Archivo_Tarjetas.Free;
end;

procedure TForm_Tarjetas.ResetControls;
begin
  Hide;

  //Abre el archivo Tarjetas.ini y completa el ComboBox con los nombres de las tarjetas
  Archivo_Tarjetas := TIniFile.Create (RutaAplicacion+'Datos\Tarjetas\Tarjetas.ini');

  ActualizarCombo(cbDebito, TARJETA, '2');
  ActualizarCombo(cbCredito, TARJETA, '3');
  ActualizarComboClientes(cbCtaCte);
  cbDebito.ItemIndex  := 0;
  cbCredito.ItemIndex := 0;
  seCuotas.Alignment  := taRightJustify;

  Case Venta.FormaPago of
    Contado :
      actEfectivo.Execute;

    Credito :
      begin
        If Venta.Tarjeta <> '' then
          cbCredito.ItemIndex := cbCredito.Items.IndexOf(Venta.Tarjeta);
        actCredito.Execute;
      end;

    Debito :
      begin
        If Venta.Tarjeta <> '' then
          cbDebito.ItemIndex := cbDebito.Items.IndexOf(Venta.Tarjeta);
        actDebito.Execute;
      end;

    CtaCte :
      begin
        If Venta.Cliente <> '' then
          cbCtaCte.ItemIndex := cbCtaCte.Items.IndexOf(Venta.Cliente);
        actCtaCte.Execute;
      end;
  end; {case}
end;

procedure TForm_Tarjetas.Show;
begin
  ResetControls;

  inherited Show;
end;

function TForm_Tarjetas.ShowModal: Integer;
begin
  ResetControls;

  Result := inherited ShowModal;
end;

end.

No lo mencioné, pero el defecto no lo alcanzo a percibir en mi PC (o al menos no se nota tanto)
Yo creo que es porque es una máquina más nueva que en la PC dónde se usa el programa.

Saludos y gracias!!!

Última edición por Dexter182 fecha: 24-11-2021 a las 20:21:54.
Responder Con Cita
  #8  
Antiguo 25-11-2021
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Como en tu formulario tienes un ActionManager, solo para descartar que este esté afectando el comportamiento del formulario. ¿Podrias modificar el ResetControls para que en lugar de llamar la acción llame el procedimiento?

Me explico, que en lugar de ejecutar actCtaCte.execute, llame a actCtaCteExecute(actCtaCte)
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #9  
Antiguo 26-11-2021
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Gracias por responder!

Cita:
Empezado por movorack Ver Mensaje
Me explico, que en lugar de ejecutar actCtaCte.execute, llame a actCtaCteExecute(actCtaCte)
Estuve probando esto y tampoco resultó.

Para descartar, también probé de compilar como Release en vez de Debug con idem resultado.

Y también probé esto: https://stackoverflow.com/questions/...ot-of-controls

Tampoco resultó...

¿Será alguna configuración de la PC dónde está instalado?.

Saludos y mil gracias por su tiempo!!!
Responder Con Cita
  #10  
Antiguo 26-11-2021
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Cita:
Empezado por Dexter182 Ver Mensaje
¿Será alguna configuración de la PC dónde está instalado?.
Mientras escribía el mensaje anterior se me ocurrió probar de ir deshabilitando las diversas configuraciones de "Efectos visuales" en "Configuración avanzada del Sistema" -> "Opciones avanzadas" -> "Rendimiento" -> "Configuración"

Y deshabilitando la opción: "Habilitar la composición del escritorio" se ve todo un poco más feo, pero el defecto no lo hace más.

No es la solución, pero de momento voy teniendo alguna pista de por dónde va los tiros.

Saludos!!!
Responder Con Cita
  #11  
Antiguo 26-11-2021
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Ahora que mencionas eso. Hace un tiempo manejé algo parecido. En mi caso, era cambiando el ActivePage de un PageControl. Y al igual que a ti se veía cuando dibujaba cada control y era lento.

Buscando acá y allá. En StackOverflow (creo que aquí TLabel and TGroupbox Captions Flicker on Resize) mencionaban algo de eso y encontré el siguiente procedimiento.

Código Delphi [-]
procedure EnableComposited(WinControl: TWinControl);
var
  i: Integer;
  NewExStyle: DWORD;
begin
  NewExStyle := GetWindowLong(WinControl.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED;
  SetWindowLong(WinControl.Handle, GWL_EXSTYLE, NewExStyle);

  for i := 0 to WinControl.ControlCount-1 do
    if WinControl.Controls[i] is TWinControl then
      EnableComposited(TWinControl(WinControl.Controls[i]));
end;

Le hago el llamado correspondiente previo a cambiar el ActivePage del pagecontrol y ya no muestra los controles

Código Delphi [-]
EnableComposited(PageControl1);
PageControl1.ActivePageIndex := 0;
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #12  
Antiguo 29-11-2021
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Gracias movorack!!!

Y perdón por no contestar antes, pero estuve haciendo varias pruebas y quería postear cuando ya lo tuviese resuelto, cosa que nunca sucedió, jaja.
Te agradezco muchísimo la información que me pasaste, ya que del link que pusiste saqué mucha información.
Probé el procedimiento EnableComposited en varias partes (antes del llamado del form, en el formshow del form problemático, pasando solo los componentes problemáticos en vez del form entero, etc.) y si bien pareciera que la situación mejoró un poco, el defecto no termina de desaparecer.
También probé de habilitar la opción "Doble buffered" de los forms, prácticamente sin resultados.

Para tener más datos, estuve probando el programa en otras PCs y me di cuenta que el defecto sólo lo hace en las que tienen Windows 7.
Casualmente la PC dónde se usa actualmente va a recibir un upgrade (disco SSD y Windows 10), así que dentro de unas semanas les cuento si finalmente era ese el problema.

Muchas gracias por todo!!!

Saludos!!!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ajustar componentes en form Rofocale Varios 9 08-12-2010 19:11:46
Componentes sin form. rauros Varios 33 31-07-2008 08:51:44
Mostrar una ventana "Inicializando" mientras se crean las Forms mancurnino Varios 6 08-05-2008 00:50:00
Ayuda con componentes en form Vinicio Varios 8 13-09-2006 21:38:50
componentes sin form coleleon OOP 1 30-11-2005 13:10:56


La franja horaria es GMT +2. Ahora son las 09:06:27.


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
Copyright 1996-2007 Club Delphi