|
Publicité | ||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Klaus Fischer Inscription : mars 2010 Messages : 18 ![]() |
Bonsoir,
Je suis nouveau sous Delphi. Je cherche à ouvrir la boite de dialogue de sélection d'imprimante par programmation, sans utiliser l'objet PrintDialog, car je dois le faire dans une Unit sans form, pour pouvoir placer mes fonctions dans une DLL plus tard. J'ai d'abord tout fait dans une form avec PrintDialog: tout marche bien, je peux mémoriser l'imprimante par défaut actuelle, choisir mon imprimante, mémoriser l'imprimante choisie comme imprimante par défaut, restaurer l'imprimante par défaut initiale, ... Je veux tout faire maintenant dans une unit en vue de la fabrication de ma DLL. Toutes les fonctions citées ci-dessus marchent, en utilisant certains API, sans problème. Sauf un point précis: pour choisir la nouvelle imprimante, j'utilise l'API PrintDlg comme ceci: Code :
Je sais que hDeviceNames pointe sur une structure de 4 mots dont les 3 premiers contiennent des offsets dans une zone "extra" de 255 caractères suivant ces 4 mots, et le second offset doit pointer vers le début du nom long de l'imprimante sous forme d'un string terminé par un byte zéro. Je veux récupérer ce nom sous forme de pchar dans PrinterName pour pouvoir l'utiliser après, mais je n'ai pas trouvé le moyen de le faire. Je parcours les documentations, les forums et les sites d'info depuis des jours et je n'arrive pas à trouver comment faire. En fait, je ne sais pas comment suivre la chaine de pointeurs pd.hDevNames --> (wDeviceOffset) --> wExtra pour récupérer le nom en clair de l'imprimante. Toute aide d'une âme indugente envers un débutant sera la bienvenue ! Merci à Evarisnea pour l'ajout des balises "code" - c'est évidemment beaucoup plus lisible ainsi et je tiendrai compte de votre conseil. Dernière modification par KlausGunther ; 10/03/2010 à 09h10. |
||
|
|
00
|
|
|
#2 |
|
Membre régulier
![]() Inscription : mai 2003 Messages : 119 ![]() |
Salut,
Tu fais F1 sur le nom du composant ou l'objet, en l'occurence TPrintDlg et tu tombes dans l'aide et là, tu trouveras le nom de l'unité. |
|
|
00
|
|
|
#3 |
![]() ![]() Développeur informatique Inscription : mars 2005 Messages : 4 665 ![]() |
Pour le composant PrintDialog tu as deux possibilité assez simple :
- Avoir un Datamodule dasn ton programme et poser le composants dedans - Créer dynamiquement le PrintDialog (qui ne nécessite pas obligatoirement une form pour l'utiliser)
__________________
Modérateur Delphi Combattez la brute Aucune réponse aux sollicitations techniques par MP Le guide du bon forumeur :
[Projet en cours] Des unités pour faciliter l'utilisation d'indy : EasyIndy 1.3 |
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Klaus Fischer Inscription : mars 2010 Messages : 18 ![]() |
Bonsoir,
Je vous remercie tous les deux pour vos réponses. Mais malgré mon post assez long, ma question n'a peut-être pas été assez précise. Je ne souhaite pas connaître le nom au niveau du développement. Ce que je cherche, c'est en cours d'exécution, le nom long de l'imprimante que l'utilisateur a chosi par l'API PrintDlg qui ouvre la boite de dialogue de configuration d'imprimante, tel que je le fais dans mon programme ci-dessus. Je ne peux pas non plus utiliser ceci: Code :
printer.GetPrinter(FDevice,FDriver,FPort,FHandle); en utilisant la structure Pd retourné par l'appel PrintDlg. |
|
|
00
|
|
|
#5 | |||
|
Membre chevronné
![]() ![]() Inscription : mai 2003 Messages : 567 ![]() |
Citation:
et non vers un pchar. On ne peut donc pas faire directement PrinterName := globallock(pd.hDevNames); Code :
Attention de faire le GlobalUnlock seulement lorsqu'on a terminé avec le nom du printer....
__________________
Comment dupliquer un disque...ça vous intéresse? Tutoriel et code source delphi ici |
|||
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Klaus Fischer Inscription : mars 2010 Messages : 18 ![]() |
OK, tu confirmes mon diagnostic. Alors, la vraie question: comment faire pour récupérer string représentant le nom de l'imprimante dans ma variable PrinterName: pchar; ? Car j'avais bien diagnistiqué tout cela, j'ai trouvé les structures, mais je ne sais pas comment récupérer ce string.
D'accord, je veillerai à l'emplacement du GlobalUnlock - j'en étais pas là... Merci de ton aide ! |
|
|
00
|
|
|
#7 |
|
Membre chevronné
![]() ![]() Inscription : mai 2003 Messages : 567 ![]() |
Et bien le code que j'ai mis dans mon post précédent le fait non?
__________________
Comment dupliquer un disque...ça vous intéresse? Tutoriel et code source delphi ici |
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Klaus Fischer Inscription : mars 2010 Messages : 18 ![]() |
Désolé, j'ai sûrement un problème pour me servir du forum, mais je ne vois pas du tout la solution permettant de récupérer le nom de l'imprimante à partir du pointeur pd.hdevicenames. Cela doit être possible mais je suis trop novice en delphi pour trouver.
J'ai essayé toutes sortes de constructions avec des "^", des globallock() pour récupérer des pointeurs, etc; je n'arrive pas non plus à additionner le décalage wDeviceOffset à mon pointeur pour pointer au bon endroit dans wExtra (qui se trouve 4 mots après le début de la structure DevNames pointée par hDeviceNames), etc. Ce que j'aimerais trouver, c'est une instruction "verbalisée" comme suit: PrinterName (en type pchar) := chaine de caractères à partir de (pd.hdecivenames + (pd.hdevicenames+2)) jusqu'au caractère <00> exclu Je sais, ça paraît peu "programmeur" mais j'espère que le sens de mon problème est perceptible. En assembleur,je saurais comment faire mais je ne veux pas mélanger l'assembleur à mon code Delphi; en VisualBasic aussi, je saurais le faire, en Fortran aussi, etc, maisje ne sais pas le faire en Delphi que je pratique depuis 5 jours. |
|
|
00
|
|
|
#9 |
|
Membre chevronné
![]() ![]() Inscription : mai 2003 Messages : 567 ![]() |
DevNameStruct := GlobalLock(pd.hDevNames);
PrinterName := PChar(integer(DevNameStruct) + DevNameStruct.wDeviceOffset);
__________________
Comment dupliquer un disque...ça vous intéresse? Tutoriel et code source delphi ici |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Klaus Fischer Inscription : mars 2010 Messages : 18 ![]() |
Ouah, tu as tiré plus vite que ton ombre ! J'ai vu ton dernier message après avoir posté le mien ! Je vais essayer de suite. Merci beaucoup !
|
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Klaus Fischer Inscription : mars 2010 Messages : 18 ![]() |
Bon, j'ai essayé. Le compilateur n'aime pas.
Il faut sûrement définir DevNameStruct. J'avais l'impression que c'était un pointeur: DevNameStruct: Pointer: mais le compilateur rejette la ligne Code :
PrinterName := PChar(integer(DevNameStruct) + DevNameStruct.|wDeviceOffset); avec le message Code :
[Erreur] Test_Printer_Unit1_.pas(39): Type Record, Object ou Class requis Edit: j'ai modifié mon texte pour mettre la ligne en cause en entier, en marquant l'endroit du curseur (donc certainement de l'erreur). Dernière modification par KlausGunther ; 10/03/2010 à 22h08. |
|
|
00
|
|
|
#12 | |||
|
Membre chevronné
![]() ![]() Inscription : mai 2003 Messages : 567 ![]() |
Citation:
DevNameStruct: PDevNames; Ici ta fonction SelectDefaultPrinter toute Fonctionnelle.... Comme dans le post précédent #5! Je comprend pas pourquoi tu ne "copier/coller" pas la fonction dans ton code? Code :
__________________
Comment dupliquer un disque...ça vous intéresse? Tutoriel et code source delphi ici |
|||
|
|
00
|
|
|
#13 | ||
|
Invité de passage
![]() Klaus Fischer Inscription : mars 2010 Messages : 18 ![]() |
MILLE MERCI !
Je n'avais pas vu la ligne Code :
DevNameStruct: PDevNames; //**** Ajout ici *****
Code :
PrinterName := PChar(integer(DevNameStruct) + DevNameStruct.wDeviceOffset); Voici ma routine opérationnelle: Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com