Вопрос Validate Directory Path

InstallationWay

Новичок
if you enter an invalid path or empty path, the inno setup will give you this error:


Vqt8i.png
I need to create a function which do this for me, currently I'm using DirExists function, but I think it is not covering what I'm looking for.
 

Nemko

Дилетант
Модератор
InstallationWay, can intercept a button press:
Код:
#define A = (Defined UNICODE) ? "W" : "A"

[Setup]
AppName=Test
AppVername=Test
DefaultDirName={sd}\Test

[CustomMessages]
err_000=Поле ввода пути установки пустое!
err_001=Установка в корень диска запрещена!
err_002=Неверный формат пути установки!
err_003=Слишком длинный путь установки!
err_004=Недопустимые знаки в пути установки! %n / : * ? " < > |

DRIVE_ERR0=Неопределенный тип устройсва.
DRIVE_ERR1=Недопустимый путь для установки.
DRIVE_ERR2=Установка на «Съемный диск» запрещена.
DRIVE_ERR3=HDD
DRIVE_ERR4=Установка на «Удаленный диск» запрещена.
DRIVE_ERR5=Установка на «CD-ROM» запрещена.
DRIVE_ERR6=Установка на «RAM диск» запрещена.

[Code]
var
  MyNextButton: TButton;

{WinApi}
function GetDriveType(lpDisk: String): Integer; external 'GetDriveType{#A}@kernel32.dll stdcall';

procedure OnClicks(Sender: TObject);
var
  i, c: Integer;
  Path, bl: String;
  TypeDrive: Byte;
begin
  {проверка корректности пути}
  with WizardForm do
  if CurPageID = wpSelectDir then begin
    if Length(DirEdit.Text) = 0 then begin
      MsgBox(CustomMessage('err_000'), mbError, MB_OK);
      Exit;
    end;
    if Length(DirEdit.Text) <= 3 then begin
      bl:='abcdefghijklmnopqrstuvwxyz'
      if Length(DirEdit.Text) = 3 then begin
        if (DirEdit.Text[2] <> ':') or (DirEdit.Text[3] <> '\') or (Pos(Lowercase(DirEdit.Text[1]), bl) = 0)
        then MsgBox(CustomMessage('err_002'), mbError, MB_OK)
        else MsgBox(CustomMessage('err_001'), mbError, MB_OK);
      end else MsgBox(CustomMessage('err_002'), mbError, MB_OK);
      Exit;
    end;
    if Length(DirEdit.Text) >= 220 then begin
      MsgBox(CustomMessage('err_003'), mbError, MB_OK);
      Exit;
    end;
    {проверка диска}
    Path:=DirEdit.Text;
    if Length(Path) > 3 then begin
      SetLength(Path, 3);
      TypeDrive:=GetDriveType(Path);
      if TypeDrive <> 3 then begin
        MsgBox(CustomMessage('DRIVE_ERR'+IntToStr(TypeDrive)), mbError, MB_OK);
        Exit;
      end;
    end;
    {проверка на символы}
    bl:='/:*?"<>|';
    for i:=4 to Length(DirEdit.Text) do
    for c:=1 to Length(bl) do begin
      if DirEdit.Text[i] = bl[c] then begin
        MsgBox(CustomMessage('err_004'), mbError, MB_OK);
        Exit;
      end;
    end;
    {}
    NextButton.OnClick(NextButton);
  end else NextButton.OnClick(NextButton);
end;

procedure InitializeWizard;
begin
  MyNextButton:=TButton.Create(nil);
  with MyNextButton do begin
    SetBounds(WizardForm.NextButton.Left, WizardForm.NextButton.Top, WizardForm.NextButton.Width, WizardForm.NextButton.Height);
    OnClick:=@OnClicks;
    Parent:=WizardForm;
  end;
end;

procedure CurPageChanged(Page: Integer);
begin
  with WizardForm.NextButton do begin
    PostMessage(MyNextButton.Handle, $7, 0, 0); // WM_SETFOCUS
    MyNextButton.Caption:=Caption;
    Hide;
  end;
end;
 
Сверху