Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4582 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  GetOpenFileName // TOpenFileName

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

GetOpenFileName // TOpenFileName

n°1024024
Inekman
Posté le 24-03-2005 à 18:55:43  profilanswer
 

Salut les amis,
 
Je tente de me faire une petite classe pour apprendre à en faire et je souhaiterai créer une fonction Ouvrir qui affiche la boite de dialogue de Windows...bref, voilà ce que j'ai fais pour l'instant :
 

function TinkFichier.Ouvrir(Hwnd:THandle): string;
var
    ofn: TOpenFileName;
    buffer: array [0..MAX_PATH] of char;
begin
    ZeroMemory(@buffer,sizeof(buffer));
 
    ofn.lStructSize := SizeOf(TOpenFileName);
    ofn.hWndOwner := Hwnd;
    ofn.lpstrFilter := 'Marche bordel de !!!';
    ofn.nFilterIndex := 0;
    ofn.lpstrFile := buffer;
    ofn.nMaxFile := sizeof(buffer);
    ofn.lpstrInitialDir := nil;
    ofn.lpstrTitle := nil;
 
    ofn.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES;
 
    if GetOpenFileName(ofn) then
        FNom := ofn.lpstrFile;        
end;


 
voilà comment j'appel ma méthode :
 

procedure TForm1.Button1Click(Sender: TObject);
var aFichier: TinkFichier;
begin
 
    aFichier.Ouvrir(self.Handle);
 
end;


 
et voilà ce qu'il me répond le tonton :
 

---------------------------
Project1
---------------------------
Access violation at address 77E5A86B in module 'kernel32.dll'. Read of address 00463000.
---------------------------
OK    
---------------------------


 
en débuguant pas à pas, l'erreur survient à ce moment :

if GetOpenFileName(ofn) then


...j'ai dû oublier quelque chose mais ze sais pas quoi :D
 
help me :jap:


Message édité par Inekman le 24-03-2005 à 18:57:19
mood
Publicité
Posté le 24-03-2005 à 18:55:43  profilanswer
 

n°1024045
antp
Super Administrateur
Champion des excuses bidons
Posté le 24-03-2005 à 19:12:15  profilanswer
 

Je suis pas sûr que passer @buffer soit correct. Si ça marche sans le @ il ne faut pas le @.
Et ton filter est bizarre :D
 
Pourquoi tu n'utilises pas le TOpenDialog simplement ? :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1024097
Inekman
Posté le 24-03-2005 à 20:14:31  profilanswer
 

Citation :

Je suis pas sûr que passer @buffer soit correct. Si ça marche sans le @ il ne faut pas le @.


 
ça passe pas sans le @, le paramètre requis est un pointeur.
 

Citation :

Et ton filter est bizarre :D


 
vi je sais [:arg]
 

Citation :

Pourquoi tu n'utilises pas le TOpenDialog simplement ? :o


 
j'essaye de faire un truc pure Api'powa :D...je sais pas si je vais gagner quelque chose en procédant ainsi mais ce qui est sûr c'est que je vais apprendre des nouvelles structures de données et tout, c'est pas mal pour enrichir les connaissances :p

n°1024106
Inekman
Posté le 24-03-2005 à 20:27:07  profilanswer
 

Ayé j'ai trouvé les amis, j'ai eu ce problème et si d'autres le croise vous saurez quoi lui dire, je post la solution :
 

ZeroMemory(@ofn,sizeof(ofn));


 
voilà la ligne qu'il faut ajouter avant l'initialisation de ses valeurs dans l'implémentation de la fonction. Ca permet d'initialiser les propriétés de la structure et donc après c'est nikel ;)
 
En tout cas, merci Antp de m'avoir fait chercher dans ce coin là :D  
 
champion du monde [:aia]

n°1024165
antp
Super Administrateur
Champion des excuses bidons
Posté le 24-03-2005 à 21:06:42  profilanswer
 

arf j'avais cru voir que t'initialisais la structure et non le buffer :D (le nom "buffer" aurait dû me mettre sur la voie [:kiki])
en effet sans initialisation ça marche moins bien


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1024251
Inekman
Posté le 24-03-2005 à 22:20:02  profilanswer
 

maintenant y'a un autre problème copain :D
 
la structure enregistre le nom du fichier dans le buffer mais j'arrive pas à assigner la valeur du buffer dans le string de mon attribut privé FNom :'(

n°1024263
antp
Super Administrateur
Champion des excuses bidons
Posté le 24-03-2005 à 22:30:46  profilanswer
 

FNom := Buffer;
 
Ça doit marcher. Sinon en le castant en PChar peut-être.


Message édité par antp le 24-03-2005 à 22:34:00

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1024684
Inekman
Posté le 25-03-2005 à 12:21:57  profilanswer
 

arf il me dit :
 

---------------------------
Project1
---------------------------
Access violation at address 00403E16 in module 'Project1.exe'. Write of address 004280CC.
---------------------------
OK    
---------------------------


 
Pourtant ma classe n'a rien d'extraordinaire :)  
 

type
    TinkFichier = class
    private
        FNom: string;
    public
        property Nom: string read FNom write FNom;
        function Ouvrir(Hwnd: THandle): boolean;
    end;


:sweat: je vois pô du tout :cry:

n°1024707
antp
Super Administrateur
Champion des excuses bidons
Posté le 25-03-2005 à 12:51:21  profilanswer
 

Et en pas à pas c'est sur l'assignation que ça plante ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1024710
Inekman
Posté le 25-03-2005 à 12:54:06  profilanswer
 

ouai ouai il me dit "inaccessible value" quand je place le curseur sur la propriété "Nom".
 
Est-ce que je dois utiliser un accesseur ?

mood
Publicité
Posté le 25-03-2005 à 12:54:06  profilanswer
 

n°1024714
antp
Super Administrateur
Champion des excuses bidons
Posté le 25-03-2005 à 12:56:13  profilanswer
 

Non, mais désactive les optimisations dans les options du projet, pour le debug c'est plus facile, et ça évite les "inaccessible..." (il faut faire un Build All après).


Message édité par antp le 25-03-2005 à 12:56:31

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1024724
Inekman
Posté le 25-03-2005 à 13:07:41  profilanswer
 

j'ai désactivé l'optimisation mais le "inaccessible value" est toujours là lorsque je mets le curseur sur "Nom" pendant l'assignation "Nom := buffer". Avec un "Nom := PChar(buffer)" ça foire toujours autant :|

n°1024727
antp
Super Administrateur
Champion des excuses bidons
Posté le 25-03-2005 à 13:10:22  profilanswer
 

Et pour buffer, il arrive à dire ce qu'il y a dedans ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1024731
Inekman
Posté le 25-03-2005 à 13:13:03  profilanswer
 

ouai ouai, un mega tableau composé de 261 éléments qui contiennent chacun 1 caractère qui représente le chemin + le nom du fichier sélectionné dans le dialog OpenFileName ouvert 2 sec juste avant :D  
 
ps : tu veux qu'on en discute sur msn ? je te montrerai le code en entier :)


Message édité par Inekman le 25-03-2005 à 13:14:04
n°1024734
antp
Super Administrateur
Champion des excuses bidons
Posté le 25-03-2005 à 13:18:15  profilanswer
 

Ta procédure Button1Click elle est complète ? Parce qu'il faudrait peut-être créer l'objet avant d'accèder à ses propriétés :whistle: (tout le début du code n'accédant à rien, ça passe même si l'objet lui-même n'est pas créé)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1024739
Inekman
Posté le 25-03-2005 à 13:23:27  profilanswer
 

la honte [:al zheimer]
 
on réserve msn pour la prochaine couille
 
[:athome]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  GetOpenFileName // TOpenFileName

 

Sujets relatifs
[C/C++] Common Dialog Box: GetOpenFileName, aucun effet...[VC++] GetOpenFileName()
probleme avec GetOpenFileName() sous Visual C++ 
Plus de sujets relatifs à : GetOpenFileName // TOpenFileName


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)