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
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 17:57:18.


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