[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