Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿Como sincronizar dos o mas Grids? (https://www.clubdelphi.com/foros/showthread.php?t=77120)

AzidRain 22-12-2011 22:52:53

¿Como sincronizar dos o mas Grids?
 
Sigo con el detalle que he venido comentando en posts anteriores, pero ya vamos saliendo, ahora estamos en la etapa de "emebellicimiento".

Sean n Forms del mismo tipo que muestran información anual de una sucursal seleccionada, estos forms son tipo MDIChild por lo que podemos tener abiertos los que deseemos.

La funcionalidad que busco es que mediante un mensaje todos los grids de esas forms (del mismo tipo) queden sincronizados de manera que si movemos cualquier cosa en uno, los demás repliquen el mismo movimiento. De esta forma podemos tener 2 o 3 forms correspondientes a diferentes sucursales y poder compara la información más fácilmente.

El enfoque tiene que ir sobre el grid y no sobre el dataset ya que en algunos casos no tienen las mismas filas aunque todos tienen las mismas columnas.

Espero el aguacero de ideas.

Saludos

rgstuamigo 23-12-2011 00:16:12

Bueno... habría que ver mas profundamente lo que estas tratando de hacer....:rolleyes:, sin embrago, en lo que he podido entender creo que debemos tomar en cuenta lo siguiente:
  1. Dices que la sincronizacion de los DBgrid no deben ser a nivel del DataSet, pues en ese caso, todos sabemos que el DBGrid no es mas que un reflejo del Dataset, para lograr eso, pues podria ser que se utilice temporalmente componentes ClientDataSet, aunque como repito, no me cabe la idea de por que no hacerlo direntamente con los DataSet, ya nos explicarás las Razones.
  2. Para Sincronizar los formularios se podria crear nuestro propio Mensaje personalizado y enviarselo con alguna API de Windows (PostMessage o SendMessage) a todas las ventanas en cuention; desde luego eso implica que debemos capturar tal Mensaje(Message) y procesarlo en cada formulario.;)
Bueno solo es un idea...;)
Saludos...:)

ecfisa 23-12-2011 01:37:37

Hola.

Según entiendo los campos que se visualizan en el DBGrid son comunes pero los datos que contienen pueden ser diferentes para cada sucursal. Pero al igual que Roberto no visualizo bién el sentido de hacer la actualización basándose en el DBGrid. Suponiendo que seleccionemos la línea 'n' y sincronicemos todos los DBGrids a ese número de línea, el efecto estaría logrado, mas los datos mostrados seguramente no tengan relación alguna. (Quizá este diciendo un desvarío ya que no alcanzo a entender claramente la situación)

En cuanto a como hacer la sincronización puede ser mediante mensajes, como ya sugirió Roberto, o mediante eventos. Lo que no tengo en claro es en base a que factor debe ser echa.

Un saludo.

AzidRain 23-12-2011 03:06:55

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.

ecfisa 23-12-2011 03:41:28

Cita:

Empezado por AzidRain (Mensaje 421800)
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)


La franja horaria es GMT +2. Ahora son las 02:26:31.

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