GetOpenFileName // TOpenFileName

GetOpenFileName // TOpenFileName - Delphi/Pascal - Programmation

Marsh Posté le 24-03-2005 à 18:55:43    

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
Reply

Marsh Posté le 24-03-2005 à 18:55:43   

Reply

Marsh Posté le 24-03-2005 à 19:12:15    

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
Reply

Marsh Posté le 24-03-2005 à 20:14:31    

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

Reply

Marsh Posté le 24-03-2005 à 20:27:07    

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]

Reply

Marsh Posté le 24-03-2005 à 21:06:42    

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
Reply

Marsh Posté le 24-03-2005 à 22:20:02    

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 :'(

Reply

Marsh Posté le 24-03-2005 à 22:30:46    

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
Reply

Marsh Posté le 25-03-2005 à 12:21:57    

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:

Reply

Marsh Posté le 25-03-2005 à 12:51:21    

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 25-03-2005 à 12:54:06    

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 ?

Reply

Marsh Posté le 25-03-2005 à 12:54:06   

Reply

Marsh Posté le 25-03-2005 à 12:56:13    

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
Reply

Marsh Posté le 25-03-2005 à 13:07:41    

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 :|

Reply

Marsh Posté le 25-03-2005 à 13:10:22    

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 25-03-2005 à 13:13:03    

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
Reply

Marsh Posté le 25-03-2005 à 13:18:15    

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
Reply

Marsh Posté le 25-03-2005 à 13:23:27    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed