Ver Mensaje Individual
  #4  
Antiguo 26-05-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dago_Ariza
Puedes ayudarme??
El problema que veo es que estás tratando de adaptar el ejemplo de cadetill al pie de la letra en lugar de detenerte a estudiar los conceptos que él tan atinadamente explica.

Yo distinguiría tres conceptos básicos:
  1. Cómo ordenar los datos
  2. Cuándo ordenar
  3. Cómo dibujar la flechita

Cómo ordenar los datos

Ésto debe quedar claro independientemente de cómo muestras los datos o de si usa flechitas o no. Cómo lo hagas dependerá de cómo obtengas los datos de la base y eso lo tienes que determinar tú. Puede ser que uses una componente TTable e índices definidos en la tabla o un Query usando la cláusula ORDER, por dar dos ejemplos.

En un caso simplificado, para ordenar los datos necesitas cómo mínimo dos datos: el nombre del campo por el cuál quieres ordenar y si la ordenación es ascendente o descendente. En este contexto comiezas entonces definiendo un método:

Código Delphi [-]
procedure TForm1.Ordenar(Campo: String; Ascendente: Boolean);
begin
  { Aquí el código para ordenar }
end;

Por ejemplo, si usas un Query, el método podría quedar así:

Código Delphi [-]
procedure TForm1.Ordenar(Campo: String; Ascendente: Boolean);
begin
  Query.SQL.Text := 'select * from tabla order by ' + Campo;
  if not Ascendente then
    Query.SQL.Text := Query.SQL.Text + ' desc';

  Query.Open;
end;

Pero insisto, éste es sólo un ejemplo y tú mejor que nadie puede saber cuál será la implementación final.


Cuándo ordenar

Una vez que tengas bien claro cómo ordenar los datos te darás cuenta que la ordenación la puedes ejecutar de muchas maneras. Puedes hacerlo, siguiendo el ejemplo de cadetill, seleccionando el campo desde un combo o conforme el usuario presione un título de la rejilla.

Lo importante aquí es que al tener ya aislado del resto el método de ordenación, éste se puede ejecutar de cualquier forma que se te ocurra.

En tu caso específico, una de estas formas es mediante los títulos de la rejilla. Por tanto necesitas poder actuar cuando el usuario presione uno. Ésta es la labor del evento OnTitleBtnClick.
La estrategia que sigas aquí también depende de lo que desees hacer exactamente. Una forma usual de proceder es:
  • Se ordena sólo por una columna a la vez
  • Si se presiona la columna por la que actualmente están ordenados los datos el orden se invierte (ascendente<-->descendente).
  • En caso contrario se ordena según la nueva columna manteniendo la dirección de ordenamiento que ya se tiene.

Para esta estrategia requieres entonces mantener en todo momento la información de la columna o campo actual de ordenamiento así como la dirección, por ejemplo, con sendas variables privadas:

Código Delphi [-]
type
  TForm1 = class(TForm)
  private
    Campo: String;
    Ascendente: Boolean;
  end;

de manera que la implementación del evento podría verse similar a:

Código Delphi [-]
procedure TForm1.RxDBGrid1TitleBtnClick(...);
begin
  if SameText(Field.FieldName, Campo)
    then Ascendente := not Ascendente // mismo campo, invertir orden
    else Campo := Field.FieldName; // campo distinto, guardar valor

  Ordenar(Campo, Ascendente);
end;


Cómo dibujar la flechita

Al llegar a este punto, una vez entendidos los dos anteriores a plenitud, te darás cuenta de que se trata de la parte más sencilla.

El punto importante aquí es cómo hace el RXDBGrid para dibujar la mentada flechita. El evento OnGetBtnParams se dispara cada vez que la componente necesite dibujar un título y mediante el parámetro SortMarker le indicamos qué flechita queremos que dibuje. Observa que no podemos saber en qué momento preciso se va a generar el evento y por ello el evento también pasa el campo Field que corresponde. Tendrás entonces que determinar si corresponde al campo actual de ordenamiento y en tal caso usar el valor de la variable Ascendente para saber la dirección de ordenamiento, por ejemplo:

Código Delphi [-]
procedure TForm1.RxDBGrid1GetBtnParams(...);
begin
  if SameText(Field.FieldName, Campo) then
    SortMarker := TSortMarker(Byte(Ascendente) + 1);
end;

-------------------

Ésta es sólo otra explicación. Tu labor ahora es estudiar los conceptos involucrados, releer con detenimiento la explicación de cadetill- mucho más completa que ésta y, entonces sí, aplicar lo aprendido a tu caso particular.

// Saludos
Responder Con Cita