Dbgrid et index

zerargui Messages postés 65 Date d'inscription vendredi 24 octobre 2008 Statut Membre Dernière intervention 25 février 2019 - 7 nov. 2008 à 12:58
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 10 nov. 2008 à 20:10
j'ai pris un petit programme de Delphiprog en le modifiant par la
lecture des indexes de DBase .DBF par indexex de base Paradox  .db tous
s'affiche normalement sauf lorsqu'on click sur les indexes  rien ne
se passe au niveau du Tri dans le dbgrid. Help me please je suis débutant . voici le
code :

unit Unit2;

interface

uses
  Windows, Messages, Classes, SysUtils, Graphics, Controls, StdCtrls, Forms,
  Dialogs, DBCtrls, DB, DBGrids, Grids, DBTables;

type
  TForm2 = class(TForm)
    Table1CodeCli: TStringField;
    Table1NomCli: TStringField;
    Table1PrenomCli: TStringField;
    Table1AdresseCli: TStringField;
    Table1AgeCli: TStringField;
    Table1TelCli: TStringField;
    Table1MtCdes: TFloatField;
    DataSource1: TDataSource;
    Table1: TTable;
    DBGrid1: TDBGrid;
    ListBox1: TListBox;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure DBGrid1TitleClick(Column: TColumn);
    procedure FormDestroy(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);

  private
    { déclarations privées }
  public
    { déclarations publiques }
  end;

var
  Form2: TForm2;
  //Liste des index secondaires disponibles
  IndexList: TStrings;
  //Liste des index secondaires créés à la volée
  CreatedIndexList: TStrings;

implementation

{$R *.DFM}

procedure TForm2.FormCreate(Sender: TObject);
begin
  Table1.Open;
  //Récupérer la liste des index déclarés
  //avant le lancement du programme
  Table1.GetIndexNames(IndexList);
  //En faire une copie pour l'afficher et
  //permettre une sélection par l'utilisateur
  ListBox1.Items.Assign(IndexList);

end;

procedure TForm2.DBGrid1TitleClick(Column: TColumn);
begin
  //Vérifie que la colonne affiche des données de la
  //table et non un champ calculé
  if DBGrid1.ValidFieldIndex(Column.Index) then
  begin
    //Un index correspondant à la colonne cliquée existe-t-il ?
    if IndexList.IndexOf(Column.FieldName) <> -1 then
      //Si oui, l'activer
      with TTable(DbGrid1.DataSource.DataSet) do
        IndexFieldNames := Column.FieldName
    else
      //L'index n'existe pas :
      showmessage('l''indexe n''existe pas');
      with TTable(DbGrid1.DataSource.DataSet) do
      begin
        Close;
        Exclusive := True;
        //créer un index secondaire correspondant
        //à la colonne cliquée
        try
          AddIndex(Column.FieldName, Column.FieldName, []);
          //rendre actif l'index créé
          IndexFieldNames := Column.FieldName;
          Exclusive := False;
          Open;
          //Réactualiser la liste des index de la table
          GetIndexNames(IndexList);
          //et l'afficher
          ListBox1.Items.Assign(IndexList);
          CreatedIndexList.Assign(IndexList);
        except
          on EDatabaseError do
          begin
            ShowMessageFmt('Impossible de créer un index'#13'sur le champ %s.',
              [Column.FieldName]);
            IndexFieldNames := '';
            Exclusive := False;
            if not Active then
              Open;
          end;
        end;
      end;
  end;

end;

procedure TForm2.FormDestroy(Sender: TObject);
var
  i: integer;
begin
  with Table1 do
  begin
    Close;
    Exclusive := True;
    for i := 0 to CreatedIndexList.Count - 1 do
    try
      Table1.DeleteIndex(CreatedIndexList.Strings[i]);
    except
      //
    end;
    Exclusive := False;
    Close;
  end;
end;

procedure TForm2.ListBox1Click(Sender: TObject);
begin
  //S'il y a au moins un élément dans la liste
  with ListBox1 do
    if Items.Count > 0 then
      //Rendre actif l'index correspondant à
      //l'élément sélectionné
      Table1.IndexFieldNames := Items[ItemIndex];
end;

procedure TForm2.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Column.FieldName = Table1.IndexFieldNames then
    //Colorer en bleu le titre cliqué
    Column.Title.Font.Color := clBlue
  else
    Column.Title.Font.Color := clTeal;

end;

initialization
  IndexList := TStringList.Create;
  CreatedIndexList := TStringList.Create;

finalization
  IndexList.Free;
  CreatedIndexList.Free;
end.

NB: aucune exception n'apparait.

Cordialement Amar

2 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
7 nov. 2008 à 19:42
essaie cette technique :

procedure TFom1.DBGrid1TitleClick(Column: TColumn);
var
  Moncode: string;
begin
  if croiss = true then
    Moncode:= Moncode + ' where qlchose order by ' + column.Fieldname +
 ' asc' else
    Moncode := Moncode + ' where qlchose order by ' + column.Fieldname + ' desc';
  with query1 do
  begin
    active : = false;
    sql.Clear;
    sql.Add(Moncode);
    active := true;
  end;
end;

tu peux même simplifier par
select * from MaTable Order By asc (ou dec)

en omettant le where..

cantador
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
10 nov. 2008 à 20:10
"NB: aucune exception n'apparait."
C'est ce que l'on appelle une exception silencieuse

@cantador : ce code avait pour but de montrer la création dynamique d'index. En utilisant une requête ici, tu cumules au moins deux inconvénients :
- relecture et tri de toute la table si l'index n'existe pas
- nécessité de réécrire tout le code que zerargui a soigneusement recopié.
Pour un débutant (je cite), ça peut devenir une tâche insurmontable.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
Rejoignez-nous