Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Contorlar el ancho de las columnas de un DbGrid (https://www.clubdelphi.com/foros/showthread.php?t=12049)

__cadetill 03-07-2004 12:39:45

Contorlar el ancho de las columnas de un DbGrid
 
Hola a todos

Bueno, la cuestión es que necesitaría controlar de alguna manera cuando se produce un cambio en la anchura de una columna de un TDbGrid (o TRxDbGrid, me daría lo mismo)

Me he estado mirando las clases TColumn y TDbGrid y no he visto nada protegido (y menos público o publicado) que me de estos valores (quizás he mirado mal)

Alguna idea?

Gracias de antemano

marcoszorrilla 03-07-2004 13:16:17

Supongo que lo que buscas es un evento que puedas controlar, pues no lo he encontrado, pero aprovecho para saludarte, que hace días que no se te veía por estos lares.

Estas son algunas propiedades interesantes que supongo ya habrás tocado.
Código Delphi [-]
MiCol1:=DbGrid1.Columns.Items[1].Width;
DbGrid1.Columns.Items[1].DefaultWidth;

Un Saludo Xavier.

marcoszorrilla 03-07-2004 13:42:50

Xavier:

Si tienes el libro de Marco Cantù "Delphi 6", mírate un ejemplo que viene en la página 844 tiene una propiedad llamada ColWidthsChanged que igual te sirve.

Un Saludo.

__cadetill 03-07-2004 15:26:43

Hola Marcos, un saludo para ti también

Pues sí que lo tengo y sí, creo que me va a servir perfectamente. No se la columna que cambia (de momento), pero al menos se que hay cambio, que no es poco y ya se por donde empezar a tirar

Ni te imaginas las paranoias que se me habían ocurrido para controlar el tema :p

La verdad es que no se me había ocurrido descender tan abajo en la jerarquía de clases de Delphi. La próxima vez bajo hasta TObject, prometido :D

Pos lo dicho, que gracias y, nos leemos :)

Gydba 03-07-2004 18:14:52

Buenas,

Me tomé el atrevimiento de hacer un ejemplito muy simple de algo similar a lo que pedís. Y en consideración de la admiración que les tengo a Uds para mí es todo un placer poder colaborar, aunque sea con una idea:
Código Delphi [-]
unit CustomDBGrid1;

interface

uses
  Windows, Messages, Dialogs, SysUtils, Classes, Controls, Grids, DBGrids;

type
   TEv_ColumnWidthChg = procedure (Sender: TObject; Columna: Longint) of object;

type TCustomDBGrid1 = class(TDBGrid)
private
   bColMoved      : Boolean;
   varColWidthChg : TEv_ColumnWidthChg;
   varCurrentCell : TGridCoord;
   procedure Proc_MovedEvent(Sender: TObject; FromIndex, ToIndex: Longint);
public
   procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
   constructor Create(AOwner : TComponent); override;
   procedure ColWidthsChanged; override;
published
   property OnColumnWidthChange : TEv_ColumnWidthChg read varColWidthChg write varColWidthChg;
end;

procedure Register;

implementation

procedure TCustomDBGrid1.Proc_MovedEvent(Sender: TObject; FromIndex, ToIndex: Longint);
begin
   bColMoved := True;
end;

procedure TCustomDBGrid1.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
   inherited MouseDown(Button, Shift, X, Y);
   varCurrentCell := TCustomGrid(Self).MouseCoord(X - 5, Y);
end;

procedure TCustomDBGrid1.ColWidthsChanged;
begin
   inherited ColWidthsChanged;
      if not bColMoved then begin
         if Assigned(varColWidthChg) then varColWidthChg(Self, varCurrentCell.X);
      end;
   bColMoved := False;
end;

constructor TCustomDBGrid1.Create(AOwner : TComponent);
begin
   inherited Create(AOwner);
   Self.OnColumnMoved := Proc_MovedEvent;
   bColMoved          := False;
end;

procedure Register;
begin
  RegisterComponents('TEST', [TCustomDBGrid1]);
end;

end.

__cadetill 03-07-2004 20:15:25

Hola Gydba

Ante todo gracias por el código, pero ya lo había implementado cuando lo he leído :(
Por cierto, lo has probado? Si quieres usar ese componente, te aconsejo que lo hagas ;) Yo lo he probado y me daba Access Violations. He corregido ese error cambiando el procedimiento ColWidthsChanged de esta manera
Código Delphi [-]
procedure TCustomDBGrid1.ColWidthsChanged;
begin
  inherited ColWidthsChanged;

  if DataLink.Active then
    if not bColMoved then begin
      if Assigned(varColWidthChg) then varColWidthChg(Self, varCurrentCell.X);
    end;
  bColMoved := False;
end;
pero ahora me devolvía siempre una columna más de la que tocaba (cosa que ya desistí mirarme).

Mira lo que yo he hecho (por si interesa a alguien)

Si me he dejado algo o me sobra algo, ya me perdonaréis, pero es que el componente tiene otras funciones (y no es plan de poner todo el código). Si queréis ver el código completo, en breves lo subiré a mi web (a la que termine unos detallitos más, seguramente este finde).

Código Delphi [-]
type
  TColumnResized = procedure(Sender: TObject; Column: TColumn) of object;

  TExtendedGrid = class(TRxDbGrid)
  private
    FListCols: TDBGridColumns;
    FOnColumnResized: TColumnResized;

    function MismasColumnas: boolean;
  protected
    procedure LinkActive(Value: Boolean); override;
    procedure ColWidthsChanged; override;
    procedure ColumnMoved(FromIndex, ToIndex: Longint); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property OnColumnResized: TColumnResized read FOnColumnResized write FOnColumnResized;
  end;

implementation

function TExtendedGrid.MismasColumnas: boolean;
var
  i: integer;
begin
  Result := false;
  i := 0;
  if FListCols.Count <> DataSource.DataSet.Fields.Count then
    Exit;

  while (i <= DataSource.DataSet.Fields.Count - 1) and not Result do
  begin
    if DataSource.DataSet.Fields[i].FieldName = TColumn(FListCols[i]).Field.FieldName then
      inc(i)
    else
      Result := true;
  end;
end;

procedure TExtendedGrid.LinkActive(Value: Boolean);
begin
  inherited;

  if not Value then
    Exit
  else
  begin
    Ok := MismasColumnas;
    FListCols.Clear;
    FListCols.Assign(Self.Columns);

    if Ok then Exit;
  end;
end;

procedure TExtendedGrid.ColWidthsChanged;
var
  i: Integer;
begin
  inherited;

  if Columns.Count <> FListCols.Count then
    Exit;

  for i := 0 to Columns.Count - 1 do
    if Columns.Items[i].Width <> FListCols.Items[i].Width then
      if Assigned(OnColumnResized) then
        OnColumnResized(Self, Columns.Items[i]);

  FListCols.Clear;
  FListCols.Assign(Columns);
end;

procedure TExtendedGrid.ColumnMoved(FromIndex, ToIndex: Integer);
begin
  FListCols.Clear;
  FListCols.Assign(Columns);

  inherited;
end;

constructor TExtendedGrid.Create(AOwner: TComponent);
begin
  inherited;

  FListCols := TDBGridColumns.Create(Self, TColumn);
end;

destructor TExtendedGrid.Destroy;
begin
  FreeAndNil(FListCols);

  inherited;
end;
Seguramente es algo más liado que lo tuyo, pero me interesaba poder pasar un TColumn y, a parte, así podré controlar otras cosillas que tengo en mente :p

Nos leemos

__cadetill 05-07-2004 00:32:44

Como dicen que lo prometido es deuda.... http://www.clubdelphi.com/users/cade...tendedgrid.php

PD: al final tampoco lo he hecho de la manera del mi mensaje anterior, también me daba algún problemilla :D

Nos leemos

Gydba 05-07-2004 13:18:21

Buenas,

Cita:

Empezado por cadetill
Por cierto, lo has probado?

Si. De hecho tenía un ejemplo extremadamente simple con todo funcionando y te lo estaba por enviar por mail. Pero me pareció que tal vez a otros usuarios también les interesaría y lo puse en el foro.

Cita:

Empezado por cadetill
Seguramente es algo más liado que lo tuyo

Lo mio era sólo un ejemplo extraido de lo dicho por marcoszorrilla, es decir sólo una idea. Lo tuyo es mucho mejor.

Cita:

Empezado por cadetill
así podré controlar otras cosillas que tengo en mente

mmm.... las cosas que tengo en mente no las puedo controlar ultimamente :)

Cita:

Empezado por cadetill
Nos leemos

Siempre lo hago :)

Saludos


La franja horaria es GMT +2. Ahora son las 23:02:13.

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