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

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

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

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

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

    Регистрация:
    18 июн 2011
    Сообщения:
    909
    Симпатии:
    672
    MaxPavlov, я так понял ты об этом говориш
    Код (Text):
    1. #define Name "Test"
    2.  
    3. [Setup]
    4. SourceDir=.
    5. OutputDir=Setup
    6. AppName=Test
    7. AppVerName=Test
    8. DefaultDirName={pf}\Test
    9. DefaultGroupName=Test
    10. OutputBaseFilename=Setup
    11. AllowNoIcons=true
    12.  
    13. [Languages]
    14. Name: russian; MessagesFile: compiler:Languages\Russian.isl
    15.  
    16. [Files]
    17. Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs createallsubdirs;
    18.  
    19. [Icons]
    20. Name: {group}\MyProg; Filename: {app}; WorkingDir: {app}
    21.  
    22. [CustomMessages]
    23. russian.RestoreButton=Сброс
    24.  
    25. [Code]
    26. var
    27.   BrowseForm: TSetupForm;
    28.   BrowseForm2: TSetupForm;
    29.   DirTreeView: TFolderTreeView;
    30.   DirFolderTreeView: TStartMenuFolderTreeView;
    31.   EditTreeView: TNewEdit;
    32.   EditFolderTreeView: TNewEdit;
    33.   DB_Button: TNewButton;
    34.   GB_Button: TNewButton;
    35.   OldEvent_NoIconsCheckClick: TNotifyEvent;
    36.  
    37. procedure DirTreeViewChange(Sender: TObject);
    38. begin
    39.   if DirTreeView.Directory <> WizardForm.DirEdit.Text then
    40.   EditTreeView.Text := AddBackslash(DirTreeView.Directory) + '{#Name}' else
    41.   EditTreeView.Text := DirTreeView.Directory;
    42. end;
    43.  
    44. procedure DirFolderTreeViewChange(Sender: TObject);
    45. begin
    46.   if DirFolderTreeView.Directory <> WizardForm.GroupEdit.Text then
    47.   EditFolderTreeView.Text := AddBackslash(DirFolderTreeView.Directory) + '{#Name}' else
    48.   EditFolderTreeView.Text := DirFolderTreeView.Directory;
    49. end;
    50.  
    51. procedure BrowseFormButtonsTreeViewOnClick(Sender: TObject);
    52. begin
    53.   case TButton(Sender).Tag of
    54.     1: EditTreeView.Text := RemoveBackslashUnlessRoot(ExpandConstant('{#SetupSetting("DefaultDirName")}'));
    55.  
    56.     2: begin
    57.           DirTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
    58.           EditTreeView.Text := AddBackslash(DirTreeView.Directory) + '{#Name}';
    59.         end;
    60.  
    61.     3: if EditTreeView.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := EditTreeView.Text;
    62.   end;
    63. end;
    64.  
    65. procedure BrowseFormButtonsFolderTreeViewOnClick(Sender: TObject);
    66. begin
    67.   case TButton(Sender).Tag of
    68.     4: EditFolderTreeView.Text := RemoveBackslashUnlessRoot(ExpandConstant('{#Name}'));
    69.  
    70.     5: begin
    71.           DirFolderTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
    72.           EditFolderTreeView.Text := AddBackslash(DirFolderTreeView.Directory) + '{#Name}';
    73.         end;
    74.  
    75.     6: if EditFolderTreeView.Text <> WizardForm.GroupEdit.Text then WizardForm.GroupEdit.Text := EditFolderTreeView.Text;
    76.   end;
    77. end;
    78.  
    79. procedure BrowseDirTreeViewClick(Sender: TObject);
    80. begin
    81.   BrowseForm := CreateCustomForm();
    82.   with BrowseForm do
    83.   begin
    84.     Width := ScaleX(413);
    85.     Height := ScaleY(361);
    86.     Caption := SetupMessage(msgBrowseDialogTitle);
    87.     Position := poScreenCenter;
    88.  
    89.     with TLabel.Create(nil) do
    90.     begin
    91.       SetBounds(ScaleX(12), ScaleY(12), ScaleX(207), ScaleY(16));
    92.       Caption := SetupMessage(msgBrowseDialogLabel);
    93.       Parent := BrowseForm;
    94.       Font.Size := 8;
    95.     end;
    96.  
    97.     DirTreeView := TFolderTreeView.Create(nil)
    98.     with DirTreeView do
    99.     begin
    100.       SetBounds(ScaleX(16), ScaleY(64), ScaleX(375), ScaleY(225));
    101.       OnChange := @DirTreeViewChange;
    102.       Parent := BrowseForm;
    103.     end;
    104.  
    105.     EditTreeView := TNewEdit.Create(nil);
    106.     with EditTreeView do
    107.     begin
    108.       SetBounds(ScaleX(16), ScaleY(36), ScaleX(376), ScaleY(21));
    109.       Text := DirTreeView.Directory;
    110.       Parent := BrowseForm;
    111.       Font.Color := clWindowText;
    112.     end;
    113.  
    114.     with TButton.Create(nil) do
    115.     begin
    116.       SetBounds(ScaleX(16), ScaleY(301), ScaleX(90), ScaleX(23));
    117.       Parent := BrowseForm;
    118.       Caption := SetupMessage(msgButtonCancel);
    119.       ModalResult := mrCancel;
    120.     end;
    121.  
    122.     with TButton.Create(nil) do
    123.     begin
    124.       SetBounds(ScaleX(111), ScaleY(301), ScaleX(90), ScaleY(23));
    125.       Parent := BrowseForm;
    126.       Caption := ExpandConstant('{cm:RestoreButton}');
    127.       Tag := 1;
    128.       OnClick := @BrowseFormButtonsTreeViewOnClick;
    129.     end;
    130.  
    131.     with TButton.Create(nil) do
    132.     begin
    133.       SetBounds(ScaleX(206), ScaleY(301), ScaleX(90), ScaleY(23));
    134.       Parent := BrowseForm;
    135.       Caption := SetupMessage(msgButtonNewFolder);
    136.       Tag := 2;
    137.       OnClick := @BrowseFormButtonsTreeViewOnClick;
    138.     end;
    139.  
    140.     with TButton.Create(nil) do
    141.     begin
    142.       SetBounds(ScaleX(301), ScaleY(301), ScaleX(90), ScaleY(23));
    143.       Parent := BrowseForm;
    144.       Caption := SetupMessage(msgButtonOK);
    145.       Tag := 3;
    146.       OnClick := @BrowseFormButtonsTreeViewOnClick;
    147.       ModalResult := mrOk;
    148.     end;
    149.  
    150.     DirTreeView.ChangeDirectory(AddBackslash(WizardForm.DirEdit.Text), True);
    151.     ShowModal;
    152.     Free;
    153.   end;
    154. end;
    155.  
    156. procedure BrowseDirFolderTreeViewClick(Sender: TObject);
    157. begin
    158.   BrowseForm2 := CreateCustomForm();
    159.   with BrowseForm2 do
    160.   begin
    161.     Width := ScaleX(413);
    162.     Height := ScaleY(361);
    163.     Caption := SetupMessage(msgBrowseDialogTitle);
    164.     Position := poScreenCenter;
    165.  
    166.     with TLabel.Create(nil) do
    167.     begin
    168.       SetBounds(ScaleX(12), ScaleY(12), ScaleX(207), ScaleY(16));
    169.       Caption := SetupMessage(msgBrowseDialogLabel);
    170.       Parent := BrowseForm2;
    171.       Font.Size := 8;
    172.     end;
    173.  
    174.     DirFolderTreeView := TStartMenuFolderTreeView.Create(nil)
    175.     with DirFolderTreeView do
    176.     begin
    177.       SetBounds(ScaleX(16), ScaleY(64), ScaleX(375), ScaleY(225));
    178.       SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{userstartup}'),ExpandConstant('{commonstartup}'));
    179.       OnChange := @DirFolderTreeViewChange;
    180.       Parent := BrowseForm2;
    181.     end;
    182.  
    183.     EditFolderTreeView := TNewEdit.Create(nil);
    184.     with EditFolderTreeView do
    185.     begin
    186.       SetBounds(ScaleX(16), ScaleY(36), ScaleX(376), ScaleY(21));
    187.       Text := DirFolderTreeView.Directory;
    188.       Parent := BrowseForm2;
    189.       Font.Color := clWindowText;
    190.     end;
    191.  
    192.     with TButton.Create(nil) do
    193.     begin
    194.       SetBounds(ScaleX(16), ScaleY(301), ScaleX(90), ScaleX(23));
    195.       Parent := BrowseForm2;
    196.       Caption := SetupMessage(msgButtonCancel);
    197.       ModalResult := mrCancel;
    198.     end;
    199.  
    200.     with TButton.Create(nil) do
    201.     begin
    202.       SetBounds(ScaleX(111), ScaleY(301), ScaleX(90), ScaleY(23));
    203.       Parent := BrowseForm2;
    204.       Caption := ExpandConstant('{cm:RestoreButton}');
    205.       Tag := 4;
    206.       OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
    207.     end;
    208.  
    209.     with TButton.Create(nil) do
    210.     begin
    211.       SetBounds(ScaleX(206), ScaleY(301), ScaleX(90), ScaleY(23));
    212.       Parent := BrowseForm2;
    213.       Caption := SetupMessage(msgButtonNewFolder);
    214.       Tag := 5;
    215.       OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
    216.     end;
    217.  
    218.     with TButton.Create(nil) do
    219.     begin
    220.       SetBounds(ScaleX(301), ScaleY(301), ScaleX(90), ScaleY(23));
    221.       Parent := BrowseForm2;
    222.       Caption := SetupMessage(msgButtonOK);
    223.       Tag := 6;
    224.       OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
    225.       ModalResult := mrOk;
    226.     end;
    227.  
    228.     DirFolderTreeView.ChangeDirectory(AddBackslash(WizardForm.GroupEdit.Text), True);
    229.     ShowModal;
    230.     Free;
    231.   end;
    232. end;
    233.  
    234. procedure NoIconsCheckClick(Sender: TObject);
    235. begin
    236.    OldEvent_NoIconsCheckClick(Sender);
    237.    GB_Button.Enabled := not WizardForm.NoIconsCheck.Checked;
    238. end;
    239.  
    240. procedure InitializeWizard();
    241. begin
    242.   OldEvent_NoIconsCheckClick := WizardForm.NoIconsCheck.OnClick;
    243.   WizardForm.NoIconsCheck.OnClick := @NoIconsCheckClick;
    244.  
    245.   WizardForm.DirBrowseButton.Hide;
    246.   DB_Button := TNewButton.create(WizardForm);
    247.   with DB_Button do
    248.   begin
    249.     Parent := WizardForm.SelectDirPage;
    250.     SetBounds(WizardForm.DirBrowseButton.Left, WizardForm.DirBrowseButton.Top, WizardForm.DirBrowseButton.Width, WizardForm.DirBrowseButton.Height - ScaleY(1));
    251.     Caption := SetupMessage(msgButtonBrowse);
    252.     OnClick := @BrowseDirTreeViewClick;
    253.   end;
    254.  
    255.   WizardForm.GroupBrowseButton.Hide;
    256.   GB_Button := TNewButton.create(WizardForm);
    257.   with GB_Button do
    258.   begin
    259.     Parent := WizardForm.SelectProgramGroupPage;
    260.     SetBounds(WizardForm.GroupBrowseButton.Left, WizardForm.GroupBrowseButton.Top, WizardForm.GroupBrowseButton.Width, WizardForm.GroupBrowseButton.Height - ScaleY(1));
    261.     Caption := SetupMessage(msgButtonBrowse);
    262.     OnClick := @BrowseDirFolderTreeViewClick;
    263.   end;
    264.  
    265. 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):
    1.   uses
    2. // форма со своими компонеттами treeView, поиском диска по VolumeName
    3.   Unit1 in 'Unit1.pas' {Form2};
    4.  
    5. function MyShowChangeDiskWindowEX(Text, DefaultPath, SearchFile, VolName:AnsiString):boolean;
    6. begin
    7. if (FileExists(DefaultPath+'\'+SearchFile) then begin result:=true; break; end;
    8. Form2 := TForm2.Create(Application);
    9. Form2.Show;
    10.  
    11. Form2.TextInf:=Text;
    12. Form2.DeftPath:=DefaultPath;
    13. Form2.SPath:=SearchFile;
    14. Form2.Vollname:=VolName;
    15.  
    16. while Form2.Showing do begin
    17.    if (FileExists(Form2.NewPath+'\'+SearchFile)) then begin
    18.      // здесь необходимо передать переменку Form2.NewPath обратно в инсталятор
    19.      Form2.close;
    20.      result:=true;
    21.      break;
    22.    end;
    23.   Application.ProcessMessages;
    24. end;
    25. end;
    26.  
    27. exports MyShowChangeDiskWindowEX;
    28.  
     
    Последнее редактирование: 7 июн 2016
  4. Пользователь

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

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

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

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