OVH Cloud OVH Cloud

Nom de fichier pas complet.

7 réponses
Avatar
Mickael Pointier
Salut.

J'ai une petite application qui effectue des transferts de fichier entre
un réseau et un répertoire local, et qui affiche divers information dans
une boite de dialogue, dont le nom du fichier et le repertoire en cours.

Forcément, les utilisateurs adorent faire des arborescences de 3
kilomètres de long, donc ce qui devait arriver est arrivé: les noms de
répertoires sont tronqués, donc ils ne peuvent pas voir la fin.

Ce que j'aimerai, c'est trouver un moyen de pouvoir afficher le début et
la fin du chemin, avec "..." au milieu, dès que cela dépasse la taille
que j'ai alloué à ma chaine de caractère (un bête STATIC TEXT posé avec
l'éditeur de Visual 6 dans ma dialog box).

Donc disons que si j'ai mon nom de fichier qui est:

"C:\mon répertoire\un autre\encore un autre\le fichier.txt"

A l'heure actuelle j'obtient ca:

"C:\mon répertoire\un autre\encore un au"

Alors qu'avoir ca m'arrangerait bien:

"C:\mon répertoi...autre\le fichier.txt"

Auriez vous une suggestion ?
Merci d'avance !

Mike

7 réponses

Avatar
Cyrille \cns\ Szymanski
> Ce que j'aimerai, c'est trouver un moyen de pouvoir afficher le début et
la fin du chemin, avec "..." au milieu, dès que cela dépasse la taille
que j'ai alloué à ma chaine de caractère (un bête STATIC TEXT posé avec
l'éditeur de Visual 6 dans ma dialog box).



Le gros problème est que les polices ne sont pas mono-espacement ce qui
rend ce genre de calcul laborieux. Tu peux t'en tirer assez facilement si
tu places ta limite en "nombre de caractères" et pas en "taille dans la
textbox" mais quelquesfois le résultat ne sera pas élégant.

Disons que tu peux afficher au maximum n caractères. Alors tout ce que tu
as à faire c'est construire une chaîne composée des (n-3)/2 caractères du
début, puis des trois points, puis des (n-3)/2 derniers.Tu peux raffiner en
faisant l'hypothèse que "..." occupe autant d'espace que 1 caractère (en
moyenne) auquel cas tu tronques à (n-1)/2.

Ensuite il faudrait faire attention à ne tronquer le nom de fichier que si
réellement nécessaire et des tas d'autres choses mais ça devient vite
compliqué.

a+
--
_|_|_| CnS
_|_| for(n=0;b;n++)
_| b&=b-1; /*pp.47 K&R*/
Avatar
Christian ASTOR
Mickael Pointier wrote:


Donc disons que si j'ai mon nom de fichier qui est:

"C:mon répertoireun autreencore un autrele fichier.txt"

A l'heure actuelle j'obtient ca:

"C:mon répertoireun autreencore un au"

Alors qu'avoir ca m'arrangerait bien:

"C:mon répertoi...autrele fichier.txt"

Auriez vous une suggestion ?



PathCompactPath(Ex)()
Avatar
Michaël Monerau
Cyrille "cns" Szymanski wrote:
Ce que j'aimerai, c'est trouver un moyen de pouvoir afficher le
début et la fin du chemin, avec "..." au milieu, dès que cela
dépasse la taille que j'ai alloué à ma chaine de caractère (un bête
STATIC TEXT posé avec l'éditeur de Visual 6 dans ma dialog box).



Le gros problème est que les polices ne sont pas mono-espacement ce
qui rend ce genre de calcul laborieux. Tu peux t'en tirer assez
facilement si tu places ta limite en "nombre de caractères" et pas en
"taille dans la textbox" mais quelquesfois le résultat ne sera pas
élégant.



Il y a une fonction GetWindowExtent (ou quelque chose dans le genre... je
sais plus exactement le nom, mais il m'avait paru pas en relation avec son
utilité) qui permet de calculer la taille d'un texte selon la font utilisée.
Tu pourrais t'en servir avec la taille de ton contrôle (GetWindowRect).

Ensuite, un petit calcul comme l'a dit Cyrille donne combien de caractères
il faut prendre (une boucle pour voir quand est-ce que ça dépasse taille_x/2
pour les deux parties ?). Tu rajoutes les trois points au milieu, et le tour
me semble joué.

Mais bon, le calcul ne doit pas être évident :)

Bonne chance !
--
<=- Michaël "Cortex" Monerau -=>
Avatar
Vincent Burel
"Christian ASTOR" wrote in message
news:
Mickael Pointier wrote:

>
> Donc disons que si j'ai mon nom de fichier qui est:
>
> "C:mon répertoireun autreencore un autrele fichier.txt"
>
> A l'heure actuelle j'obtient ca:
>
> "C:mon répertoireun autreencore un au"
>
> Alors qu'avoir ca m'arrangerait bien:
>
> "C:mon répertoi...autrele fichier.txt"
>
> Auriez vous une suggestion ?

PathCompactPath(Ex)()



et aussi le style PATHELLIPSIS qui est de plus en plus disponible dans les
control Windows... à partir de W2000 pour les control STATIC TEXT. A noter
que le flag DT_PATH_ELLIPSIS pour la fonction DrawText est dispo depuis W95
il me semble... (Juste pour rappeler qu'on peut afficher du text sans
utiliser de control HWND aussi...)

A+
Vincent Burel
Avatar
Arnold McDonald \(AMcD\)
Vincent Burel wrote:

(Juste pour rappeler qu'on peut
afficher du text sans utiliser de control HWND aussi...)



Oui, enfin, faut un DC quand même :o)

--
AMcD - http://arnold.mcdonald.free.fr/

"Bon alors j'vous rappelle les règles : vous pouvez pas quitter la première
base avant d'avoir vidé une bière, chaque point marqué : une bière, vous
videz une bière à la fin des tours de frappe impairs et à la quatrième
manche, tournée générale"
- ça va, ça va, on sait comment jouer au softball ! (Les Simpson - Homer la
Foudre)
Avatar
Vincent Burel
"Arnold McDonald (AMcD)" wrote in message
news:3f676b6c$0$27016$
Vincent Burel wrote:

> (Juste pour rappeler qu'on peut
> afficher du text sans utiliser de control HWND aussi...)

Oui, enfin, faut un DC quand même :o)



ben ouai... mais une DC, c'est bien aussi ! c'est même mieux qu'un HWND
(surtout sous W95/98)
:-)

VB
Avatar
Mickael Pointier
>>> Alors qu'avoir ca m'arrangerait bien:

"C:mon répertoi...autrele fichier.txt"

Auriez vous une suggestion ?



PathCompactPath(Ex)()



et aussi le style PATHELLIPSIS qui est de plus en plus disponible
dans les control Windows... à partir de W2000 pour les control STATIC
TEXT. A noter que le flag DT_PATH_ELLIPSIS pour la fonction DrawText
est dispo depuis W95 il me semble... (Juste pour rappeler qu'on peut
afficher du text sans utiliser de control HWND aussi...)




Bon, finalement en partant de ce que tu m'a donné j'ai finalement trouvé
ca:

========================= void PathSetDlgItemPath(
HWND hDlg,
int id,
LPCSTR pszPath,
);

Sets the text of a child control in a window or dialog box,
using PathCompactPath to make sure the path fits in the control.
=========================
Elle est belle cette fonction, simple à utiliser, et elle marche bien
:)))
Rhaaaa lovely !

Merci beaucoup, ca m'a bien mis sur la bonne voie !

Mike