[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