Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Scroll en DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=78640)

tarco35 06-05-2012 17:16:02

Scroll en DBGrid
 
Saludos... les comento (en Delphi6)
Tengo un DBGrid que me muestra una tabla de paradox y tengo asignado un evento cuando el usuario realiza (OnCelClick) un click en alguna fila
El caso es que cuando desplazo con la barra de scroll el triangulito que indica el registro actual se desplaza, pero no me dispara ningun evento de cambio, ni en "OnColEnter", "OnColExit"
Como prodria hacerlo para que cuando desplace el scroll fuese como cuando hace click en una fila y poder asignarle el evento necesario???
Gracias.

ecfisa 06-05-2012 18:35:04

Hola tarco35.

¿ Probaste con el evento AfterScroll del TDataSet ?

Un ejemplo
Código Delphi [-]
procedure TForm1.DataSetAfterScroll(DataSet: TDataSet);
begin
  Caption:= DataSet.FieldByName('TU_CAMPO').AsString;
end;

Otro
Código Delphi [-]
procedure TForm1.DataSetAfterScroll(DataSet: TDataSet);
begin
  Caption:= DBGrid1.SelectedField.AsString;
end;

Saludos.

tarco35 06-05-2012 20:09:34

esta en otra unidad
 
no lo he probado... resulta que tengo la tabla en ModuloDatos y donde ocurre el evento es en otra unidad y no se como poner en el evento que mencionas la accion del form...

Por si no me he explicado bien:
ModuloDatos.TablaProductos -> aqui es donde tengo todas las tablas

FormPruebas: aqui es donde esta el DBGrid

ecfisa 06-05-2012 20:35:39

Hola.

Lo más simple es crear el evento en el mismo TDataModule: Click sobre el DataSet -> Click pestaña Events -> Doble click sobre AfterScroll.

Pero al estar el DataSet en un DataModule, te conviene asignarlo manualmente en donde lo utilices y liberarlo al finalizar su uso:
Código Delphi [-]
type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
    ...
    procedure FormDestroy(Sender: TObject);
  private
    procedure DataSetAfterScroll(DataSet: TDataSet);
  public

  end;

var
  Form1: TForm1;

implementation

uses Unit2; // DataModule

procedure TForm1.DataSetAfterScroll(DataSet: TDataSet);
begin
  Caption:= DBGrid1.SelectedField.AsString;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DataModule.DataSet.AfterScroll:= DataSetAfterScroll; // asignar procedimiento al evento
end;

...

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DataModule.DataSet.AfterScroll:= nil;  // liberar
end;
Deberás asegurarte que el DataModule esté creado con anterioridad a donde realices la asignación (Form1 en el ejemplo) ya que si no, estarías intentando asignar un evento a algo inexistente y lanzará una excepción.

Saludos.

tarco35 06-05-2012 21:26:20

resuelto
 
Muchas gracias.. funciona perfecto... y para que me funcione tambien con la ruedecita del raton???

ecfisa 06-05-2012 22:31:58

Hola tarco35.

Código Delphi [-]
...
 TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
    ...
    procedure FormDestroy(Sender: TObject);
  private
    procedure MouseWheel(var Msg: tagMSG; var Handled: Boolean);
    procedure DataSetAfterScroll(DataSet: TDataSet);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2; // DataModule

procedure TForm1.MouseWheel(var Msg: tagMSG; var Handled: Boolean);
var
  i: SmallInt;
begin
  if Msg.message = WM_MOUSEWHEEL then
  begin
    Msg.message := WM_KEYDOWN;
    Msg.lParam := 0;
    i := HiWord(Msg.wParam);
    if i > 0 then
      Msg.wParam := VK_UP
    else
      Msg.wParam := VK_DOWN;
    Handled := false
  end
end;

procedure TForm1.DataSetAfterScroll(DataSet: TDataSet);
begin
  Caption:= DBGrid1.SelectedField.AsString
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage:= MouseWheel;
  DataModule1.DataSet.AfterScroll:= DataSetAfterScroll
end;

...

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Application.OnMessage:= nil;
  DataModule1.DataSet.AfterScroll:= nil
end;

end.

Saludos.

tarco35 06-05-2012 23:19:10

gracias
 
Gracias de nuevo... funciona perfecto... muy amable


La franja horaria es GMT +2. Ahora son las 11:47:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi