Вопрос изменить размер окна при ошибке ISdone

audiofeel

Старожил
при ошибке распаковки ISDone или ее отмене нужно изменить размер окна WizardForm.ClientHeight:= ScaleY...... ( в низ)
примерно как в некоторых инсталляторах при нажатии на кнопку "лицензионное соглашение" размер окна как бы выходит (выплывает) снизу.
как сделать ?
и еще . как вот этот пример "прикрутить" к ISDone
Как добавить TMemo на страницу установки, в котором будут отображаться извлекаемые файлы? FAQ по Inno Setup
еще вопрос. как сделать быстрый выбор диска установки. его буквы, как на скрине ??
все, разобрался я с TMEMO и "быстрый выбор диска" пример нашел на OSZONE

#define MyAppName "Моя программа"
;#define records

[Setup]
AppName=ISDone
AppVerName=ISDone
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputDir=.
OutputBaseFilename=Setup
SolidCompression=true
DisableReadyPage=true
InternalCompressLevel=ultra64
Compression=lzma/ultra64
ExtraDiskSpaceRequired=5000000000

[Files]
Source: ISDone\unarc.dll; DestDir: {tmp}; Flags: dontcopy
Source: ISDone\ISDone.dll; DestDir: {tmp}; Flags: dontcopy
#ifdef records
Source: records.inf; DestDir: {tmp}; Flags: dontcopy
#endif
Source: ISDone\facompress.dll; DestDir: {tmp}; Flags: dontcopy

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

[UninstallDelete]
Type: filesandordirs; Name: {app}

Код:
const
  DRIVE_UNKNOWN = 0;
  DRIVE_NO_ROOT_DIR = 1;
  DRIVE_REMOVABLE = 2;
  DRIVE_FIXED = 3;
  DRIVE_REMOTE = 4;
  DRIVE_CDROM = 5;
  DRIVE_RAMDISK = 6;

var
  DiskChangesComboBox: TNewComboBox;
  DrvLetters: array of string;
  AFile: String;
  FilesMemo: TNewMemo;
  ISDonePB: TNewProgressBar;
  ISDoneCancel: integer;
  ISDoneError: boolean;

type
  TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;

function GetDriveType(lpDisk: string): integer;
  external 'GetDriveTypeA@kernel32.dll stdcall';
function GetLogicalDriveStrings(nLenDrives: LongInt; lpDrives: string): integer;
  external 'GetLogicalDriveStringsA@kernel32.dll stdcall';

function WrapCallback(callback:TCallback; paramcount:integer):longword;
  external 'wrapcallback@files:ISDone.dll stdcall delayload';
function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean;
  external 'ISArcExtract@files:ISDone.dll stdcall delayload';
function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean;
  external 'Exec2@files:ISDone.dll stdcall delayload';
function ISFindFiles(CurComponent:Cardinal; FileMask:AnsiString; var ColFiles:integer):integer;
  external 'ISFindFiles@files:ISDone.dll stdcall delayload';
function ISPickFilename(FindHandle:integer; OutPath:AnsiString; var CurIndex:integer; DeleteInFile:boolean):boolean;
  external 'ISPickFilename@files:ISDone.dll stdcall delayload';
function ISGetName(TypeStr:integer):PAnsichar;
  external 'ISGetName@files:ISDone.dll stdcall delayload';
function ISFindFree(FindHandle:integer):boolean;
  external 'ISFindFree@files:ISDone.dll stdcall delayload';
function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean;
  external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean;
  external 'ISDoneStop@files:ISDone.dll stdcall';
function SuspendProc:boolean;
  external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean;
  external 'ResumeProc@files:ISDone.dll stdcall';
//////////////////////////////////////////////////////////////////////////////////////////
function DriveTypeString(dtype: integer): string;
begin
  case dtype of
    DRIVE_NO_ROOT_DIR:;
    DRIVE_REMOVABLE:;
    DRIVE_FIXED:;
    DRIVE_REMOTE:;
    DRIVE_CDROM:;
    DRIVE_RAMDISK:;
  end;
end;

procedure DiskChangesComboBoxOnClick(Sender: TObject);
begin
  WizardForm.DirEdit.Text := DrvLetters[DiskChangesComboBox.ItemIndex] + '{#MyAppName}';
end;

procedure FillCombo();
var
  drivesletters, drive, sd: string;
  n, lenletters, disktype, posnull: integer;

begin
  sd := UpperCase(ExpandConstant('{sd}'));
  drivesletters := StringOfChar(' ', 64);
  lenletters := GetLogicalDriveStrings(63, drivesletters);
  SetLength(drivesletters, lenletters);
  Drive := '';
  n := 0;
  while ((Length(Drivesletters) > 0)) do begin
    posnull := Pos(#0, Drivesletters);
    if posnull > 0 then begin
      Drive := UpperCase(Copy(Drivesletters, 1, posnull-1));
      disktype := GetDriveType(Drive);
      if ( not ( disktype = DRIVE_REMOVABLE  ) ) then begin
      if ( not ( disktype = DRIVE_REMOTE  ) ) then
      if ( not ( disktype = DRIVE_CDROM  ) ) then
      if ( not ( disktype = DRIVE_RAMDISK  ) ) then
        DiskChangesComboBox.Items.Add(Drive + DriveTypeString(disktype))
        SetArrayLength(DrvLetters, N+1);
        DrvLetters[n] := Drive;
        if (Copy(Drive, 1, 2)=sd) then DiskChangesComboBox.ItemIndex := n;
          n := n+1;
        end
        Drivesletters := Copy(Drivesletters, posnull+1, Length(Drivesletters));
      end;
  end;
  DiskChangesComboBoxOnClick(DiskChangesComboBox);
end;
//////////////////////////////////////////////////////////////////////////////////////
function ProgressCallback(OveralPct,CurrentPct: integer; CurrentFile, TimeStr1, TimeStr2, TimeStr3: PAnsiChar): longword;
begin
  if OveralPct<=1000  then ISDonePB.Position := OveralPct;
  AFile := ExpandConstant('ExtractedFile: ') + (CurrentFile);
  FilesMemo.Lines.Add(AFile)
  Result := ISDoneCancel;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID = wpInstalling then begin
    SuspendProc;
    Confirm := False;
    Cancel := False;
    if ExitSetupMsgBox then ISDoneCancel:=1;
    ResumeProc;
  end;
end;

procedure InitializeWizard();
begin
  with WizardForm do begin
    DirEdit.SetBounds(ScaleX(43), ScaleY(81), ScaleX(290), ScaleY(21));
    DirEdit.Text := WizardForm.DirEdit.Text+#0;
  end;

  DiskChangesComboBox := TNewComboBox.Create(WizardForm.SelectDirPage);
  with DiskChangesComboBox do begin
    Parent := WizardForm.DirEdit.Parent;
    SetBounds(ScaleX(0), WizardForm.DirEdit.Top, ScaleX(40), WizardForm.DirEdit.Height);
    Style := csDropDownList;
    DiskChangesComboBox.OnClick := @DiskChangesComboBoxOnClick;
  end

  FilesMemo:= TNewMemo.Create(WizardForm);
  with FilesMemo do begin
    SetBounds(ScaleX(0), ScaleY(80), ScaleX(417), ScaleY(150));
    WordWrap  := False;
    Parent    := WizardForm.InstallingPage;
    ScrollBars:= ssVertical;
    ReadOnly  := True;
    Clear;
  end;

  FillCombo;
end;

procedure HideControls;
begin
  ISDonePB.Hide;
end;

procedure CreateControls;
begin
  ISDonePB := TNewProgressBar.Create(WizardForm);
  with ISDonePB do begin
    Parent := WizardForm.InstallingPage;
    SetBounds(ScaleX(0), ScaleY(42), ScaleX(417), ScaleY(21));
    Max := 1000;
  end;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  if (CurPageID = wpFinished) and ISDoneError then begin
    WizardForm.Caption:= 'Ошибка распаковки!';
    WizardForm.FinishedLabel.Font.Color:= clRed;
    WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
  end;
end;

function CheckError:boolean;
begin
  result:= not ISDoneError;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then begin
    WizardForm.ProgressGauge.Hide;
    CreateControls;
    ISDoneCancel:=0;
    ExtractTemporaryFile('unarc.dll');
    ExtractTemporaryFile('facompress.dll');
    #ifdef records
      ExtractTemporaryFile('records.inf');
    #endif
    ISDoneError:=true;
    if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, 0, 0, 0, 0, 512, @ProgressCallback) then begin
      repeat
        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\test.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), False) then break;
        ISDoneError:=false;
      until true;
      ISDoneStop;
    end;
    HideControls;
  end;
  if (CurStep=ssPostInstall) and ISDoneError then begin
    Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
  end;
end;
[/SPOILER]
----------------------------------------
теперь проблема возникла
если нажать на кнопку "обзор" и выбрать диск установки например D:\, то эта информация не обновляется в ComboBox, то есть так и остается C:\
Как вот такое победить
и проблема с TMemo
распакуемые файлы видно на TMemo с эти все в порядке. но нужно (хотелось) там видеть и StatusLabel
, то есть инфу о том что происходит, если началась распаковка то "распаковка файлов" и идет список файлов. если установка доп. по , то идет сообщение об этой установке, если ошибка то инфа об ошибке, у меня не получается туда "всунуть" StatusLabel ни как
 

Вложения

Последнее редактирование:
Сверху