Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   preguntas sobre DBEDITS (https://www.clubdelphi.com/foros/showthread.php?t=73582)

oscarac 03-05-2011 05:28:17

preguntas sobre DBEDITS
 
Buenas noches..
tengo una consulta

tengo varios dbedits, los cuales se activan o desactivan de acuerdo a algunas condiciones que se originan al salir del primer dbedit

Código Delphi [-]
  edtMaterial.Enabled := qryUbicarCuentainv.AsString = 'S';
  edtActivo.Enabled := qryUbicarCuentaACT.AsString = 'S';
  edtArea.Enabled := qryUbicarCuentaArea.AsString = 'S';
  edtCantidad.Enabled := qryUbicarCuentainv.AsString = 'S';
  edtCCosto.Enabled := qryUbicarCuentaCCosto.AsString = 'S';
  edtAnexo.Enabled := qryUbicarCuentaAnexo.AsString = 'S';
  edtRuc.Enabled := qryUbicarCuentainv.AsString = 'S';

pero al salir del primer dbedit.. el foco como que... se pierde el cursor desaparece y no se en que campo estoy hasta que escribo algo

no se si me deje entender

urixiv 03-05-2011 09:12:16

No sé si con esto te ayudo o no, pero por lo que entiendo, habilitas /deshabilitas unos edits en función de unas condiciones, y luego no sabes donde esta el foco, pero tú sí que sabes donde lo quieres tener verdad?

En tal caso fuerza tu el foco, porque el al cambiar el enabled supongo que pierde el taborder.

para forzar el foco es
Código Delphi [-]
miEdit.setFocus;

Bueno, si no es esto a lo que te referías perdona!!!:D

oscarac 03-05-2011 15:48:10

Gracias por la respuesta...
si se que puedo activar el foco con setfocus

hago la instruccion pero al parecer delphi no le esta haciendo caso
voy a seguir investigando

Casimiro Notevi 03-05-2011 16:25:35

En algunos hilos se ha hablado de un tema similar, por lo visto hay ocasiones que no se sabe el motivo, pero que ocurre eso, que no se ve el cursor, aunque tenga el foco, si escribes entonces aparece.
Los comentarios de distintos compañeros fueron similares y no hubo forma de encontrar un patrón que diera alguna pista, ocurría con distintas configuraciones, versiones varias de delphi, etc.
A mí mismo me ocurre con una ventana (un form) del programa que estoy haciendo ahora, sin embargo no me ocurre con ninguna de las otras ventanas, siendo todas heredadas de una misma 'form plantilla'. La he dejado por imposible y he pensado tan sólo en cambiarle de color al entrar para que el usuario sepa que está ahí el foco, aunque eso implicaría cambiarlo en todo el programa, y no es algo que me apetezca hacer.

oscarac 03-05-2011 17:01:23

mmm mis conocimientos no estan tan avanzados
pero si alguien se animara a hacer un componente Edit o TDBedit

en el cual cuando se entre se coloque de un color y cuando se salga se coloque del color original... seria estupendo

mmmm creo que mirare temas sobre creacion de componentes :eek::eek:

Casimiro Notevi 03-05-2011 17:08:14

Bueno, en principio es sólo poner en el 'onEnter' algo así como 'Color:=clBlue' y en el 'onExit' volver a poner el color que tenía al entrar.

oscarac 03-05-2011 17:30:20

en Visual Fox uno podia crear una Clase que se derivaba de un componente se le agregaban propiedades y se podia usar dentro de los formularios

con esto conseguia hacer por ejemplo edits con mascaras

en delphi hay algo parecido?

gluglu 03-05-2011 18:01:57

Realiza una búsqueda al respecto ..... seguro que encuentras miles de mensajes al respecto en los foros ;)

ecfisa 03-05-2011 18:22:13

Hola oscarac.

Cuando la propiedad Enabled de un control esta en False el control ignora el mouse y el teclado. Al salir del DBEdit, se envía el Foco al próximo control determinado por TabOrder, sin importar que el estado de este sea Disabled. Si el próximo control a la salida del DBEdit tiene su propiedad Enabled a
True no se produce ese efecto.

Una solución que se me ocurre, es utilizar este código para deshabilitar los DBEdits:
Código Delphi [-]
function TForm1.ControlesOff: Boolean;
begin
  edtMaterial.Enabled := qryUbicarCuentainv.AsString = 'S';
  edtActivo.Enabled := qryUbicarCuentaACT.AsString = 'S';
  edtArea.Enabled := qryUbicarCuentaArea.AsString = 'S';
  edtCantidad.Enabled := qryUbicarCuentainv.AsString = 'S';
  edtCCosto.Enabled := qryUbicarCuentaCCosto.AsString = 'S';
  edtAnexo.Enabled := qryUbicarCuentaAnexo.AsString = 'S';
  edtRuc.Enabled := qryUbicarCuentainv.AsString = 'S';
  Result:= edtMaterial.Enabled;
end;

Ignoro cuando realizas las consultas y activas/desactivas los DBEdits, pero supongamos que lo haces en el evento OnExit del primer DBEdit
que adjuntaste:
Código Delphi [-]
procedure TForm1.edtMaterialExit(Sender: TObject);
begin
  // Ejecutar las consultas
  if ControlesOff then 
  begin
    edtMaterial.Enabled:= True; // habilitar
    edtMaterial.SetFocus;       // darle el foco nuevamente (o a otro control.)
  end;
end;
Espero que te sirva o al menos te aporte alguna una idea.


Un saludo.

José Luis Garcí 03-05-2011 18:35:39

Oscara en el Ftp del club puedes encontrar un componente que cree hace meses, se llama ScreenColorcenter, eliges el color para cuando tenga el foco, lo sueltas en el form principal, en muy importante que lo actives al crearse el form y lo desactives al cerrar el form, ya que lo que hace es actuar sobre todos lo programas activos, cambiando el color al recibir el foco de varios componentes, sin tener que poner código, alguno.

oscarac 03-05-2011 18:44:24

explico un poco mas lo que hago...

efectivamente tengo un primer dbedit en el cual solicito una cuenta contable, que de acuerdo a las caracteristicas de la cuenta, se activaran / desactivaran otros dbedits
ya tengo un procedimiento que me ubica la cuenta y es algo como esto..

Código Delphi [-]
procedure TfrmingresoComprobantesVariosd.edtCuentaExit(Sender: TObject);
Var _Cuenta : String;
begin
_Cuenta := edtCuenta.Text;
    if not VerificarCuenta (_Cuenta, Derecha(dmGlobal.g_nivelCuenta,1)) then
      begin
        frmCatalogoPlanContable := TfrmCatalogoPlanContable.Create(Self);
        frmCatalogoPlanContable.FormStyle := fsNormal;
        frmCatalogoPlanContable.Visible := False;
        frmCatalogoPlanContable.t_para := True;
        frmCatalogoPlanContable.ShowModal;
      end;
    edtCuenta.Text := dmGlobal.vResultCuenta;
    frmIngresoComprobantesVarios.tVoucherCuenta.Value := dmGlobal.vResultCuenta;
    lblCuenta.Caption := dmGlobal.vResultCuentaDescripcion;
    HabilitarEdits;

    If edtCuenta.Text = '' then
        edtCuenta.SetFocus;

lo curioso es que he puesto que cuando entre al dbedit.. me cambie de color pasar saber que es lo que hace... y al salir del primer edit el flujo desaparece presiono ENTER de nuevo y nuevamente aparece en el primer dbedit despues de eso el flujo sigue normal

si yo supiera que control se debe activar seria mas facil, pero eso depende de lo que mande la cuenta contable, ejemplo :

Campos existente
Centro de costos
Area
Presupuestos
Obras
Recursos
Codigo de Anexo
Flujo de Gasto

si selecciono la cuenta 63 se activara
centro de costos
area
presupuestos

si selecciono la cuenta 42 se activara
codigo de proveedor
area

si selecciono la cuenta 10 se activara
Flujo de gastos


espero que ahora se me entienda mejor
gracias

oscarac 03-05-2011 21:14:49

cosa curiosa
 
siguiendo con este tema
modifique el programa de tal manera que solo pase de un campo a otro y cuando pasa del primer edit al segundo el cursor desaparece (ya me esta volviendo loco)

oscarac 03-05-2011 21:42:20

cosa rarisima
 
Utilice el componente que muy amablemente me menciono José Luis Garcí para tener una idea de donde es que va el foco, el asunto es que cuando activo/ desactivo los edits, luego de solicitar la cuenta contable, el foco "desaparece", es decir el edit no se pinta(lo que me indica donde esta actualmente el foco)

entonces al presionar enter... el foco regresa al primer edit y de ahi ya todo funciona bien... cosa rara no?
a alguien le sucede o sucedio algo parecido?

José Luis Garcí 04-05-2011 10:28:15

Hola oscara, acabo de probar el componente con un par de edit y grid y no me hace lo que me comentabas en el mensaje privado, no veo que afecte al grid, de todas maneras puedes cambiar el código de:

Código Delphi [-]
procedure TCenterScreenColor.AdmitComponent(Component:TWinControl);
begin
     if (Component is TCustomForm) then
     if Component.ClassType=Tform then
     begin
         if FForm=true then VarPrivPassComponent:=True
                       else VarPrivPassComponent:=False;
     end else
     begin
        if ((Component is TCustomEdit) or (Component is TDateTimePicker))then
        begin
           if FEdit_DBEdit=true then VarPrivPassComponent:=True
           else VarPrivPassComponent:=False;
        end else
        begin
           if (Component is TCustomMemo) then
           begin
              if FMEmo_DbMEmo=true then VarPrivPassComponent:=True
                                   else VarPrivPassComponent:=False;
           end else
           begin
              if (Component is TCustomComboBox) then
              begin
                  if FComboBox_DBCombobox=true then VarPrivPassComponent:=True
                                               else VarPrivPassComponent:=False;
              end else
              begin
                 if FOther=true then VarPrivPassComponent:=True
                                else VarPrivPassComponent:=False;
              end;
           end;
        end;
     end;
end;

por

Código Delphi [-]
procedure TCenterScreenColor.AdmitComponent(Component:TWinControl);
begin
   if not (Component is TCustomDBGrid) then
   begin
     if (Component is TCustomForm) then
     if Component.ClassType=Tform then
     begin
         if FForm=true then VarPrivPassComponent:=True
                       else VarPrivPassComponent:=False;
     end else
     begin
        if ((Component is TCustomEdit) or (Component is TDateTimePicker))then
        begin
           if FEdit_DBEdit=true then VarPrivPassComponent:=True
           else VarPrivPassComponent:=False;
        end else
        begin
           if (Component is TCustomMemo) then
           begin
              if FMEmo_DbMEmo=true then VarPrivPassComponent:=True
                                   else VarPrivPassComponent:=False;
           end else
           begin
              if (Component is TCustomComboBox) then
              begin
                  if FComboBox_DBCombobox=true then VarPrivPassComponent:=True
                                               else VarPrivPassComponent:=False;
              end else
              begin
                 if FOther=true then VarPrivPassComponent:=True
                                else VarPrivPassComponent:=False;
              end;
           end;
        end;
     end;
  end;
end;

Lo que haría es si el componente es un Dbgrid (LLamo al ancestro de los Dbgrid, para que admita la mayor parte de ellos), no sigue y si es otro componente si.

Me imagino ya que no lo he probado que deberas incluir la unidad Dbgrids.

José Luis Garcí 04-05-2011 10:38:59

Por cierto Oscara, ten en cuenta que el componente va afectar a toda la aplicación y otras que estén activas en Windows, mientras este activo el componente, por eso es fundamental, activarlo al iniciarse la aplicación y desactivarlo una vez termines, ya que si no lo haces quedara activo en otras aplicaciones de Windows.

Casimiro Notevi 04-05-2011 10:52:22

Mientras intentaba resolver este problema y para saber qué control tiene el componente, lo que hice fue poner un ttimer y un tlabel, cada segundo escribía en el caption del tblabel el nombre del control con el foco, no recuerdo de memoria, pero creo que era algo así como:
Código Delphi [-]
label1.caption := application.activecontrol.name
De esa forma podía saber que aunque no se viera el cursor, el foco realmente estaba allí... y así maldecir con seguridad a delphi/¿windows? por no mostrar el cursor... hasta que pulsara alguna tecla.

Espartaco 29-10-2015 13:35:53

Hola ya se que hace muchos años de este hilo pero buscando solucion a un problema me lo he encontrado, no se si es demasiado tarde.
He descubierto que si muestro un application.messagebox, al salir del mensaje me hace lo que decis, en cambio si lo hago con un showmessage no lo hace.
No se donde esta el problema pero he descubierto esto.


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

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