zerargui
Messages postés65Date d'inscriptionvendredi 24 octobre 2008StatutMembreDernière intervention25 février 2019
-
7 nov. 2008 à 12:58
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDerniè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 :
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;
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 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)
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.