[Lazarus-es] keypreview true y enter en dbmemo

José Mejuto joshyfun en gmail.com
Mie Feb 20 18:02:45 CET 2013


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".

-- 





More information about the Lazarus-es mailing list