1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

как вернуть переменную в {src}

Тема в разделе "Delphi", создана пользователем MaxPavlov, 7 июн 2016.

  1. Пользователь

    Регистрация:
    31 май 2016
    Сообщения:
    7
    Симпатии:
    0
    Пол:
    Мужской
    Доброго время суток. Делаю кастомный выбор диска (со своим опн диалогом и привязкой к имени диска). Иду по пути зашитого окна в DLL аналога функции ShowChangeDiskWindow (isdone.dll). Вопрос в том, как вернуть измененный путь обратно в переменную инсталятора {src}.
     
  2. Ветеран Проверенный

    Регистрация:
    18 июн 2011
    Сообщения:
    876
    Симпатии:
    641
    MaxPavlov, я так понял ты об этом говориш
    Код (Text):
    #define Name "Test"

    [Setup]
    SourceDir=.
    OutputDir=Setup
    AppName=Test
    AppVerName=Test
    DefaultDirName={pf}\Test
    DefaultGroupName=Test
    OutputBaseFilename=Setup
    AllowNoIcons=true

    [Languages]
    Name: russian; MessagesFile: compiler:Languages\Russian.isl

    [Files]
    Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs createallsubdirs;

    [Icons]
    Name: {group}\MyProg; Filename: {app}; WorkingDir: {app}

    [CustomMessages]
    russian.RestoreButton=Сброс

    [Code]
    var
      BrowseForm: TSetupForm;
      BrowseForm2: TSetupForm;
      DirTreeView: TFolderTreeView;
      DirFolderTreeView: TStartMenuFolderTreeView;
      EditTreeView: TNewEdit;
      EditFolderTreeView: TNewEdit;
      DB_Button: TNewButton;
      GB_Button: TNewButton;
      OldEvent_NoIconsCheckClick: TNotifyEvent;

    procedure DirTreeViewChange(Sender: TObject);
    begin
      if DirTreeView.Directory <> WizardForm.DirEdit.Text then
      EditTreeView.Text := AddBackslash(DirTreeView.Directory) + '{#Name}' else
      EditTreeView.Text := DirTreeView.Directory;
    end;

    procedure DirFolderTreeViewChange(Sender: TObject);
    begin
      if DirFolderTreeView.Directory <> WizardForm.GroupEdit.Text then
      EditFolderTreeView.Text := AddBackslash(DirFolderTreeView.Directory) + '{#Name}' else
      EditFolderTreeView.Text := DirFolderTreeView.Directory;
    end;

    procedure BrowseFormButtonsTreeViewOnClick(Sender: TObject);
    begin
      case TButton(Sender).Tag of
        1: EditTreeView.Text := RemoveBackslashUnlessRoot(ExpandConstant('{#SetupSetting("DefaultDirName")}'));

        2: begin
              DirTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
              EditTreeView.Text := AddBackslash(DirTreeView.Directory) + '{#Name}';
            end;

        3: if EditTreeView.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := EditTreeView.Text;
      end;
    end;

    procedure BrowseFormButtonsFolderTreeViewOnClick(Sender: TObject);
    begin
      case TButton(Sender).Tag of
        4: EditFolderTreeView.Text := RemoveBackslashUnlessRoot(ExpandConstant('{#Name}'));

        5: begin
              DirFolderTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
              EditFolderTreeView.Text := AddBackslash(DirFolderTreeView.Directory) + '{#Name}';
            end;

        6: if EditFolderTreeView.Text <> WizardForm.GroupEdit.Text then WizardForm.GroupEdit.Text := EditFolderTreeView.Text;
      end;
    end;

    procedure BrowseDirTreeViewClick(Sender: TObject);
    begin
      BrowseForm := CreateCustomForm();
      with BrowseForm do
      begin
        Width := ScaleX(413);
        Height := ScaleY(361);
        Caption := SetupMessage(msgBrowseDialogTitle);
        Position := poScreenCenter;

        with TLabel.Create(nil) do
        begin
          SetBounds(ScaleX(12), ScaleY(12), ScaleX(207), ScaleY(16));
          Caption := SetupMessage(msgBrowseDialogLabel);
          Parent := BrowseForm;
          Font.Size := 8;
        end;

        DirTreeView := TFolderTreeView.Create(nil)
        with DirTreeView do
        begin
          SetBounds(ScaleX(16), ScaleY(64), ScaleX(375), ScaleY(225));
          OnChange := @DirTreeViewChange;
          Parent := BrowseForm;
        end;

        EditTreeView := TNewEdit.Create(nil);
        with EditTreeView do
        begin
          SetBounds(ScaleX(16), ScaleY(36), ScaleX(376), ScaleY(21));
          Text := DirTreeView.Directory;
          Parent := BrowseForm;
          Font.Color := clWindowText;
        end;

        with TButton.Create(nil) do
        begin
          SetBounds(ScaleX(16), ScaleY(301), ScaleX(90), ScaleX(23));
          Parent := BrowseForm;
          Caption := SetupMessage(msgButtonCancel);
          ModalResult := mrCancel;
        end;

        with TButton.Create(nil) do
        begin
          SetBounds(ScaleX(111), ScaleY(301), ScaleX(90), ScaleY(23));
          Parent := BrowseForm;
          Caption := ExpandConstant('{cm:RestoreButton}');
          Tag := 1;
          OnClick := @BrowseFormButtonsTreeViewOnClick;
        end;

        with TButton.Create(nil) do
        begin
          SetBounds(ScaleX(206), ScaleY(301), ScaleX(90), ScaleY(23));
          Parent := BrowseForm;
          Caption := SetupMessage(msgButtonNewFolder);
          Tag := 2;
          OnClick := @BrowseFormButtonsTreeViewOnClick;
        end;

        with TButton.Create(nil) do
        begin
          SetBounds(ScaleX(301), ScaleY(301), ScaleX(90), ScaleY(23));
          Parent := BrowseForm;
          Caption := SetupMessage(msgButtonOK);
          Tag := 3;
          OnClick := @BrowseFormButtonsTreeViewOnClick;
          ModalResult := mrOk;
        end;

        DirTreeView.ChangeDirectory(AddBackslash(WizardForm.DirEdit.Text), True);
        ShowModal;
        Free;
      end;
    end;

    procedure BrowseDirFolderTreeViewClick(Sender: TObject);
    begin
      BrowseForm2 := CreateCustomForm();
      with BrowseForm2 do
      begin
        Width := ScaleX(413);
        Height := ScaleY(361);
        Caption := SetupMessage(msgBrowseDialogTitle);
        Position := poScreenCenter;

        with TLabel.Create(nil) do
        begin
          SetBounds(ScaleX(12), ScaleY(12), ScaleX(207), ScaleY(16));
          Caption := SetupMessage(msgBrowseDialogLabel);
          Parent := BrowseForm2;
          Font.Size := 8;
        end;

        DirFolderTreeView := TStartMenuFolderTreeView.Create(nil)
        with DirFolderTreeView do
        begin
          SetBounds(ScaleX(16), ScaleY(64), ScaleX(375), ScaleY(225));
          SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{userstartup}'),ExpandConstant('{commonstartup}'));
          OnChange := @DirFolderTreeViewChange;
          Parent := BrowseForm2;
        end;

        EditFolderTreeView := TNewEdit.Create(nil);
        with EditFolderTreeView do
        begin
          SetBounds(ScaleX(16), ScaleY(36), ScaleX(376), ScaleY(21));
          Text := DirFolderTreeView.Directory;
          Parent := BrowseForm2;
          Font.Color := clWindowText;
        end;

        with TButton.Create(nil) do
        begin
          SetBounds(ScaleX(16), ScaleY(301), ScaleX(90), ScaleX(23));
          Parent := BrowseForm2;
          Caption := SetupMessage(msgButtonCancel);
          ModalResult := mrCancel;
        end;

        with TButton.Create(nil) do
        begin
          SetBounds(ScaleX(111), ScaleY(301), ScaleX(90), ScaleY(23));
          Parent := BrowseForm2;
          Caption := ExpandConstant('{cm:RestoreButton}');
          Tag := 4;
          OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
        end;

        with TButton.Create(nil) do
        begin
          SetBounds(ScaleX(206), ScaleY(301), ScaleX(90), ScaleY(23));
          Parent := BrowseForm2;
          Caption := SetupMessage(msgButtonNewFolder);
          Tag := 5;
          OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
        end;

        with TButton.Create(nil) do
        begin
          SetBounds(ScaleX(301), ScaleY(301), ScaleX(90), ScaleY(23));
          Parent := BrowseForm2;
          Caption := SetupMessage(msgButtonOK);
          Tag := 6;
          OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
          ModalResult := mrOk;
        end;

        DirFolderTreeView.ChangeDirectory(AddBackslash(WizardForm.GroupEdit.Text), True);
        ShowModal;
        Free;
      end;
    end;

    procedure NoIconsCheckClick(Sender: TObject);
    begin
       OldEvent_NoIconsCheckClick(Sender);
       GB_Button.Enabled := not WizardForm.NoIconsCheck.Checked;
    end;

    procedure InitializeWizard();
    begin
      OldEvent_NoIconsCheckClick := WizardForm.NoIconsCheck.OnClick;
      WizardForm.NoIconsCheck.OnClick := @NoIconsCheckClick;

      WizardForm.DirBrowseButton.Hide;
      DB_Button := TNewButton.create(WizardForm);
      with DB_Button do
      begin
        Parent := WizardForm.SelectDirPage;
        SetBounds(WizardForm.DirBrowseButton.Left, WizardForm.DirBrowseButton.Top, WizardForm.DirBrowseButton.Width, WizardForm.DirBrowseButton.Height - ScaleY(1));
        Caption := SetupMessage(msgButtonBrowse);
        OnClick := @BrowseDirTreeViewClick;
      end;

      WizardForm.GroupBrowseButton.Hide;
      GB_Button := TNewButton.create(WizardForm);
      with GB_Button do
      begin
        Parent := WizardForm.SelectProgramGroupPage;
        SetBounds(WizardForm.GroupBrowseButton.Left, WizardForm.GroupBrowseButton.Top, WizardForm.GroupBrowseButton.Width, WizardForm.GroupBrowseButton.Height - ScaleY(1));
        Caption := SetupMessage(msgButtonBrowse);
        OnClick := @BrowseDirFolderTreeViewClick;
      end;

    end;
     
  3. Пользователь

    Регистрация:
    31 май 2016
    Сообщения:
    7
    Симпатии:
    0
    Пол:
    Мужской
    Вот об этом: (из скрипта распаковки с помощью ISDone в секции)
    if not ShowChangeDiskWindow ('Пожалуйста, вставьте первый диск и дождитесь его инициализации.', ExpandConstant('{src}'),'1.bin') then break;
    после
    if not IS7ZipExtract ( 0, 0, ExpandConstant('{src}\1.bin'), ExpandConstant('{app}\'), false, '') then break;
    однако caption:=ExpandConstant('{src}\1.bin'); показывает старый, локальный путь, а IS7ZipExtract распаковывает уже по новому пути.

    Моя форма из DLL
    Код (Text):
      uses
    // форма со своими компонеттами treeView, поиском диска по VolumeName
      Unit1 in 'Unit1.pas' {Form2};

    function MyShowChangeDiskWindowEX(Text, DefaultPath, SearchFile, VolName:AnsiString):boolean;
    begin
    if (FileExists(DefaultPath+'\'+SearchFile) then begin result:=true; break; end;
    Form2 := TForm2.Create(Application);
    Form2.Show;

    Form2.TextInf:=Text;
    Form2.DeftPath:=DefaultPath;
    Form2.SPath:=SearchFile;
    Form2.Vollname:=VolName;

    while Form2.Showing do begin
       if (FileExists(Form2.NewPath+'\'+SearchFile)) then begin
         // здесь необходимо передать переменку Form2.NewPath обратно в инсталятор
         Form2.close;
         result:=true;
         break;
       end;
      Application.ProcessMessages;
    end;
    end;

    exports MyShowChangeDiskWindowEX;
     
     
    Последнее редактирование: 7 июн 2016
  4. Пользователь

    Регистрация:
    31 май 2016
    Сообщения:
    7
    Симпатии:
    0
    Пол:
    Мужской
    вобщем передавал пути используя и указатели, и с помощью callback функции, и просто отдельной процедурой. Везде итог один и тот же. После нескольких обращений переменные терялись access violations и read error. Строки передаю в виде AnsiString. Пишу все под BD7. Самое интерестное, то что dll под управлением програмы написанной на самой BD7, работает адекватно, а при включении в инсталлятор начинает, через раз, сыпать ошибками или просто отключаться. Грешу на дельфийский менеджер памяти и на свои кривые руки. А на чем собственно писать dll чтобы было совместимо с innoSetup 5.5.1?
     
  5. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    705
    Симпатии:
    1.025
    Пол:
    Мужской
    MaxPavlov
    Покажи полный исходный код. Может чем помогу.
     
  6. Пользователь

    Регистрация:
    31 май 2016
    Сообщения:
    7
    Симпатии:
    0
    Пол:
    Мужской
    ну какой там исходный код: две формы, таймер и пара функций. СТЫДНО товарищи! Вобщем проблема с нестабильности была в использовании AnsiString. Автор ISDone кудесник, но у меня стабильно работает только на указателях PChar, что вобщем не удивительно. Борленд рекомендует использовать PChar либо ShortString 'в то время, как космические карабли...'
     

Поделиться этой страницей