Ver Mensaje Individual
  #9  
Antiguo 17-04-2012
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 547
Reputación: 17
jhonalone Va por buen camino
Gracias de nuevo Ecfisa.

Te cuento en la situación que estoy:

El combo se rellena y se hace visible y desplegado con:
Código Delphi [-]
procedure TFClien.SpeedButton3Click(Sender: TObject);
var
   NoHayMas: Boolean;
begin
ClienDB.Filtered := False;
ClienDB.Filter := 'Nom= '+QuotedStr(LMDEdit6.Text+'*');
ClienDB.Filtered := True;
Combobox1.Clear;
NoHayMas := False;
if ClienDB.FindFirst
then Combobox1.Items.Add(ClienDBNom.AsString);
while NoHayMas=False
do begin
   if ClienDB.FindNext
   then Combobox1.Items.Add(ClienDBNom.AsString)
   else NoHayMas := True;
   end;
Combobox1.ItemIndex := -1;
ClienDB.Filtered := False;
if Combobox1.Items.Count > 0
then begin
      if (Combobox1.Items.Count = 1) and  // Es el mismo
         (Combobox1.Items.Strings[0] = LMDEdit6.Text)
      then begin
           Combobox1.Visible:=False;
           Beep;
           Exit;
           end;
     Combobox1.Visible:=True;
     Combobox1.ItemIndex := 0;
     ComboBox1.SetFocus;
     ComboBox1.Perform(CB_SHOWDROPDOWN, 1,0);// Despliega el Combo
     ComboBox1.SetFocus;
     end
else PonDatosCli;
end;

A este procedimiento lo llamo desde aquí:
Código Delphi [-]
procedure TFClien.LMDEdit6KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Button6.Enabled // Si no está en Altas
then begin
     if Key=vk_RETURN
     then begin
          if ValorOriginal<>LMDEdit6.Text
          then SpeedButton3.Click;
          end;
     end;
end;

Utilizo el procedimiento siquiente para bloquear OnClick al mover las flechas y utilizarlo cuando se pulse Click sobre un Item:
Código Delphi [-]
procedure TFClien.ComboBox1Click(Sender: TObject);
begin
if (GetKeyState(VK_DOWN)<0)or(GetKeyState(VK_UP)<0) then Exit;
ClienDB.SetKey;
ClienDB['Nom'] := Combobox1.Items.Strings[Combobox1.ItemIndex];
ClienDB.GotoNearest;
// Segunda Base Clien2DB
FClien.Clien2DB.SetKey;
FClien.Clien2DB['Nom'] := Combobox1.Items.Strings[Combobox1.ItemIndex];
FClien.Clien2DB.GotoNearest;
//Comprobamos que hemos leido el mismo cliente en las dos bases
if FClien.ClienDBNom.AsString <> FClien.Clien2DBNom.AsString
then begin
     ShowMessage('La Base de Clientes de reserva, puede no estar actualizada.'+#13+
                 'Conviene que salga del programa y entre de nuevo para corregir este error.');
     end;
PonDatosCli;
Combobox1.Visible:=False;
end;

En los eventos OnKeyDown y OnKeyPress del combo, no me reconece la tecla Enter:
Código Delphi [-]
procedure TFClien.ComboBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=vk_RETURN
     then beep;
end;
No se oye el BEEP al pulsar Enter.

Tampoco se oye al pulsar enter en OnKeyPress:
Código Delphi [-]
procedure TFClien.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then Beep;
if key = #27 then Combobox1.Visible:=False;
end;
Sin embargo, si pulso ESCAPE se cierra el combo.

He recurrido al evento ONKeyUp:
Código Delphi [-]
procedure TFClien.ComboBox1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=vk_RETURN
     then begin
          ClienDB.SetKey;
          ClienDB['Nom'] := Combobox1.Items.Strings[Combobox1.ItemIndex];
          ClienDB.GotoNearest;
          // Segunda Base Clien2DB
          FClien.Clien2DB.SetKey;
          FClien.Clien2DB['Nom'] := Combobox1.Items.Strings[Combobox1.ItemIndex];
          FClien.Clien2DB.GotoNearest;
          //Comprobamos que hemos leido el mismo cliente en las dos bases
          if FClien.ClienDBNom.AsString <> FClien.Clien2DBNom.AsString
          then begin
               ShowMessage('La Base de Clientes de reserva, puede no estar actualizada.'+#13+
                           'Conviene que salga del programa y entre de nuevo para corregir este error.');
               end;
          PonDatosCli;
          Combobox1.Visible:=False;
          end;
end;

El mismo Código que en OnClick.

Bueno pues esto funciona así:

Antes de asignar el procedimiento OnKey press.
El combo se queda desplegado.
Si hago click en un item con el ratón, presenta bien los datos.
Muevo las teclas arriba y abajo y selecciona el item y actualiza el texto del Combo.
Si pulso Enter no hace nada y no se oye el BEEP.

Después de asignar el procedimiento a OnKeyPress
Se despliega el Combo, selecciona el primer item de la lista, pone los datos correctos de este item y cierra el Combo. No espera deplegado a que pulse ninguna tecla, es como si siguiera vigente el Enter de TFCliien.LMDEditKeyDown() (El procedimiento que llama a TFClien.SpeedButton3(), que es el procedimiento que rellena y presenta el combo)

Quizá me he extendido demasiado, pero quería dejarte clara la situación.

Espero que me digas cómo evito que quede en memoria el primer ENTER que llama al procemiento que rellena y despliega el Combo.

Gracias de antemano.

Un Saludo.
Responder Con Cita