Ver Mensaje Individual
  #5  
Antiguo 23-12-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por AzidRain Ver Mensaje
supongamos 3 grids en sus ventanas "apiladas" (tile), tome la que quiero usar como "maestra" y veo que tiene 5 filas, las demás tienen igual 5 o menos, pero los campos son exactamente las mismas.

El comportamiento a reproducir es que si movemos el scrollbar o bien la celda con el foco en nuestro grid maestro, esto se replique en los demás grids, obviamente los que tengan menos filas o solo una quedarían en el mismo lugar, la idea principal es que en todo momento todas las grids tengan seleccionado el mismo campo ya que su estructura es idéntica.
Hola AzidRain.

Hice este código que creo que en líneas generales hace lo que buscas.

MDIForm:
Código Delphi [-]
...
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus,
  Unit2; // form DBGrid emisor (maestro)

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
     procedure GridChange(Sender: TObject; Valor: string);
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

uses Unit3, Unit4; // forms con DBGrids receptores

procedure TForm1.FormShow(Sender: TObject);
begin
  with TForm2.Create(Self) do
    GridOnChange:= GridChange;
  TileMode:= tbVertical;
  Tile;
end;

procedure TForm1.GridChange(Sender: TObject; Valor: string);
begin
  Form3.DBGrid1.DataSource.DataSet.Locate('Campo',Valor,[]);
  Form4.DBGrid1.DataSource.DataSet.Locate('Campo',Valor,[]);
  // demas forms si los hay
end;
...

MDIChild emisor (maestro):
Código Delphi [-]
...
type
  TGridChangeEvent = procedure(Sender: TObject; Valor: string) of object;
  TForm2 = class(TForm)
    DataSet: TTable;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    procedure DataSetAfterScroll(DataSet: TDataSet);
  private
    FGridChange: TGridChangeEvent;
  public
    property GridOnChange: TGridChangeEvent read FGridChange write FGridChange;
  end;

var
  Form2: TForm2;

implementation {$R *.dfm}

procedure TForm2.DataSetAfterScroll(DataSet: TDataSet);
begin
  if Assigned(FGridChange) then
    FGridChange(Self,DataSet.FieldByName('Campo').AsString);
end;
...
Es decir el MDIForm es el encargado de posicionar los DBGrids receptores cuando es disparado el evento TGridChangeEvent en el form que contiene el DBGrid 'maestro' (Form2 en el ejemplo).

Espero te ayude o al menos te hacerque alguna idea...

Un saludo.

Edito: (El tercer y cuarto MDIChilds están en creación automática para simplificar el ejemplo)
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 23-12-2011 a las 13:28:43. Razón: agregar comentario
Responder Con Cita