Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-04-2019
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.876
Poder: 14
oscarac Va por buen camino
Thumbs up Foco perdido al invocar un segundo formulario

no se si el titulo sea el correcto
pero tengo un problema

un DBEDIT al cual debo ingresarle un dato y este dato debe estar validado

para la validacion del dato (en este ejemplo forma de pago) tengo esta unidad

Código Delphi [-]
unit frmCatalogoFormaPago_f;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, Buttons, DBCtrls, ExtCtrls,
  ComCtrls, ComObj, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
  FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
  FireDAC.Stan.Async, FireDAC.DApt, FireDAC.Comp.DataSet, FireDAC.Comp.Client,
  System.Actions, Vcl.ActnList;

type
  TfrmCatalogoFormaPago = class(TForm)
    PageControl: TPageControl;
    Panel1: TPanel;
    DBNavigator1: TDBNavigator;
    edtSearch: TEdit;
    btnAgrega: TBitBtn;
    btnModifica: TBitBtn;
    btnElimina: TBitBtn;
    btnImprime: TBitBtn;
    btnExcel: TBitBtn;
    BitBtn2: TBitBtn;
    Panel3: TPanel;
    dbgFormaPago: TDBGrid;
    Panel4: TPanel;
    lblSearch: TLabel;
    dsqryFormaPago: TDataSource;
    qryVerificaKodFormaPago: TFDQuery;
    qryFormaPago: TFDQuery;
    qryFormaPagodescripcion: TWideStringField;
    qryVerificaKodFormaPagoKOD: TWideStringField;
    qryCapturaData: TFDQuery;
    qryCapturaDataEmpresa: TWideStringField;
    qryCapturaDataKod: TWideStringField;
    qryCapturaDataDescripcion: TWideStringField;
    qryFormaPagoEmpresa: TWideStringField;
    qryFormaPagoKod: TWideStringField;
    procedure FormCreate(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
    procedure dbgFormaPagoTitleClick(Column: TColumn);
    procedure BitBtn2Click(Sender: TObject);
    procedure btnAgregaClick(Sender: TObject);
    procedure btnModificaClick(Sender: TObject);
    procedure btnEliminaClick(Sender: TObject);
    procedure dbgFormaPagoDblClick(Sender: TObject);
    procedure dbgFormaPagoDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure dbgFormaPagoKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    btn_opcion : integer;
    t_para :Boolean;
    { Public declarations }
  end;

var
  frmCatalogoFormaPago: TfrmCatalogoFormaPago;

implementation

uses frmMain_f, dmGlobal_d, frmCatalogoFormaPagoD_f, Librerias_u;

{$R *.dfm}

procedure TfrmCatalogoFormaPago.BitBtn2Click(Sender: TObject);
begin
  if edtSearch.Text <> '' then
     qryFormaPago.Params.ParamByName('edtSearch').AsString := '%'+ edtSearch.Text + '%'
  else
     qryFormaPago.Params.ParamByName('edtSearch').AsString := '%';

  qryFormaPago.Close;
  qryFormaPago.Open;

end;

procedure TfrmCatalogoFormaPago.btnAgregaClick(Sender: TObject);
begin
  btn_opcion := 0;
  qryFormaPago.Append;
  frmCatalogoFormaPagoD := TfrmCatalogoFormaPagoD.Create(Nil);
  frmCatalogoFormaPagoD.ShowModal;
  frmCatalogoFormaPagoD.Free;
end;

procedure TfrmCatalogoFormaPago.btnEliminaClick(Sender: TObject);
begin
  btn_opcion := 2;
  qryFormaPago.Edit;
  frmCatalogoFormaPagoD := TfrmCatalogoFormaPagoD.Create(Nil);
  frmCatalogoFormaPagoD.ShowModal;
  frmCatalogoFormaPagoD.Free;
end;

procedure TfrmCatalogoFormaPago.btnModificaClick(Sender: TObject);
begin
  btn_opcion := 1;
  qryFormaPago.Edit;
  frmCatalogoFormaPagoD := TfrmCatalogoFormaPagoD.Create(Nil);
  frmCatalogoFormaPagoD.ShowModal;
  frmCatalogoFormaPagoD.Free;
End;

procedure TfrmCatalogoFormaPago.dbgFormaPagoDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if gdSelected in State then
     dbgFormaPago.Canvas.Font.Color := clBlue;
  dbgFormaPago.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

procedure TfrmCatalogoFormaPago.dbgFormaPagoKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  Case Key Of
    45 : btnAgrega.Click;
    46 : btnElimina.Click;
    67 : if Shift = [ssCtrl] then CapturaRegistro;
    27 : close;
    13 : begin
           if (ActiveControl is TDBGrid) then
           begin
             if t_para then
             Begin
               dmGlobal.vResultVar := qryFormaPagoKOD.AsString;
               dmGlobal.vResultTexto := qryFormaPagodescripcion.AsString;
               qryFormaPago.Close;
               Close;
             End
             Else
             btnModifica.Click
           end
         end;
  end;

end;


procedure TfrmCatalogoFormaPago.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  qryFormaPago.Close;
  Action := caFree;
end;

procedure TfrmCatalogoFormaPago.FormCreate(Sender: TObject);
begin
  dmGlobal.vResultVar := '';
  dmGlobal.vResultTexto := '';
  qryFormaPago.Params.ParamByName('edtSearch').AsString := '%';
  qryFormaPago.Params.ParamByName('Empresa').AsString := dmGlobal.g_CodigoEmpresa;
  qryFormaPago.Open;
end;

procedure TfrmCatalogoFormaPago.FormDestroy(Sender: TObject);
begin
  frmCatalogoFormaPago := Nil;
end;

end.


es una ventana donde puedo escoger el dato solicitado de una grilla y también podría crear nuevos registros, osea.. voy a formas de pago, y quiero crear una nueva y esta ventana sirve para esas 2 cosas, escoger y crear y escoger

funciona perfecto

el tema es que cuando sale del edit, el "foco" se pierde

esta es la rutina donde llamo al "validador"

en el EditExit

Código Delphi [-]
procedure TfrmEmisionFacturaD.edtFormaPagoExit(Sender: TObject);
begin
      if not VerificarFormaPago (edtFormaPago.Text) then
      begin
        frmCatalogoFormaPago := TfrmCatalogoFormaPago.Create(nil);
        frmCatalogoFormaPago.FormStyle := fsNormal;
        frmCatalogoFormaPago.Visible := False;
        frmCatalogoFormaPago.t_para := True;
        frmCatalogoFormaPago.ShowModal;
        frmCatalogoFormaPago.Free;
      end;

    lblFormaPago.Caption := dmGlobal.vResultTexto;

    If edtFormaPago.Text = '' then
      edtFormaPago.SetFocus
  End;
end;


la parte "if not VerificarFormaPago (edtFormaPago.Text) then "

es un funcion donde consulto si la forma de pago escrita en el edit existe y de ser asi ya no entra al "validador"

Código Delphi [-]
Function VerificarFormaPago (_FormaPago :String) :Boolean;
Var StrSql : String;
begin

  if _FormaPago <> '' then
    Begin
      dmGlobal.qryBuscarFormaPago.SQL.Clear;
      StrSql := 'Select * From TblFormaPago where Empresa = ' + QuotedStr(dmGlobal.g_CodigoEmpresa);
      StrSql := StrSql + ' and KOD Like ''' + Trim(_FormaPago) + '%'' Order By KOD';
      dmGlobal.qryBuscarFormaPago.SQL.Add(StrSql);
      dmGlobal.qryBuscarFormaPago.Open;
      result := dmGlobal.qryBuscarFormaPago.RecordCount >= 1;
      dmGlobal.qryBuscarFormaPago.First;
      dmGlobal.vResultVar := dmGlobal.qryBuscarFormaPagoKOD.AsString;
      dmGlobal.vResultTexto := Trim (dmGlobal.qryBuscarFormaPagoDescripcion.AsString);
      dmGlobal.qryBuscarFormaPago.Close;
    End
  else
    Result := False;
end;


cuando coloco un dato correcto en el EDIT, el foco pasa el siguiente control sin ningun problema, pero cuando "invoco" al "validador" y escojo el dato requerido, el foco se pierde, como lo se? porque cada campo Edit se cambia de color a azul cuando recibe el foco, pero el siguiente foco de forma de pago no, pero si escribo algo, aparece en el edit que corresponde osea el siguiente, pero no recibe el color azul

he hecho seguimiento, keypress, KeyDown, pero no logro entender donde esta el problema.
__________________
Dulce Regalo que Satanas manda para mi.....

Última edición por oscarac fecha: 26-04-2019 a las 19:44:38.
Responder Con Cita
  #2  
Antiguo 26-04-2019
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.876
Poder: 14
oscarac Va por buen camino
informacion complementaria

le he colocado un "mensaje" cuando executa el TipoPagoExit y si lo muestra
y en el onenter del siguiente campo tambien coloque un mensaje para confirmar que el foco lo reciba el edit que sigue, pero que creen, no muestra el mensaje de bienvenida, pero si digito cualquier cosa, lo que digito aparece en el edit que sigue

editFormaPago (aqui invoco al formulario "validador"), deberia saltar al campo editmotivoVenta

EditMotivoVenta (puedo digitar algo, pero no se ejecuta el evento onEnter)

ahora cuando coloco una forma de pago que existe y la rutina de verificacion no pasa por el formulario "validador", todo funciona correctamente.

que puede ser?
que puede estar pasando?

definitivamente hay un problema al invocar al "validador"
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #3  
Antiguo 27-04-2019
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.876
Poder: 14
oscarac Va por buen camino
que cosa mas curiosa

en el diseño del formulario puse fsNormal y Visible = False;

si elimino las lineas donde cambio el Style y el Visible y queda asi :

Código Delphi [-]
if not VerificarFormaPago (edtFormaPago.Text) then
      begin
        frmCatalogoFormaPago := TfrmCatalogoFormaPago.Create(nil);
        frmCatalogoFormaPago.t_para := True;
        frmCatalogoFormaPago.ShowModal;
        frmCatalogoFormaPago.Free;
      end;

funciona bien...

quiere decir que si coloco cambio alguna propiedad en tiempo de ejecucion, puede producir que el programa no siga una secuencia ?
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #4  
Antiguo 27-04-2019
WHILENOTEOF WHILENOTEOF is offline
Miembro
 
Registrado: mar 2008
Posts: 202
Poder: 12
WHILENOTEOF Va camino a la fama
Hola, por lo visto ya lo tienes solucionado. No acabo de entender porque ponías Visible:= false, y otra línea que sobra es frmCatalogoFormaPago.Free; , ya que en el OnClose del formulario le has puesto Action:= caFree.
Responder Con Cita
  #5  
Antiguo 28-04-2019
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.876
Poder: 14
oscarac Va por buen camino
es que lo creo con create(nil)


visible := false porque le cambiaba la propiedad formStyle a fsNormal

para poder colocar el formulario "validador" como modal
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #6  
Antiguo 28-04-2019
hal1967 hal1967 is offline
Miembro
 
Registrado: feb 2012
Posts: 23
Poder: 0
hal1967 Va por buen camino
Application.CreateForm

En lugar de crear directamente los formularios, creo que podrías considerar hacer la llamada a TApplication. No se si ese sea el problema, pero para mi es una forma extraña de crear formularios.



Código Delphi [-]
frmCatalogoFormaPago := TfrmCatalogoFormaPago.Create(nil);

Esta seria usando TApplication

Código Delphi [-]
Application.CreateForm(TfrmCatalogoFormaPago, frmCatalogoFormaPago);


Claro estoy asumiendo que trabajas con una aplicación VCL, para algo como consola no aplica.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Acceso a coordenadas en segundo formulario. Karlo Magno OOP 13 13-09-2017 20:16:55
Acceder a un segundo formulario desde una Unit JuanOrtega Varios 2 08-01-2016 22:39:41
Mejor evento para mostrar un segundo formulario franfl C++ Builder 5 16-04-2008 20:33:44
Formulario que pierde el foco en tranparente Cabanyaler Gráficos 3 23-11-2004 17:17:48
Cambiar foco de formulario jollodel API de Windows 6 02-08-2004 18:59:33


La franja horaria es GMT +2. Ahora son las 01:35:11.


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