[Lazarus-es] keypreview true y enter en dbmemo

Paola Bruccoleri pbruccoleri en adinet.com.uy
Jue Feb 21 14:29:02 CET 2013


El 20/02/2013 03:02 p.m., José Mejuto escribió:
> 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






More information about the Lazarus-es mailing list