Sélectionner un fichier ou un dossier dans la même boîte de dialogue

Sélectionner un fichier ou un dossier dans la même boîte de dialogue - Delphi/Pascal - Programmation

Marsh Posté le 27-08-2008 à 22:52:43    

Bonjour,
 
Je cherche à afficher une boîte de dialogue qui puisse permettre de choisir soit un fichier, soit un dossier. Quelque chose dans le genre de la boîte de raccourcis Windows :
 
http://www.3dna.net/support/help/images/changelink.jpg
 
Est-ce que c'est faisable en Delphi, et si oui quelle fonction appeler ?
 
Laurent

Reply

Marsh Posté le 27-08-2008 à 22:52:43   

Reply

Marsh Posté le 28-08-2008 à 13:46:47    

Onglet dialogue : tu as des composants de ce genre.  
OpenDialog pour ouvrir, SaveDialog pour enregistrer.
Pour les utiliser tu places simplement un des compos sur ton formulaire. Le nom du fichier/dir selectionné après avoir cliqué sur OK est stocké dans la propriété FileName du Dialog.
Généralement on les utilise de la façon suivante :
 
if OpenDialog1.Execute then toto.loadfromfile(OpenDialog1.FileName);
 
 
 

Reply

Marsh Posté le 28-08-2008 à 20:42:07    

Merci, mais tu fais comment pour sélectionner un dossier avec TOpenDialog ? J'ai essayé un peu toutes les options mais je n'ai rien trouvé. Si tu as une idée...


Message édité par konglihong le 28-08-2008 à 21:42:29
Reply

Marsh Posté le 29-08-2008 à 10:23:32    

pour les dossiers:

Code :
  1. function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload;
  2. function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string; Options: TSelectDirExtOpts = [sdNewUI]; Parent: TWinControl = nil): Boolean; overload;


 
exemple:

Code :
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   ActualDir: String;
  4. begin
  5.   ActualDir := 'C:\';
  6.   if SelectDirectory('blablablaaaaaa', '', ActualDir) then
  7.   begin
  8.     showmessage('dossier selectionné: ' + ActualDir);
  9.   end;
  10. end;


Message édité par ouiouioui10 le 29-08-2008 à 10:30:14
Reply

Marsh Posté le 29-08-2008 à 12:45:09    

Oui mais ce que je cherche à faire c'est permettre de sélectionner un fichier et/ou un dossier depuis la même boite de dialogue. C'est à dire comme dans la capture d'écran ci-dessus. Il me semble l'avoir fait il y a quelques années mais je ne me rappelle plus comment.
 
Je suppose que s'il n'y a pas de componsant pour le faire ça doit être une fonction de l'API Win32, mais je ne trouve pas. Si quelqu'un pouvait me pointer dans la bonne direction...

Reply

Marsh Posté le 29-08-2008 à 13:42:07    

Ah ué on ne peut pas select un dossier avec l'opendialog... J'ai pas de réponse désolé :D

Reply

Marsh Posté le 30-08-2008 à 01:11:26    

Pas de soucis, j'ai l'impression que c'est pas très commun comme boite de dialogue :D J'ai juste trouvé cet exemple mais c'est en C :(  
 
Sinon est-ce que c'est faisable de customiser ces boites pour les faire accepter des fichiers ou dossiers ? Quelqu'un a une idée ?

Reply

Marsh Posté le 01-09-2008 à 16:37:42    

Pas d'autres suggestions ? Tout le monde est passé à .NET ou quoi ? :D

Reply

Marsh Posté le 01-09-2008 à 17:34:59    

J'en aurais bien une, tu crées toi meme un formulaire à ton projet qui va servir de fenetre modale comme un opendialog. Dedans tu rajoutes,
DirectoryListBox, FileListBox, DriveComboBox. Tu les relies par les bonnes propriétés qui font que quand tu changes de drive, ça update ton tree..
Tu mets deux boutons et tu geres les évènements. Genre le user qui clique deux fois sur un répertoire=> return du rep. Quand la personne clique sur ok, tu regardes ce qui est select dans les boites. Si un fichier est select tu retournes le fichier sinon le rep. Tu dois pouvoir gerer aussi qui si une personne clique sur un fichier, ça deselect le dir sélectionné et si la personne change de rep, ça deselectionne les fichier. Sur l'appui de ok, tu regardes ce qui est selectionné.
 
http://img524.imageshack.us/img524/9244/graphique1rp0.jpg

Reply

Marsh Posté le 02-09-2008 à 17:56:02    

Merci je vais essayer ça. J'aurais préféré éviter de le faire "à la main", mais ça n'a pas l'air trop compliqué en utilisant les composants de Delphi.

Reply

Marsh Posté le 02-09-2008 à 17:56:02   

Reply

Marsh Posté le 04-09-2008 à 11:36:33    

j'ai trouvé sa: http://www.commentcamarche.net/tel [...] escription
mais je sais pas si il y a l'option que tu veux
 

Reply

Marsh Posté le 06-09-2008 à 00:12:09    

Finalement j'ai opté pour la solution à rengzehn, merci encore :jap: Les TDriveComboBox, TDirectoryListBox et TFileListBox simplifient grandement les choses (par contre les icones style Window 3.1 sont horribles :sweat: )
 
Voilà le code complet au-cas-où ça intéresse quelqu'un :
 
 
SelectFolderOrFileUnit.pas :
 

Code :
  1. unit SelectFolderOrFileUnit;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, FileCtrl;
  6. type
  7.   TSelectFolderOrFileForm = class(TForm)
  8.     DirectoryListBox1: TDirectoryListBox;
  9.     FileListBox1: TFileListBox;
  10.     DriveComboBox1: TDriveComboBox;
  11.     cancelButton: TButton;
  12.     selectFileButton: TButton;
  13.     selectFolderButton: TButton;
  14.     procedure DriveComboBox1Change(Sender: TObject);
  15.     procedure DirectoryListBox1Change(Sender: TObject);
  16.     procedure cancelButtonClick(Sender: TObject);
  17.     procedure selectFolderButtonClick(Sender: TObject);
  18.     procedure selectFileButtonClick(Sender: TObject);
  19.     procedure FileListBox1Change(Sender: TObject);
  20.     procedure FormCreate(Sender: TObject);
  21.     procedure FileListBox1DblClick(Sender: TObject);
  22.   private
  23.     { Private declarations }
  24.     procedure UpdateAll();
  25.   public
  26.     { Public declarations }
  27.     FilePath: String;
  28.     procedure ConfirmForm();
  29.     procedure CancelForm();
  30.   end;
  31. var
  32.   SelectFolderOrFileForm: TSelectFolderOrFileForm;
  33. implementation
  34. {$R *.dfm}
  35. procedure TSelectFolderOrFileForm.cancelButtonClick(Sender: TObject);
  36. begin
  37.   CancelForm();
  38. end;
  39. procedure TSelectFolderOrFileForm.selectFileButtonClick(Sender: TObject);
  40. begin
  41.   FilePath := FileListBox1.FileName;
  42.   ConfirmForm();
  43. end;
  44. procedure TSelectFolderOrFileForm.selectFolderButtonClick(Sender: TObject);
  45. begin
  46.   FilePath := DirectoryListBox1.Directory;
  47.   ConfirmForm();
  48. end;
  49. procedure TSelectFolderOrFileForm.CancelForm;
  50. begin
  51.   ModalResult := mrCancel;
  52. end;
  53. procedure TSelectFolderOrFileForm.ConfirmForm;
  54. begin
  55.   ModalResult := mrOK;
  56. end;
  57. procedure TSelectFolderOrFileForm.DirectoryListBox1Change(Sender: TObject);
  58. begin
  59.   UpdateAll();
  60. end;
  61. procedure TSelectFolderOrFileForm.DriveComboBox1Change(Sender: TObject);
  62. begin
  63.   UpdateAll();
  64. end;
  65. procedure TSelectFolderOrFileForm.FileListBox1Change(Sender: TObject);
  66. begin
  67.   UpdateAll();
  68. end;
  69. procedure TSelectFolderOrFileForm.FileListBox1DblClick(Sender: TObject);
  70. begin
  71.   FilePath := FileListBox1.FileName;
  72.   ConfirmForm();
  73. end;
  74. procedure TSelectFolderOrFileForm.FormCreate(Sender: TObject);
  75. begin
  76.   UpdateAll();
  77. end;
  78. procedure TSelectFolderOrFileForm.UpdateAll;
  79. begin
  80.   try
  81.     DirectoryListBox1.Drive := DriveComboBox1.Drive;
  82.     FileListBox1.Directory := DirectoryListBox1.Directory;
  83.   except
  84.     on e: Exception do ;
  85.   end;
  86.   selectFolderButton.Enabled := DirectoryListBox1.Directory <> '';
  87.   selectFileButton.Enabled := FileListBox1.FileName <> '';
  88. end;
  89. end.


 
SelectFolderOrFileUnit.dfm :
 

Code :
  1. object SelectFolderOrFileForm: TSelectFolderOrFileForm
  2.   Left = 0
  3.   Top = 0
  4.   BorderStyle = bsDialog
  5.   Caption = 'SelectFolderOrFileForm'
  6.   ClientHeight = 272
  7.   ClientWidth = 451
  8.   Color = clBtnFace
  9.   Font.Charset = DEFAULT_CHARSET
  10.   Font.Color = clWindowText
  11.   Font.Height = -11
  12.   Font.Name = 'Tahoma'
  13.   Font.Style = []
  14.   OldCreateOrder = False
  15.   OnCreate = FormCreate
  16.   PixelsPerInch = 96
  17.   TextHeight = 13
  18.   object DirectoryListBox1: TDirectoryListBox
  19.     Left = 16
  20.     Top = 40
  21.     Width = 209
  22.     Height = 177
  23.     ItemHeight = 16
  24.     TabOrder = 0
  25.     OnChange = DirectoryListBox1Change
  26.   end
  27.   object FileListBox1: TFileListBox
  28.     Left = 231
  29.     Top = 16
  30.     Width = 202
  31.     Height = 201
  32.     ItemHeight = 16
  33.     ShowGlyphs = True
  34.     TabOrder = 1
  35.     OnChange = FileListBox1Change
  36.     OnDblClick = FileListBox1DblClick
  37.   end
  38.   object DriveComboBox1: TDriveComboBox
  39.     Left = 16
  40.     Top = 15
  41.     Width = 209
  42.     Height = 19
  43.     TabOrder = 2
  44.     OnChange = DriveComboBox1Change
  45.   end
  46.   object cancelButton: TButton
  47.     Left = 333
  48.     Top = 232
  49.     Width = 100
  50.     Height = 25
  51.     Caption = 'Cancel'
  52.     TabOrder = 3
  53.     OnClick = cancelButtonClick
  54.   end
  55.   object selectFileButton: TButton
  56.     Left = 229
  57.     Top = 232
  58.     Width = 100
  59.     Height = 25
  60.     Caption = 'Select file'
  61.     TabOrder = 4
  62.     OnClick = selectFileButtonClick
  63.   end
  64.   object selectFolderButton: TButton
  65.     Left = 124
  66.     Top = 232
  67.     Width = 100
  68.     Height = 25
  69.     Caption = 'Select folder'
  70.     TabOrder = 5
  71.     OnClick = selectFolderButtonClick
  72.   end
  73. end


Message édité par laurent22300 le 06-09-2008 à 00:12:43
Reply

Marsh Posté le 10-09-2008 à 10:33:04    

Merci, rajoute [Réglé] dans le titre de ton sujet ;)

Reply

Sujets relatifs:

Leave a Replay

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