Конференция "Компоненты" » Help! Как создать диалог выбора папки на основе TCommonDialog? [D6, D7, WinXP]
 
  • SkySpeed (28.05.07 22:51) [0]
    Собственно, сабж...

    Нужно создать диалог выбора папки, который будет наследовать свойства класса TCommonDialog

    Только как создать?.. не догоню...

    Заранее спасибо за помощь!
  • Сергей М. © (29.05.07 11:48) [1]

    > как создать?


    По образу и подобию, например, TOpenDialog - он тоже наследник TCommonDialog
  • SkySpeed (29.05.07 21:19) [2]

    > Сергей М. ©   (29.05.07 11:48) [1]
    >
    > > как создать?
    >
    >
    > По образу и подобию, например, TOpenDialog - он тоже наследник
    > TCommonDialog

    Спасибо за подсказку, но есть несколько но:
    - метод Execute использует функцию из "comdlg32.dll", функцию для вызова директории не нашёл
    - как "внедрить" просмотрщик директории в диалог? И что имеенно внедрять?...
    - как получить Handle созданного диалога и управлять им?

    Это главные возникшие вопросы
  • Юрий Зотов © (29.05.07 21:47) [3]
    > SkySpeed   (29.05.07 21:19) [2]

    Зачем все это? В Execute вызываете SelectDirectory - и никаких проблем.

    Кроме одной - непонятно, зачем вообще нужен компонент, который полностью заменяется одной строчкой кода?
  • SkySpeed (29.05.07 22:49) [4]

    > Юрий Зотов ©   (29.05.07 21:47) [3]
    > > SkySpeed   (29.05.07 21:19) [2]
    >
    > Зачем все это? В Execute вызываете SelectDirectory - и никаких
    > проблем.
    >
    > Кроме одной - непонятно, зачем вообще нужен компонент, который
    > полностью заменяется одной строчкой кода?

    Преподователя спросите! :-D

    Препод задал нам лабу, суть которой в создании своего диалогового окна, родителем которого будет TCommonDialog. Данное диалоговое окно должно выполнять функцию выбора директории
  • Сергей М. © (30.05.07 09:08) [5]

    > диалогового окна, родителем которого будет TCommonDialog


    TCommonDialog - это не окно.

    Возьми за образец для изучения, например, компонент TElFolderDialog из состава ElDos Visual Component Library. Он реализован в точности так как звучит задание твоего препода.
  • SkySpeed (02.06.07 21:47) [6]
    Что не окно - согласен, на метод SelectDirectory он согласился :-)
  • SkySpeed (02.06.07 21:47) [7]
    Что не окно - согласен, на метод SelectDirectory он согласился :-)
  • DVM © (02.06.07 22:50) [8]

    > SkySpeed

    На сайте Rouse есть такой компонент - его разработки.
  • DVM © (02.06.07 22:55) [9]
  • SkySpeed (03.06.07 14:11) [10]
    Да уж... код компонента не хилый.............

    Вот мой код компонента с
    SelectDirectory

    :


    unit DirectoryDialog;

    interface

    uses
     SysUtils, Classes, Dialogs, FileCtrl;

    type
     TDirectoryDialog = class(TCommonDialog)
     private
       { Private declarations }
       FInitialDir: string;
       FTitle: string;
       FSelectDir:String;
       FCleanUp:Boolean;
       procedure SetInitialDir(const Value: string);
     protected
       { Protected declarations }
     public
       { Public declarations }
       constructor Create(AOwner: TComponent); override;
       destructor Destroy; override;
       function Execute: Boolean; override;
       property SelectedDir:string read FSelectDir write FSelectDir;
     published
       { Published declarations }
       property InitialDir: string read FInitialDir write SetInitialDir;
       property Title: string read FTitle write FTitle;
       property CleanUpLastFolder:Boolean read FCleanUp write FCleanUp;
     end;

    procedure Register;

    implementation

    constructor TDirectoryDialog.Create(AOwner: TComponent);
    begin
     inherited Create(AOwner);
     Title:='Быберите директорию...';
    end;

    destructor TDirectoryDialog.Destroy;
    begin
     inherited Destroy;
    end;

    function TDirectoryDialog.Execute: Boolean;
    begin
    if CleanUpLastFolder then
     FSelectDir:='';
    if (InitialDir='Desktop') then
     Result:=FileCtrl.SelectDirectory(self.title,'',FSelectDir) else
     Result:=FileCtrl.SelectDirectory(self.title,InitialDir,FSelectDir);
    end;

    procedure TDirectoryDialog.SetInitialDir(const Value: string);
    var
     L: Integer;
    begin
     L := Length(Value);
     if (L > 1) and IsPathDelimiter(Value, L)
       and not IsDelimiter(':', Value, L - 1) then Dec(L);
     FInitialDir := Copy(Value, 1, L);
    end;

    procedure Register;
    begin
     RegisterComponents('Components', [TDirectoryDialog]);
    end;

    end.



    На этот код преподователь согласился :-)
  • Юрий Зотов © (03.06.07 14:56) [11]
    А я бы на его месте не согласился. Или согласился, но не больше, чем на четверку. Потому что на пятерку надо убрать деструктор и свойство SelectedDir сделать read-only.

    :о)
  • Roxane (25.11.15 02:30) [12]
    Удалено модератором
  • имя (03.09.17 15:06) [13]
    Удалено модератором
  • Тимохов Дима © (04.03.18 20:56) [14]

    > SkySpeed   (03.06.07 14:11) [10]

    Я как-то "объедки" вместо "объекты" написал в меню.
    Но твой глагол "быбирать" тоже хорош) Даже страшно подумать, как это?!?!?


    > Юрий Зотов ©   (03.06.07 14:56) [11]
    > Потому что на пятерку надо свойство SelectedDir сделать read-only.

    А смысл? Оно и на вход для SelectDirectory работает.
  • ухты © (05.03.18 10:25) [15]
    падишах уже давно того))
  • Тимохов Дима © (05.03.18 10:45) [16]

    > ухты ©   (05.03.18 10:25) [15]
    > падишах уже давно того))

    Да, на дату не посмотрел.
    Звиняй.

    Но это что же - в серию уже пошел новый глагол "быбирать". Ужас)
 
Конференция "Компоненты" » Help! Как создать диалог выбора папки на основе TCommonDialog? [D6, D7, WinXP]
Есть новые Нет новых   [119359   +8][b:0][p:0.001]