Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-07-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 03-07-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 03-07-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #4  
Antiguo 03-07-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
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

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

Pos lo dicho, que gracias y, nos leemos
Responder Con Cita
  #5  
Antiguo 03-07-2004
Gydba Gydba is offline
Miembro
 
Registrado: ene 2004
Ubicación: Argentina
Posts: 673
Poder: 21
Gydba Va por buen camino
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.
__________________
Suerte
.: Gydba :.
Responder Con Cita
  #6  
Antiguo 03-07-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
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

Nos leemos
Responder Con Cita
  #7  
Antiguo 05-07-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
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

Nos leemos
Responder Con Cita
  #8  
Antiguo 05-07-2004
Gydba Gydba is offline
Miembro
 
Registrado: ene 2004
Ubicación: Argentina
Posts: 673
Poder: 21
Gydba Va por buen camino
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
__________________
Suerte
.: Gydba :.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 16:42:39.


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
Copyright 1996-2007 Club Delphi