DBGRID, SAUVER LE VISUEL DEFINIT PAR VOS UTILISATEURS

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 14 déc. 2004 à 18:37
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 15 déc. 2004 à 16:02
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/28179-dbgrid-sauver-le-visuel-definit-par-vos-utilisateurs

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
15 déc. 2004 à 16:02
J' ai déjà essayé déja:
Pour tous les Floats, la valeur est la même alors que j' ai des floats de taille differente par ex:
Champ TVA 3N1
Champ Valeur 7N2

Donc, dans cet exemple, la colonne TVA dans une DBGrid n' a besoin de montrer que de 5 caracteres (avec la virgule) alors que la colonne Valeur a besoin de montrer 10 caracteres. Donc, la colonne valeur a besoin d' etre 2 fois plus grande.
C' est un probleme qui me hante depuis quelques années déjà et personne ne sait comment récupérer la structure d' un float alors que Database Desktop te montre ça ...

Aller continuons de chercher :-)
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
15 déc. 2004 à 15:20
Eh sinon je viens de trouver ça :
Showmessage(TableCalculs1.Fields.Fields[13].FieldName + ' = ' + IntToStr(TableCalculs1.Fields.Fields[13].DisplayWidth));

Quand penserais tu?
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
15 déc. 2004 à 15:14
Ouais je comprens bien le souci. Je viens de regarder un peu dans l'aide et il précise bien que la propriété size n'est valable que pour ces types de champs :
ftBCD Size indique le nombre de chiffres après le séparateur décimal.
ftString Size indique le nombre maximum de caractères dans la chaîne.
ftVarBytes Size indique le nombre maximum d'octets de données sans compter les deux premiers octets indiquant le nombre réel d'octets utilisés.
ftBytes Size indique le nombre maximum d'octets de données.
ftBlob Size indique le nombre d'octets du BLOB stockés dans le tampon de l'enregistrement.
ftDBaseOle Size indique le nombre d'octets du champ OLE BLOB dBASE stockés dans le tampon de l'enregistrement.

ftFMTBCD Size indique le nombre de chiffres après le séparateur décimal.
ftFmtMemo Size indique le nombre d'octets du mémo stockés dans le tampon de l'enregistrement.
ftGraphic Size indique le nombre d'octets de l'image stockés dans le tampon de l'enregistrement.
ftMemo Size indique le nombre d'octets du mémo stockés dans le tampon de l'enregistrement.
ftParadoxOle Size indique le nombre d'octets du champ OLE BLOB Paradox stockés dans le tampon de l'enregistrement.

ftTypedBinary Size indique le nombre d'octets du BLOB stockés dans le tampon de l'enregistrement.
ftADT Size indique le nombre total de champs contenus dans le champ ADT, y compris les champs des champs enfant de type ADT.
ftArray Size est le nombre d'éléments du tableau.

Maintenant peut etre que la propriété datasize pourrait fonctionner pour les autres types de champs?
Qu'en penses tu Mauricio?
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
15 déc. 2004 à 15:03
Merci à toi jmp77 !
Voilà un petit coup de mains:

procedure PROPRIEDADES_TABELA(Tabela: TTable; CamposParaIndexo: TStrings);
var _Inc, i: Integer;
Tipo: String;
begin
FrmProp := TFrmProp.Create(Nil);
FrmProp.LBIndex.Items.Clear;
FrmProp.TabProp := Tabela;

FrmProp.LBCamposParaIndexo.Items := CamposParaIndexo;

FrmProp.TabProp.IndexDefs.Update;
for i := 0 To FrmProp.TabProp.IndexDefs.Count - 1 Do
If FrmProp.TabProp.IndexDefs[i].Name <> ''
Then TStringAdd(FrmProp.LBIndex.Items, FrmProp.TabProp.IndexDefs[i].Name, False, True)
Else TStringAdd(FrmProp.LBIndex.Items, FrmProp.TabProp.IndexDefs[i].FieldExpression, False, True);

_Inc := 0;
FrmProp.StringGrid1.Cells[0, 0] := 'Campo';
FrmProp.StringGrid1.Cells[1, 0] := 'Tipo';
FrmProp.StringGrid1.Cells[2, 0] := 'Tam.';
FrmProp.StringGrid1.Cells[3, 0] := 'Dec.';

for i := 0 to FrmProp.TabProp.FieldCount-1 do
begin
FrmProp.StringGrid1.RowCount := FrmProp.StringGrid1.RowCount + _Inc;
_Inc := 1;

Case FrmProp.TabProp.Fields[i].DataType Of
ftString: Tipo := 'String';
ftSmallint: Tipo := 'Smallint';
ftInteger: Tipo := 'Integer';
ftWord: Tipo := 'Word';
ftAutoInc: Tipo := 'AutoInc';
ftBoolean: Tipo := 'Boolean';
ftFloat: Tipo := 'Float';
ftCurrency: Tipo := 'Currency';
ftTime: Tipo := 'Time';
ftDate: Tipo := 'Date';
ftDateTime: Tipo := 'DateTime';
ftBytes: Tipo := 'Bytes';
ftVarBytes: Tipo := 'VarBytes';
ftBlob: Tipo := 'Blob';
ftMemo: Tipo := 'Memo';
ftFmtMemo: Tipo := 'FmtMemo';
ftGraphic: Tipo := 'Graphic';
ftWideString: Tipo := 'WideString';
ftLargeint: Tipo := 'Largeint';
Else Tipo := 'sconhecido';
End;

FrmProp.StringGrid1.Cells[0, FrmProp.StringGrid1.RowCount - 1] := FrmProp.TabProp.Fields[i].FieldName;
FrmProp.StringGrid1.Cells[1, FrmProp.StringGrid1.RowCount - 1] := Tipo;

Case FrmProp.TabProp.Fields[i].DataType Of
ftString : FrmProp.StringGrid1.Cells[2, FrmProp.StringGrid1.RowCount - 1] := IntToStr(FrmProp.TabProp.Fields[i].Size);
ftFloat : begin
FrmProp.StringGrid1.Cells[2, FrmProp.StringGrid1.RowCount - 1] := IntToStr(FrmProp.TabProp.Fields[i].Size);
// FrmProp.StringGrid1.Cells[2, FrmProp.StringGrid1.RowCount - 1] := IntToStr(FrmProp.TabProp.FieldList[i].Size);
end;
End;
end;

FrmProp.ShowModal;
FrmProp.Release;
end;

Comme tu peux le voir, pas moyen de récupérer la taille des floats genre 7N2 ou 4N1 etc ...
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
15 déc. 2004 à 14:21
Effectivement je suis daccord avec toi Mauricio c'est d'ailleurs mon cas j'ai des bases avec 200 colonnes et plus de 5000 enregistrements et je n'utilise pas cette fonction à cause du temps d'execution. Cette solution est viable pour une petite base. Enfin si quelqu'un trouve une solution plus rapide ca pourrais etre sympa. Je vais essayer de regarder la question.

Allez bonne prog,
JMP77.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
15 déc. 2004 à 13:15
J' ai oublié de vous dire un truc hyper important :
Il existe un parametre de ma fonction qui s' appelle 'Update_Num'.

A quoi ça sert?
Et bien vous mettez '1' comme valeur par exemple ...
Si vous faites une nouvelle version de votre programme avec plus de colonnes dans la DBGrid ou certains champs n' ont pas le meme nom, ça va planter!!!
Et bien si vous changer les colonnes de la DBGrid en design time, vous changer la valeur de Update_Num à '2' par exemple.
Ça va reinicialiser le fichier Ini et donc, pas de bug !
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
15 déc. 2004 à 12:41
Merci à tous!
Alors sinon, jmp77, ton code de redimensionnement des colonnes serait parfait si: tu ne parcoure pas le fichier d' un bout à l' autre, et en plus pour chaque colonne !!!
Si tu as des milliers de registres, je te dis meme pas le temps que ça mettrai!!!
Mais c une bonne idée et ta méthode pour savoir la taille du texte celle que j' utilise dans d' autre cas (montrer du texte sur un canvas, c utile pour centrer du texte !!!).
Par contre il est possible de récupérer la taille de tous les champs, mais j' ai jamais réussit à savoir pour les floats la taille de l' entier et la taille de la partie décimale :-(
J' avais mis un post sur le forum à ce sujet dont DelphiProg m' a répondu, mais sa réponse ne me donnait pas la taille des floats que je l' ai expliqué plus haut, si qqu' un sait comment, merci d' avance les gars !!!
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
15 déc. 2004 à 11:59
Et bien merci mauricio encore un super code source qui va rendre service à pas mal de monde.

Note final : 10/10.

Juste une petite remarque (il en faut toujours une lol) tu pourrais ajouter la fonction qui permet de redimensionner les colonnes automatiquement en fonction des données. Voici le code si ca te dit :
procedure ResizeColumns();

var
J,MaxTextWidth, fieldwith : Integer;

begin

// On fait toutes les colonnes du TDBGrid
For J:=0 to Form1.GridFic.FieldCount-1 do
begin
// Initialisation
MaxTextWidth := 0;

// On recupere la longueur la plus grande contenu dans la colonne
Form1.GridFic.DataSource.DataSet.First;

while not form1.GridFic.DataSource.DataSet.Eof do
begin
fieldwith := Form1.GridFic.Canvas.TextWidth(form1.GridFic.datasource.DataSet.Fields.Fields[J].AsString);
if (fieldwith > MaxTextWidth) then MaxTextWidth := fieldwith;
Form1.GridFic.DataSource.DataSet.Next;
end;
// On applique la nouvelle taille a condition que la colonne n'était pas vide
If MaxTextWidth > 0 then form1.GridFic.Columns[J].Width := MaxTextWidth + 20;
end;
end;

Bonne journée et bonne prog,
JMP.

Merci également à delphiprog pour cette remarque car elle va me servir aussi.
Inekman Messages postés 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 juin 2006
15 déc. 2004 à 11:44
Je me suis cassé la tête la dernière fois en cours à chercher comment faire pour colorer une colonne d'un DBGrid :-|

Et là, Mauricio me pond un source qui explique comment ça marche...elle est pas belle la vie ;-)

Mauricio, actif comme personne ces derniers jours, nous a fait un super code source ici.

Big bravo man.

Inekman.9/10

ps : -1 à cause du bricolage pour la sauvegarde/le chargement des compo...:-D mais sache que t'as mon 10/10 sur ce source.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
15 déc. 2004 à 10:59
Ok, y' a pas photo!
La solution de DelphiProg est bien plus rapide !!
5 fois plus précisemment ...

Je garde quand même ma fonction qui est utilisée un peu partout pour les raisons cités plus haut...
Mais je vais commencer à utiliser ReadComponentResFile(GridFile, DbGrid1) pour les autres cas!

DelphiProg, t' aurais pas une idée si par exemple je voulais garder la config de plusieurs compos dans le meme fichier ??? Parce que j' ai un programme de vente au balcon avec l' interface 'programmable' par l' utilisateur. Et j' ai un fichier de config pour garder ces infos (j' utilise d' ailleurs ma fonction pour sauver mes dbgrids), et certaines interfaces sont déjà pré-programmées et l' utilisateur peut les modifier/charger/enregistrer sous etc ....
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
15 déc. 2004 à 10:26
Merci en tout cas pour cette info !
Bon, je ne connaissait pas cette méthode :-)

De toute façon, ma source permet dans le cas d' avoir plusieurs DBGrids, de sauvegarder l' aspect dans le meme fichier Ini... Mais je vais essayer ReadComponentResFile(GridFile, DbGrid1);
pour voir, merci!

PS: j' ai mis l' explication de chaque fonction en commentaire, désolé mais je peux pas renommer les variables etc ... parce que manque de temps ...
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
14 déc. 2004 à 23:38
Salut Mauricio,

Ton code est pas mal mais on oublie encore trop souvent les capacités de sérialisation des descendant de la classe TPersistent.
Dans le cas d'un TDbGrid, pour sauvegarder et restaurer l'aspect visuel, je trouve qu'il y a beaucoup plus simple :

const
GridFile = 'grid.def';

procedure TForm1.FormCreate(Sender: TObject);
begin
if FileExists(GridFile) then
ReadComponentResFile(GridFile, DbGrid1);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
WriteComponentResFile(GridFile, DbGrid1);
end;

J'attire toutefois l'attention sur le fait que ce code ne fonctionnera pleinement qu'avec des colonnes persistentes pour tout ce qui concerne l'aspect des données. Pour ce qui touche à l'apparence du composant lui-même, là il n'y a aucun problème.

Je vais quand même regarder le reste de tes fonctions bien qu'il faille faire un effort de traduction...
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
14 déc. 2004 à 18:37
Attention tout de meme au caractere separateur !

Si vous utiliser par ex. le caractere #27, et si vous n' avez aucun Field attribué à la colonne 0 (moi je fais ça pour montrer une icone dans la 1ere colonne selon certains parametres pour chaque record), ça va foiré dans le fichier Ini. N' utiliser pas non plus le caractere 'Enter'. Sinon, c' est du tout bon.

Ps: On put aussi laisser l' utilisateur changer le caption des titres etc ... bref, regardez la fontion pour plus de détailles :-)
Rejoignez-nous