Вопрос how to create the Drive selection like the image below,

ffmla

Участник
Hi guys
Please take a look,

How to create the Drive selection button (Alternative to DirEdit Browse button) like the image posted ..

if you guys have a time,help with some examples.
Thanking you,
 
Последнее редактирование:

sergey3695

Ветеран
Модератор
ffmla,
Код:
[Setup]
AppName=Example
AppVerName=Example 1.0
DefaultDirName={pf}\Example
OutputDir=.

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
    DRIVE_NO_ROOT_DIR = 1;
    DRIVE_FIXED = 3;
var
    cbDrive: TComboBox;

function GetLogicalDrives: DWORD; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: string): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';

procedure cbDriveOnClick(Sender: TObject);
var
    DirValue: string;
begin
    DirValue := WizardDirValue;
    StringChangeEx(DirValue, AddBackslash(ExtractFileDrive(DirValue)), cbDrive.Items[cbDrive.ItemIndex], True);
    WizardForm.DirEdit.Text := DirValue;
end;

procedure DirEditOnChange(Sender: TObject);
var
    i: Integer;
begin
    for i := 0 to cbDrive.Items.Count - 1 do
    begin
        if CompareText(cbDrive.Items[i], AddBackslash(ExtractFileDrive(WizardDirValue))) = 0 then
        begin
            cbDrive.ItemIndex := i;
            Break;
        end;
    end;
end;

procedure FillCombo;
var
    dwDrives: DWORD;
    uDriveType: UINT;
    szDriveLetter: string;
    i: Integer;
begin
    dwDrives := GetLogicalDrives;
    for i := 2 to 25 do if dwDrives and (1 shl i) <> 0 then
    begin
        szDriveLetter := Chr(Ord('A') + i) + ':\';
        uDriveType := GetDriveType(szDriveLetter);
        case uDriveType of
            DRIVE_FIXED:
                begin
                    cbDrive.Items.Add(szDriveLetter);
                    if CompareText(cbDrive.Items[cbDrive.Items.Count - 1], AddBackslash(ExtractFileDrive(WizardDirValue))) = 0 then
                        cbDrive.ItemIndex := cbDrive.Items.Count - 1;
                end;
            DRIVE_NO_ROOT_DIR: Continue;
        end;
    end;
end;

procedure InitializeWizard;
begin
    WizardForm.DirEdit.Left:= WizardForm.DirEdit.Left + ScaleX(50);
    WizardForm.DirEdit.Width:= WizardForm.DirEdit.Width - ScaleX(50);
    WizardForm.DirEdit.OnChange := @DirEditOnChange;
    cbDrive := TComboBox.Create(WizardForm.SelectDirPage);
    with cbDrive do
    begin
        Parent := WizardForm.DirEdit.Parent;
        Top := WizardForm.DirEdit.Top;
        Width := ScaleX(40);
        Height := WizardForm.DirEdit.Height;
        Style := csDropDownList;
        OnClick := @cbDriveOnClick;
        FillCombo;
    end;
end;
 
Сверху