Je voudrais utiliser un index dans le dialogue d'ouverture des fichiers :

denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 - 2 nov. 2020 à 12:23
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 - 3 nov. 2020 à 14:27
Bonjour,

Je voudrais utiliser un index dans le dialogue d'ouverture des fichiers avec la fonction

GetOpenFileName() de l'API de Windows, or il existe bien une variable nommée nFilterIndex

dans la structure var open_a_file_name:CommDlg.OPENFILENAME; (j'écrit en Delphi),

cette variable est bien positionnée avec un indice correct en sortie de cette méthode mais

en entrée de procédure l'affectation de cette variable n'est pas prise en compte par ce

dialogue !

Savez vous comment faire (est ce qu'il y a un masque à positionner et lequel dans la variable Flags de cette structure par exemple simple supposition ) ?

Merci d'avance - écrit à Bourges.

2 réponses

cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
2 nov. 2020 à 14:14
Salut,
https://docs.microsoft.com/en-us/windows/win32/api/commdlg/ns-commdlg-openfilenamea
procedure TForm1.ButtonOpenClick(Sender: TObject);
var
  OpenFileName : TOpenFilename;
  MyFilter: string;
  FileName : array[0..MAX_PATH] of Char;
begin
  ZeroMemory(@OpenFileName,SizeOf(OpenFileName));
  ZeroMemory(@FileName, SizeOf(FileName));
  OpenFileName.hwndOwner := Handle;
  OpenFileName.lStructSize := SizeOf(OpenFileName);
  MyFilter :='Tous les fichiers (*.*)'#0'*.*'#0'Fichiers texte (*.txt)'#0'*.txt'#0#0;
  OpenFileName.lpstrFilter := PChar(MyFilter);//Le filtre
  OpenFileName.nFilterIndex := 2;//Numéro du filtre, ici fichiers texte
  OpenFileName.lpstrFile := @FileName;
  OpenFileName.nMaxFile := SizeOf(FileName);
  OpenFileName.lpstrInitialDir := PChar('C:\'#0);//Répertoire de recherche
  OpenFileName.lpstrTitle := PChar('Ouvrir fichiers');// Le titre de la boîte de dialogue
  OpenFileName.Flags := OFN_EXPLORER or OFN_ENABLESIZING or OFN_HIDEREADONLY or OFN_FILEMUSTEXIST;
  if GetOpenFileName(OpenFileName) then
    ShowMessage(OpenFileName.lpstrFile);
end;
@+
1
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
Modifié le 3 nov. 2020 à 05:49
J'utilise cette fonction, mais alors que l'index est bien positionné en sortie de méthode, en entré ce dialogue d'ouverture des fichiers n'affiche pas l'extension sélectionnée ? Cette fois ci je sèche et je ne sais pas pourquoi ceci n'est pas effectué correctement ! pouvez me dire ce qui ne va pas ?

function Affiche_le_dialogue_de_lecture(awindow:windows.hwnd;
  out_filename,initialdir,in_filter,in_extention:pchar;
  de_muliple_fichier:boolean; taille_receptacle:integer;
      title:pchar; var index_filtre_selected:integer):boolean;

var open_a_file_name:CommDlg.OPENFILENAME;
var pc_chemin_memoriser:wutil.pc1024;
var resultat:boolean;
begin
  try
  zeroMemory(@open_a_file_name,sizeof(open_a_file_name));
 strcopy(pc_chemin_memoriser,initialdir);
 Affiche_le_dialogue_de_lecture:=false;
 fillchar(open_a_file_name,sizeof(open_a_file_name),0);
 open_a_file_name.lStructSize:=sizeof(open_a_file_name);
 open_a_file_name.hWndOwner:=awindow;
 open_a_file_name.hInstance:=hinstance;
 open_a_file_name.lpstrFilter:=in_filter;
 open_a_file_name.lpstrCustomFilter:=nil;
 open_a_file_name.nMaxCustFilter:=0;
 open_a_file_name.nFilterIndex:=index_filtre_selected;
 open_a_file_name.lpstrFile:=out_filename; {@}
 open_a_file_name.nMaxFile:=taille_receptacle;
 open_a_file_name.lpstrFileTitle:=nil;
 open_a_file_name.nMaxFileTitle:=1024;
 open_a_file_name.lpstrInitialDir:=@pc_chemin_memoriser;
 open_a_file_name.lpstrTitle:=title;
 open_a_file_name.Flags:=OFN_EXPLORER or OFN_EXTENSIONDIFFERENT
    or OFN_ENABLESIZING or OFN_FILEMUSTEXIST or OFN_ALLOWMULTISELECT;
 if de_muliple_fichier then
  open_a_file_name.Flags:=open_a_file_name.Flags or OFN_ALLOWMULTISELECT;
 open_a_file_name.nFileOffset:=0;
 open_a_file_name.nFileExtension:=0;
 open_a_file_name.lpstrDefExt:=in_extention;
 open_a_file_name.lCustData:=0;
 open_a_file_name.lpfnHook:=nil;
 open_a_file_name.lpTemplateName:=nil;
 open_a_file_name.pvReserved:=nil;
 open_a_file_name.dwReserved:=0;

 open_a_file_name.FlagsEx:=0;
  resultat:=CommDlg.GetOpenFileName(open_a_file_name);
  if resultat then
    index_filtre_selected:=open_a_file_name.nFilterIndex;
  Affiche_le_dialogue_de_lecture:=resultat;
  except end;
  end; {affiche_le_dialogue_de_lecture}
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
Modifié le 3 nov. 2020 à 15:16
Salut,
déjà on ne sait pas si tes paramètres d'appel sont correct ?...enfin passons, j'ai repris ta fonction en mettant les paramètres à la mano, j'ai bien les bons index de la liste déroulante et le bon retour des fichiers.
function Affiche_le_dialogue_de_lecture(awindow:windows.hwnd;
  out_filename,initialdir,in_filter,in_extention:pchar;
  de_muliple_fichier:boolean; taille_receptacle:integer;
      title:pchar; var index_filtre_selected:integer):boolean;
var
  open_a_file_name:CommDlg.OPENFILENAME;
//var pc_chemin_memoriser:wutil.pc1024; C'est quoi ?
  pc_chemin_memoriser : array[0..MAX_PATH] of Char;
//var  resultat:boolean;
begin
  Result := False;
  try
    ZeroMemory(@open_a_file_name,SizeOf(open_a_file_name));
    (*Affiche_le_dialogue_de_lecture:=false;
    FillChar(open_a_file_name,sizeof(open_a_file_name),#0);*)
    FillChar(pc_chemin_memoriser, SizeOf(pc_chemin_memoriser), #0);
    StrCopy(pc_chemin_memoriser, initialdir);
    open_a_file_name.hWndOwner := awindow;
    open_a_file_name.lStructSize := SizeOf(open_a_file_name);
    open_a_file_name.hInstance := hinstance;
    open_a_file_name.lpstrFilter := in_filter;
    open_a_file_name.lpstrCustomFilter := nil;
    open_a_file_name.nMaxCustFilter := 0;
    open_a_file_name.nFilterIndex := index_filtre_selected;
    open_a_file_name.lpstrFile := out_filename; {@}
    open_a_file_name.nMaxFile := taille_receptacle;
    open_a_file_name.lpstrFileTitle := nil;
    open_a_file_name.nMaxFileTitle := 0;(*1024;*)
    open_a_file_name.lpstrInitialDir := @pc_chemin_memoriser;
    open_a_file_name.lpstrTitle:=title;
    open_a_file_name.Flags:= OFN_EXPLORER or OFN_EXTENSIONDIFFERENT
      or OFN_ENABLESIZING or OFN_FILEMUSTEXIST (*or OFN_ALLOWMULTISELECT*);
    if de_muliple_fichier then
      open_a_file_name.Flags:=open_a_file_name.Flags or OFN_ALLOWMULTISELECT;
    open_a_file_name.nFileOffset := MAX_PATH;(*0;*)
    open_a_file_name.nFileExtension := 0;
    open_a_file_name.lpstrDefExt:=in_extention;
    open_a_file_name.lCustData:=0;
    open_a_file_name.lpfnHook:=nil;
    open_a_file_name.lpTemplateName:=nil;
    open_a_file_name.pvReserved:=nil;
    open_a_file_name.dwReserved:=0;
    open_a_file_name.FlagsEx:=0;
    Result := GetOpenFileName(open_a_file_name);
    if Result then
      index_filtre_selected := open_a_file_name.nFilterIndex;
    (*resultat:=CommDlg.GetOpenFileName(open_a_file_name);
    if resultat then
      index_filtre_selected:=open_a_file_name.nFilterIndex;
    Affiche_le_dialogue_de_lecture:=resultat;*)
  except
  end;
end; {affiche_le_dialogue_de_lecture}

procedure TForm1.Button1Click(Sender: TObject);
var
  FilterIndex: Integer;
  ListFile : array[0..MAX_PATH] of Char;
begin
  FilterIndex := 2;
  FillChar(ListFile,Sizeof(ListFile), #0);
  if Affiche_le_dialogue_de_lecture(Handle, @ListFile, 'C:\'#0,'Tous les fichiers (*.*)'#0'*.*'#0'Fichiers texte (*.txt)'#0'*.txt'#0#0, 'txt', True, SizeOf(ListFile), 'Ouvrir fichier', FilterIndex) then
    ShowMessage(Format('Index filtre : %d', [FilterIndex]));
end;
@+
1
Rejoignez-nous