Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2013-02

keypreview true y enter en dbmemo

7 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Paola Bruccoleri

Hola todos..

en un form tengo la propiedad keypreview=true y adem�s hereda de otro llamado frmEnterESC que tiene definidos los eventos para que el usuario se pueda mover a trav�s de los controles con enter.. (el usuario viene de un sistema dos y debo proveerlo de esa funcionalidad que tanto extra�ar� :) )

procedure TfrmEnterESC.FormKeyPress(Sender: TObject; var Key: char);
begin
   if (key =  #13) and not(ActiveControl is TCustomButton) then
     begin
       SelectNext(ActiveControl, True, True);
       Key := #0;
     end
end;

Ahora.. en ese form adem�s muestro un campo memo donde est�n unas observaciones que el usuario podr� cambiar (usando los botones corresp de un dbnavigator)

�C�mo puedo hacer para que al presionar enter en ese control efectivamente haga un enter y NO me pase al siguiente control? Es para permitirle al usuario que pueda escribir las observaciones en varios renglones..

muchas gracias!

Reply by email

José Mejuto
to Paola Bruccoleri

El 20/02/2013 17:09, Paola Bruccoleri escribi�:

Show quoted text 24 lines
en un form tengo la propiedad keypreview=true y adem�s hereda de otro llamado frmEnterESC que tiene definidos los eventos para que el usuario se pueda mover a trav�s de los controles con enter.. (el usuario viene de un sistema dos y debo proveerlo de esa funcionalidad que tanto extra�ar� :) ) procedure TfrmEnterESC.FormKeyPress(Sender: TObject; var Key: char); begin if (key = #13) and not(ActiveControl is TCustomButton) then begin SelectNext(ActiveControl, True, True); Key := #0; end end; Ahora.. en ese form adem�s muestro un campo memo donde est�n unas observaciones que el usuario podr� cambiar (usando los botones corresp de un dbnavigator) �C�mo puedo hacer para que al presionar enter en ese control efectivamente haga un enter y NO me pase al siguiente control? Es para permitirle al usuario que pueda escribir las observaciones en varios renglones..

Hola,

Yo tengo hecho eso mismo, pero en vez de seleccionar la clase del control lo que hago es definir el funcionamiento de ENTER en funci�n del valor TAG de cada componente (y su readonly) de modo que si un componente tiene:

TAG=0 Al presionar enter busca el siguiente control activo que no sea ReadOnly y cuyo TAG no sea "1".

TAG=1 El enter nunca se para en estos controles, se los salta, de modo que la navegaci�n por el form con enter se puede saltar algunos componentes que por ejemplo no se usan normalmente.

TAG=2 El comportamiento de ENTER es normal, o sea, el KeyPress no hace nada.

Mi KeyPress es este:

procedure TFormSpecial.KeyPress(var Key: char);
begin
   if Key=#13 then begin
     //if Self.ActiveControl is TMemo then Key:=#0;
     if not JumpToNextControl(Self,false) then begin
       inherited KeyPress(Key);
     end else begin
       //Key:=#0; //Causes problems in Grid editors ?
     end;
   end;
end;

Unido a estas dos cosas m�s:

{ HackForm }

   THackForm=class(TForm)
   public
     function FindNextControl(CurrentControl: TWinControl; GoForward,
CheckTabStop, CheckParent: Boolean): TWinControl;
   end;

{ HackForm }

function THackForm.FindNextControl(CurrentControl: TWinControl; GoForward,
   CheckTabStop, CheckParent: Boolean): TWinControl;
begin
   Result:=inherited FindNextControl(CurrentControl, GoForward,
CheckTabStop, CheckParent);
end;
//Funcion del TFormSpecial que usa los enter de modo "especial".
function TFormSpecial.JumpToNextControl(const aForm: TForm; const
aForced: Boolean): Boolean;
var
   NC: TWinControl;
   OC: TWinControl;
   IsReadOnly: Boolean;
   HF: THackForm;
begin
   Result:=false;
   OC:=aForm.ActiveControl;
   if ((OC.Tag and $0002)0) and (not aForced) then exit;
   // I know that every aForm is a Form derived class, and as it is a
hack no
   // problem should be present.
   {$PUSH}
   {$OBJECTCHECKS OFF}
   HF:=THackForm(aForm);
   {$POP}
   NC:=HF.FindNextControl(OC,true,true,false);
   if Assigned(NC) then begin
     if (NC.Tag and $0001)0 then begin
       Repeat
         NC:=HF.FindNextControl(NC,true,true,false);
         IsReadOnly:=false;
         if NC is TEdit then begin
           if TEdit(NC).ReadOnly then IsReadOnly:=true;
         end;
       Until ((NC.Tag and $0001)=0) and (not IsReadOnly);
     end;
     NC.SetFocus;
     Result:=true;
   end;
end;

Si te convence la idea �sala sin problemas :) Tu problema se solventar�a simplemente poniendo el TAG del Memo a "2".

Reply by email

Paola Bruccoleri
to José Mejuto

El 20/02/2013 03:02 p.m., Jos� Mejuto escribi�:

Show quoted text 121 lines
El 20/02/2013 17:09, Paola Bruccoleri escribi�: > en un form tengo la propiedad keypreview=true y adem�s hereda de otro > llamado frmEnterESC que tiene definidos los eventos para que el usuario > se pueda mover a trav�s de los controles con enter.. (el usuario viene > de un sistema dos y debo proveerlo de esa funcionalidad que tanto > extra�ar� :) ) > > procedure TfrmEnterESC.FormKeyPress(Sender: TObject; var Key: char); > begin > if (key = #13) and not(ActiveControl is TCustomButton) then > begin > SelectNext(ActiveControl, True, True); > Key := #0; > end > end; > > Ahora.. en ese form adem�s muestro un campo memo donde est�n unas > observaciones que el usuario podr� cambiar (usando los botones corresp > de un dbnavigator) > > �C�mo puedo hacer para que al presionar enter en ese control > efectivamente haga un enter y NO me pase al siguiente control? > Es para permitirle al usuario que pueda escribir las observaciones en > varios renglones.. > Hola, Yo tengo hecho eso mismo, pero en vez de seleccionar la clase del control lo que hago es definir el funcionamiento de ENTER en funci�n del valor TAG de cada componente (y su readonly) de modo que si un componente tiene: TAG=0 Al presionar enter busca el siguiente control activo que no sea ReadOnly y cuyo TAG no sea "1". TAG=1 El enter nunca se para en estos controles, se los salta, de modo que la navegaci�n por el form con enter se puede saltar algunos componentes que por ejemplo no se usan normalmente. TAG=2 El comportamiento de ENTER es normal, o sea, el KeyPress no hace nada. Mi KeyPress es este: procedure TFormSpecial.KeyPress(var Key: char); begin if Key=#13 then begin //if Self.ActiveControl is TMemo then Key:=#0; if not JumpToNextControl(Self,false) then begin inherited KeyPress(Key); end else begin //Key:=#0; //Causes problems in Grid editors ? end; end; end; Unido a estas dos cosas m�s: { HackForm } THackForm=class(TForm) public function FindNextControl(CurrentControl: TWinControl; GoForward, CheckTabStop, CheckParent: Boolean): TWinControl; end; { HackForm } function THackForm.FindNextControl(CurrentControl: TWinControl; GoForward, CheckTabStop, CheckParent: Boolean): TWinControl; begin Result:=inherited FindNextControl(CurrentControl, GoForward, CheckTabStop, CheckParent); end; //Funcion del TFormSpecial que usa los enter de modo "especial". function TFormSpecial.JumpToNextControl(const aForm: TForm; const aForced: Boolean): Boolean; var NC: TWinControl; OC: TWinControl; IsReadOnly: Boolean; HF: THackForm; begin Result:=false; OC:=aForm.ActiveControl; if ((OC.Tag and $0002)0) and (not aForced) then exit; // I know that every aForm is a Form derived class, and as it is a hack no // problem should be present. {$PUSH} {$OBJECTCHECKS OFF} HF:=THackForm(aForm); {$POP} NC:=HF.FindNextControl(OC,true,true,false); if Assigned(NC) then begin if (NC.Tag and $0001)0 then begin Repeat NC:=HF.FindNextControl(NC,true,true,false); IsReadOnly:=false; if NC is TEdit then begin if TEdit(NC).ReadOnly then IsReadOnly:=true; end; Until ((NC.Tag and $0001)=0) and (not IsReadOnly); end; NC.SetFocus; Result:=true; end; end; Si te convence la idea �sala sin problemas :) Tu problema se solventar�a simplemente poniendo el TAG del Memo a "2".
Hola Jos�..
est� buena la idea..ver� de implementarla..
por curiosidad...
para qu� es esto?
   {$PUSH}
   {$OBJECTCHECKS OFF}
   HF:=THackForm(aForm);
   {$POP}

byeeee

Reply by email

José Mejuto
to Paola Bruccoleri

El 21/02/2013 14:29, Paola Bruccoleri escribi�:

Show quoted text 9 lines
Hola Jos�.. est� buena la idea..ver� de implementarla.. por curiosidad... para qu� es esto? {$PUSH} {$OBJECTCHECKS OFF} HF:=THackForm(aForm); {$POP}

THackForm y aForm no comparten la misma linea de herencia as� que el compilador nos dar� un warning (o error si tenemos activado la verificaci�n de call) del tipo "aForm and THackForm are not related objects". Desconectando la comprobaci�n de ese error nos evita el warning.

No estoy seguro 100% pero no deber�a ser un problema en este caso.

Reply by email

Paola Bruccoleri
to José Mejuto

El 21/02/2013 12:44 p.m., Jos� Mejuto escribi�:

Show quoted text 20 lines
El 21/02/2013 14:29, Paola Bruccoleri escribi�: > Hola Jos�.. > est� buena la idea..ver� de implementarla.. > por curiosidad... > para qu� es esto? > {$PUSH} > {$OBJECTCHECKS OFF} > HF:=THackForm(aForm); > {$POP} > THackForm y aForm no comparten la misma linea de herencia as� que el compilador nos dar� un warning (o error si tenemos activado la verificaci�n de call) del tipo "aForm and THackForm are not related objects". Desconectando la comprobaci�n de ese error nos evita el warning. No estoy seguro 100% pero no deber�a ser un problema en este caso.

Hola Jos�..
entonces no capt� algo. Tu me pones esto, de lo que deduzco que es un form nuevo que le llamo HackForm... y veo que es una clase q desciende de TForm.
No me queda claro qu� significa en el .pas lo que te marqu� en rojo, ya que en la def. de la unidad, no veo q esa directiva se haya creado por defecto..
Bueno, muchas gracias!

{ HackForm }

   THackForm=class(TForm)
   public
     function FindNextControl(CurrentControl: TWinControl; GoForward,
CheckTabStop, CheckParent: Boolean): TWinControl;
   end;

{ HackForm }

function THackForm.FindNextControl(CurrentControl: TWinControl; GoForward,
   CheckTabStop, CheckParent: Boolean): TWinControl;
begin
   Result:=inherited FindNextControl(CurrentControl, GoForward,
CheckTabStop, CheckParent);
end;

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130221/24c9aeba/attachment.html>

Reply by email

José Mejuto
to Paola Bruccoleri

El 21/02/2013 16:16, Paola Bruccoleri escribi�:

Show quoted text 41 lines
El 21/02/2013 12:44 p.m., Jos� Mejuto escribi�: > El 21/02/2013 14:29, Paola Bruccoleri escribi�: > >> Hola Jos�.. >> est� buena la idea..ver� de implementarla.. >> por curiosidad... >> para qu� es esto? >> {$PUSH} >> {$OBJECTCHECKS OFF} >> HF:=THackForm(aForm); >> {$POP} >> > > THackForm y aForm no comparten la misma linea de herencia as� que el > compilador nos dar� un warning (o error si tenemos activado la > verificaci�n de call) del tipo "aForm and THackForm are not related > objects". Desconectando la comprobaci�n de ese error nos evita el > warning. > > No estoy seguro 100% pero no deber�a ser un problema en este caso. > Hola Jos�.. entonces no capt� algo. Tu me pones esto, de lo que deduzco que es un form nuevo que le llamo HackForm... y veo que es una clase q desciende de TForm. No me queda claro qu� significa en el .pas lo que te marqu� en rojo, ya que en la def. de la unidad, no veo q esa directiva se haya creado por defecto.. Bueno, muchas gracias! { HackForm } THackForm=class(TForm) public function FindNextControl(CurrentControl: TWinControl; GoForward, CheckTabStop, CheckParent: Boolean): TWinControl; end; { HackForm }

Hola,

Eso no son directivas, son comentarios. Las directivas son {$xxx} los comentarios {xxx}

Reply by email