Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-05-2017
ronalg ronalg is offline
Miembro
 
Registrado: may 2003
Ubicación: Sucre - Bolivia
Posts: 68
Poder: 21
ronalg Va por buen camino
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
__________________
Saludos desde Sucre - Bolivia
"Si te lo puedes imaginar lo
puedes resolver" Pyriel
Responder Con Cita
  #2  
Antiguo 18-05-2017
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.457
Poder: 20
newtron Va camino a la fama
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
__________________
Be water my friend.
Responder Con Cita
  #3  
Antiguo 18-05-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.020
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #4  
Antiguo 18-05-2017
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
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.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
  #5  
Antiguo 18-05-2017
ronalg ronalg is offline
Miembro
 
Registrado: may 2003
Ubicación: Sucre - Bolivia
Posts: 68
Poder: 21
ronalg Va por buen camino
Gracias Newton

Cita:
Empezado por newtron Ver Mensaje
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.
__________________
Saludos desde Sucre - Bolivia
"Si te lo puedes imaginar lo
puedes resolver" Pyriel
Responder Con Cita
  #6  
Antiguo 18-05-2017
ronalg ronalg is offline
Miembro
 
Registrado: may 2003
Ubicación: Sucre - Bolivia
Posts: 68
Poder: 21
ronalg Va por buen camino
El componente es de Lujo Casimiro

Cita:
Empezado por Casimiro Notevi Ver Mensaje
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).
__________________
Saludos desde Sucre - Bolivia
"Si te lo puedes imaginar lo
puedes resolver" Pyriel
Responder Con Cita
  #7  
Antiguo 18-05-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.020
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ronalg Ver Mensaje
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.
Responder Con Cita
  #8  
Antiguo 18-05-2017
ronalg ronalg is offline
Miembro
 
Registrado: may 2003
Ubicación: Sucre - Bolivia
Posts: 68
Poder: 21
ronalg Va por buen camino
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.
__________________
Saludos desde Sucre - Bolivia
"Si te lo puedes imaginar lo
puedes resolver" Pyriel
Responder Con Cita
  #9  
Antiguo 18-05-2017
ronalg ronalg is offline
Miembro
 
Registrado: may 2003
Ubicación: Sucre - Bolivia
Posts: 68
Poder: 21
ronalg Va por buen camino
Casimiro - Te debo un almuerzo

Cita:
Empezado por Casimiro Notevi Ver Mensaje
Es absolutamente libre y gratis, desde toda la vida.
Me diste una alegría que no te imaginas.

Mil Gracias y disculpa la ignorancia.
__________________
Saludos desde Sucre - Bolivia
"Si te lo puedes imaginar lo
puedes resolver" Pyriel
Responder Con Cita
  #10  
Antiguo 19-05-2017
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Cita:
Empezado por ronalg Ver Mensaje
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 , sólo esta en TCustomADODataSet, !!vaya!!

Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Que componente descendiente de TStringGrid me recomiendan?? DANY OOP 12 02-12-2010 23:30:02
duda al crear un descendiente de tpanel hibero OOP 1 23-05-2008 22:07:52
Editor de columnas en descendiente de TCustomDbEdit GuerreroDelphi OOP 0 20-01-2008 06:39:46
Descendiente de TCustomDbGrid GuerreroDelphi Varios 4 31-12-2007 04:14:15
Descendiente de TCollectionItem de solo lectura adlfv OOP 3 15-09-2005 16:59:55


La franja horaria es GMT +2. Ahora son las 09:46:48.


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