Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Descendiente de un TDBGrid (https://www.clubdelphi.com/foros/showthread.php?t=91852)

ronalg 18-05-2017 04:51:10

Descendiente de un TDBGrid
 
Buenas Noche (donde yo estoy) estimados amigos de ClubDelphi, anduve buscando por todas partes y no logre hacerlo, por eso apelo a ustedes con un problema que para muchos tal vez sea trivial pues hay muchos componentes comerciales para la VCL que pueden hacer lo que ahora me empecino en hacer.

Bueno deseo hacer la clásica ordenación de una DBGrid cuando hacemos click en el título de la columna correspondiente, yo uso los componentes IBX y FIBPlus bueno, realmente ya logre que se ordenara el DBGrid pero quiero crear un componente heredado y modificar el evento OnTitleClick, por más que busco y busco y experimento y experimento no he podido encontrar la forma de reescribir dicho evento.

Podrían darme una mano

Llegue hasta aquí
Código Delphi [-]

unit DBGrid_ORDER;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Grids, DBGrids, IBCustomDataSet, IBQuery, IBTable, StrUtils, Dialogs;

type
  TDBGrid_ORDER = class(TDBGrid)
  procedure TitleClick(Column: TColumn) Override;
  private
    { Private declarations }
    Function Modificar_Order_SQL(Consulta:string;new_campo_ordenar:string):string;
    function QuitarSaltosLinea(Strs: TStrings; Char1Replace:String=''; Char2Replace:String=''):String; OVERLOAD;
    function QuitarSaltosLinea(Strs: String; Char1Replace:String=''; Char2Replace:String=''):String; OVERLOAD;
    Procedure Reordenar_consulta(Consulta: TIBCustomDataSet; Campo_ordenar:String);
  protected
    { Protected declarations }

  public
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TDBGrid_ORDER]);
end;

{ TDBGrid_ORDER }

function TDBGrid_ORDER.Modificar_Order_SQL(Consulta,
  new_campo_ordenar: string): string;
var //Variables Variables Varilbles
begin
     //Codigo Codigo Codgio
end;

function TDBGrid_ORDER.QuitarSaltosLinea(Strs: TStrings; Char1Replace,
  Char2Replace: String): String;
var Str:string;
begin
   Str := AnsiReplaceStr(Strs.Text, #10, Char1Replace);
   Result := AnsiReplaceStr(Str, #13, Char2Replace);
end;

function TDBGrid_ORDER.QuitarSaltosLinea(Strs, Char1Replace,
  Char2Replace: String): String;
var Str:string;
begin
   Str := AnsiReplaceStr(Strs, #10, Char1Replace);
   Result := AnsiReplaceStr(Str, #13, Char2Replace);
end;

procedure TDBGrid_ORDER.Reordenar_consulta(Consulta: TIBCustomDataSet;
  Campo_ordenar: String);
//Variables Variables Varilbles
begin
     //Codigo Codigo Codgio
end;

procedure TDBGrid_ORDER.TitleClick(Column: TColumn);
begin
     //No esta funcionando
     inherited TitleClick(Column);
     //También probe así
     //Inherited;
     IF (column.Field.DataSet is TIBTable) then
     begin
          //Bueno eso es mas simple es modificar los indices y ya
          messagedlg('La ordenación por ahora no funciona con tablas',mtinformation,[mbok],0);
     end
     else
     begin
          reordenar_consulta((column.Field.Dataset as TIbCustomDataSet), Column.Field.FieldName);
     end;
end;

end.

Gracias de antemano

newtron 18-05-2017 09:58:26

Igual suelto una tontería pero yo tengo entendido que en un Dbgrid se plasma el contenido bien de un TTable o de un Query por lo que igual deberías de pensar en cambiar el orden en la fuente de datos, cosa que se reflejará en el Dbgrid, en vez de manipular los datos del Dbgrid directamente.

Saludos

Casimiro Notevi 18-05-2017 10:02:17

También puedes usar el dbgrid de las RX, que tiene esa funcionalidad.
Pero, vamos, que también puedes heredar del original, como cualquier otro componente.

olbeup 18-05-2017 13:33:38

Hola ronalg,

Yo utilizo esto y me va bien.

Código Delphi [-]
type

  TIDFieldSorted = packed record
    FieldColumn: String;
    FieldSorted: String;
    FieldColumnOld: String;
  end;

En el formulario define una variable en private
Código Delphi [-]
...
PFieldSorted: TIDFieldSorted;

funciones definidas
Código Delphi [-]
// Devuelve la columna del DBGrid según FieldColumn
function GetGridColumn(Grid: TDBGrid; FieldColumn: String): TColumn;
var
  nI: Integer;
begin
  Result := nil;
  for nI := 0 to Grid.Columns.Count -1 do
    if (Result <> nil) then
      Break
    else
      if (Grid.Columns.Items[nI].FieldName = FieldColumn) then
        Result := Grid.Columns.Items[nI];
end;

y esto
Código Delphi [-]
procedure TfrmPresupuestos.dbgBudgetsTitleClick(Column: TColumn);
{$J+}
const
  PreviousColumnIndex: integer = -1;
{$J-}
begin
  if (Column = nil) and (PFieldSorted.FieldColumn = '') then
    Exit;

  if (Column = nil) then
    Column := GetGridColumn(dbgBudgets, PFieldSorted.FieldColumn);

  with TCustomADODataSet(dbgBudgets.DataSource.DataSet) do
  begin
    if PreviousColumnIndex > -1 then
      dbgBudgets.Columns[PreviousColumnIndex].Title.Font.Style :=
        dbgBudgets.Columns[PreviousColumnIndex].Title.Font.Style - [fsItalic, fsBold];

    Column.title.Font.Style := Column.title.Font.Style + [fsItalic, fsBold];
    PreviousColumnIndex := Column.Index;

    if (Sort = '') and (PFieldSorted.FieldSorted <> '') then
      Sort := PFieldSorted.FieldSorted
    else
      if (Pos(Column.Field.FieldName, Sort) = 1) and (Pos(' DESC', Sort)= 0) then
        Sort := Column.Field.FieldName + ' DESC'
      else
        Sort := Column.Field.FieldName + ' ASC';

    PFieldSorted.FieldColumn := Column.FieldName;
    PFieldSorted.FieldSorted := Sort;
  end;
end;

Un saludo.

ronalg 18-05-2017 19:21:06

Gracias Newton
 
Cita:

Empezado por newtron (Mensaje 516801)
Igual suelto una tontería pero yo tengo entendido que en un Dbgrid se plasma el contenido bien de un TTable o de un Query por lo que igual deberías de pensar en cambiar el orden en la fuente de datos, cosa que se reflejará en el Dbgrid, en vez de manipular los datos del Dbgrid directamente.

Saludos

te cuento que eso es lo que hacen:
Código Delphi [-]
    Function Modificar_Order_SQL(Consulta:string;new_campo_ordenar:string):string;
    Procedure Reordenar_consulta(Consulta: TIBCustomDataSet; Campo_ordenar:String);

Pero como esta enlazado a un TDataSource puede tener acceso a un origen de datos, para mi interés TIBTable, TIBDataSet y TIBQuery; o sea puede la grilla modificar la ordenacion los datos en estos componentes; Ya me es posible ordenar cualquier TDBGrid conectado a cualquiera de estos origenes de datos, pero tengo las funciones en una unidad que integro a cada proyecto y en el evento OnTitleClick pongo llamada a dichas funciones:

Código Delphi [-]
procedure TDBGrid_ORDER.TitleClick(Column: TColumn);
begin
     //if Assigned(FOnTitleClick) then FOnTitleClick(Column);

     IF (column.Field.DataSet is TIBTable) then
     begin
          messagedlg('La ordenación por ahora no funciona con tablas',mtinformation,[mbok],0);
     end
     else
     begin
          reordenar_consulta((column.Field.Dataset as TIbCustomDataSet), Column.Field.FieldName);
     end;

     if Assigned(FOnTitleClick) then FOnTitleClick(Column);
end;

Pero si podemos crear un componente TIBGRID_SORT o TIBGRID_ORD que ya incluya dichas funciones de ordenación nos ahorramos el tiempo de escribir codigo e incluir unidades en cada proyecto, pero mas que el tiempo ahorrado es por el reto de hacerlo.

ronalg 18-05-2017 19:32:13

El componente es de Lujo Casimiro
 
Cita:

Empezado por Casimiro Notevi (Mensaje 516803)
También puedes usar el dbgrid de las RX, que tiene esa funcionalidad.
Pero, vamos, que también puedes heredar del original, como cualquier otro componente.

Es una buenainversion comprar dicho componente pero creo que es de paga, aun que vale la inversión.
Como comente anterirormente es mas por el reto de hacerlo. (simpre esta presente el dicho "para que hacerlo si puedes comprarlo hecho).

Casimiro Notevi 18-05-2017 19:36:26

Cita:

Empezado por ronalg (Mensaje 516831)
Es una buenainversion comprar dicho componente pero creo que es de paga, aun que vale la inversión.

Es absolutamente libre y gratis, desde toda la vida.

ronalg 18-05-2017 19:42:00

Gracias Olbeup

Bueno te cuento una curiosidad, para el componente TIBTable funciona de forma similar a lo que tu muestras en tu codigo, modificar indices para reorderar, la funcion SORTED no esta disponible en lo TIBTable; por la naturaleza y filosofia de los componente TIBQuery y TIBDataSet (el mas relevante ahora = "nunca traer todos los datos de una tabla") no tiene implementados los indices para ordenar los datos; pero la velocidad de acceso a datos es muy pero muy eficiente.

ronalg 18-05-2017 19:59:46

Casimiro - Te debo un almuerzo
 
Cita:

Empezado por Casimiro Notevi (Mensaje 516832)
Es absolutamente libre y gratis, desde toda la vida.

Me diste una alegría que no te imaginas.

Mil Gracias y disculpa la ignorancia.

olbeup 19-05-2017 09:08:12

Cita:

Empezado por ronalg (Mensaje 516833)
Gracias Olbeup

Bueno te cuento una curiosidad, para el componente TIBTable funciona de forma similar a lo que tu muestras en tu codigo, modificar indices para reorderar, la funcion SORTED no esta disponible en lo TIBTable; por la naturaleza y filosofia de los componente TIBQuery y TIBDataSet (el mas relevante ahora = "nunca traer todos los datos de una tabla") no tiene implementados los indices para ordenar los datos; pero la velocidad de acceso a datos es muy pero muy eficiente.

Hola ronalg,

Si es verdad, el "Sort" en TIBCustomDataSet no existe :eek:, sólo esta en TCustomADODataSet, :rolleyes: !!vaya!!

Un saludo.


La franja horaria es GMT +2. Ahora son las 09:44: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