PDA

Ver la Versión Completa : evitar precionar dos veces F3 para cerrar una forma....


Arturo
27-08-2005, 20:55:23
Hola a todos. Disculpen de nuevo compañeros, pero estoy en un dilema. tengo una forma para ordenes de compras, tiene una tabla maestra y un detalle del cual al presionar F3 en una DBGrid me abre la ventana de Articulos para buscar el producto y volver a presionar F3 me cierre la ventana de Articulos y me devuelve la clave para pasarsela a mi detalle.

Use en el Dbgrid los dos eventos OnKeyDown y OnEditButton para mandar a llamar a la forma de articulos:

procedure TfrmOrdCompras.DBGrid1EditButtonClick(Sender: TObject);
begin
If DBGrid1.selectedfield = BD.IbOrdCompDetORD_DET_ARTICULO then
Begin
frmMaterial.CrearMostrar;
with frmMaterial do
begin
tag:=1;
if frmMaterial.ShowModal= mrOK then
BD.IbOrdCompDet.FieldByName('ORD_DET_ARTICULO').AsInteger:= frmMaterial.intAsignArticulo;
end;
end;
end;
procedure TfrmOrdCompras.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var i:integer;
begin
// Aqui va otro codigo para borrar una linea detalle antes de que se grabe
if Key = VK_DELETE then
.......

if key = VK_F3 then
begin
frmMaterial.ExecuteProveedor(BD.IbOrdComprasORDEN_PROV.AsString);
frmMaterial.CrearMostrar;
if frmMaterial.ShowModal= mrOk then
begin
BD.IbOrdCompDet.Edit;
BD.IbOrdCompDet.FieldByName('ORD_DET_ARTICULO').AsInteger:=frmMaterial.intAsignArticulo;
end;
end;

en la forma articulos: frmMaterial esta un procedimiento ( ExecuteProveedor )que me devuelve los productos filtrados en base al proveedor que yo eliga desde mi tabla maestra. y en el evento OnCloseQuery me guarda la clave del articulo para pasarlo a intAsignArticulo.

Todo va bien, la cuestion es que debo Presionar dos veces F3 para que me regrese a la Grilla.

Les agradeceria si me indicaran por que hace eso...o alguna otra forma de como elegir un articulo y pasarlo a la DBgrid.
gracias.

dec
28-08-2005, 04:39:14
Hola,

Personalmente usaría una tecla (o una combinación de ellas) para mostrar el formulario de búsqueda y otra distinta para cerrarlo. Como el formulario de búsqueda puede contar con un par de botones, a saber, "Buscar" y "Cancelar" y, como además parece que muestras dicho formulario "modalmente" tal vez puedas aprovechar las propiedades "Default" y/o "Cancel" de los botones mencionados para evitarte codificación y obtener también el correspondiente "ModalResult", que es lo que puede interesarte, entre otras cosas, del formulario de búsqueda.

Lepe
28-08-2005, 13:28:28
y en el evento OnCloseQuery me guarda la clave del articulo para pasarlo a intAsignArticulo.

Todo va bien, la cuestion es que debo Presionar dos veces F3 para que me regrese a la Grilla.


Quizás el OncloseQuery no sea el mejor evento. Ya que al mostrarla como modal, si el usuario da al boton aceptar, primero se vuelve al código que lo llamó y despues se destruye la ventana, por tanto, cuando se vuelve de la ventana, todavía no ha asignado la variable que quieres.

Supongo que en la ventana modal, tienes un bitbtn con su propiedad ModalResult := ok; en el onclick de ese boton es justo el sitio para asignar el articulo.

Me queda una duda, en la ventana de material, ¿tambien tienes controlada la tecla F3 para salir? ¿qué código controla eso?

Un saludo

Arturo
29-08-2005, 19:12:42
SALUDOS
cuando mando a llamar la forma de materiales es con un .showmodal, eligo el articulo desde la Dbgrid y en el evento OnKeyDown tengo esto:

if frmMaterial = nil then
frmMaterial := TfrmMaterial.Create(nil);
frmMaterial.ShowModal;

BdGridKeyDown.....
if key = vk_F3 then
ModalResult := mrOk;


Gracias