Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
Mat_y, вот накатал копирование файлов из папки куда-нибудь, возможностью перезаписи/пропуска и перемещения файлов в одной функции с опциональным отображением прогресса: »
Сломался на всем этом... пытался, но не осилил.
Johny777
21-11-2013, 17:54
Mat_y,
Я попробовал оба варианта... все равно натыкается на существующий фаил и стопорится. »
Сломался на всем этом... пытался, но не осилил. »
Кошмар! :)
Давай по порядку.
Функция вчера почти весь вечер, а ночью дописывалась, хотя это я мог бы и быстрее, но, тк цель одна - максимальная скорость, функциональность и качество,
в ней собственная система определения нужного файла для копирования - это вспомогательные функции из раздела "File Mask Works",
из которых непосредственно во время копирования работает только "ThatFile", для того чтобы найти и в последствии копировать в один цикл прохода по выбранной папке, чтоб
не насиловать ж. диск в количестве длиной с массив масок, как в коде у тебя из сообщения:
for i:=0 to GetArrayLength(MyFiles)-1 do ..., где MyFiles - массив строк (масок поиска)
Перед тем как выложить функцию я её протестировал, хотя составные её части тестировались ещё по мере написания, там где приписано "debug"
Но замечу: я её не перегружал (далее опишу чем), тк не знал насколько это может быть необходимо, тк думал, что тот код которым ты пользуешься не особо хорошо работает.
(не люблю я исправлять, мне проще переписать и потому код твой не брал. Только глянул в чём его назначение)
Те целью было рабочее копирование/перемещение!
"натыкается на существующий фаил и стопорится" может по двум известным мне причинам, если ты конечно папку винды не переносишь :)
1. у файла (который заменяем в папке назначения) свойство "Только чтение"
2. файл держит какой-то процесс
3. хз
эти 3 возможности в коде не учтены, как сказано выше
вывод: дело не в том коде, каким ты пользовался, а в тех самых файлах, которые есть только у тебя, так что нужно максимальное кол-во информации с твоей стороны!
UPD:
вот местами исправленный, улучшенный и дополненный код:
добавлена работа с файлами защиты от изменений ( Read only )
изменён прототип функции. Теперь туда отправляем флаги
SET_OVERWRITE_EXISTING_FILES = 2;
SET_MOVE_FILES = 4;
SET_PROCESS_READONLY_FILES = 8;
[Code]
///////////////////////////////// File Mask Works ////////////////////////
const
ALL_FILES = '*';
BACKSLASH = '\';
type
_FILE_MASK = record
Parts: array of String;
PartsCount: Integer;
end;
_FILES_MASKS_SHOBLA = record
Masks: array of _FILE_MASK;
MasksCount: Integer;
end;
procedure Inc(var Int: Integer);
begin
Int := Int + 1;
end;
procedure Dec(var Int: Integer);
begin
Int := Int - 1;
end;
procedure IncEx(var Int: Extended; const Value: Extended);
begin
Int := Int + Value;
end;
procedure DecEx(var Int: Extended; const Value: Extended);
begin
Int := Int - Value;
end;
procedure AddFragmentToFileMask(const Fragment: String; var f: _FILE_MASK);
begin
Inc(f.PartsCount);
SetArrayLength(f.Parts, f.PartsCount);
f.Parts[f.PartsCount-1] := Fragment;
end;
procedure SplitFileMask(const FileMask: String; out f: _FILE_MASK);
var
i, Len: Integer;
Fragment: String;
begin
Len := Length(FileMask);
Fragment := '';
for i := 1 to Len do
begin
if FileMask[i] = '*' then
begin
if Fragment <> '' then
begin
AddFragmentToFileMask(Fragment, f);
Fragment := '';
end;
Continue;
end;
Fragment := Fragment + FileMask[i];
end;
if Fragment <> '' then AddFragmentToFileMask(Fragment, f);
end;
procedure SplitFilesMasks(const FilesMasks: array of String; var f: _FILES_MASKS_SHOBLA);
var
i, Len: Integer;
begin
Len := GetArrayLength(FilesMasks);
for i := 0 to Len-1 do
begin
Inc(f.MasksCount);
SetArrayLength(f.Masks, f.MasksCount);
SplitFileMask(FilesMasks[i], f.Masks[f.MasksCount-1]);
end;
end;
function ThatFile(const uFileName: String; const f: _FILES_MASKS_SHOBLA): Boolean;
var
a, i: Integer;
begin
for a := 0 to f.MasksCount-1 do
begin
Result := True;
for i := 0 to f.Masks[a].PartsCount-1 do
Result := Result and ( Pos(f.Masks[a].Parts[i], uFileName) <> 0 );
if Result then Break;
end;
end;
function AllFiles(const Masks: array of String): Boolean;
var
Len: Integer;
begin
Len := GetArrayLength(Masks);
case Len of
0: Result := True;
1: Result := Masks[0] = ALL_FILES;
else
Result := False;
end;
end;
////////////////////////////////////////////////////////////////////////////////////////////
const
COPY_COLLECTING_INFO = 0;
COPY_IN_PROGRESS = 1;
COPY_FINISHED = -1;
SET_OVERWRITE_EXISTING_FILES = 2;
SET_MOVE_FILES = 4;
SET_PROCESS_READONLY_FILES = 8;
UNDEF_INT = -1;
COPY_BLOCK_SIZE = 65536;
type
_FILE_INFO = record
FilePath: String;
Size: Extended;
end;
_FILE_CALLBACK =
function
(
const Msg: Integer; //сообщение статуса копирования
const srcFilePath: String; //путь к текущему исходному файлу
const dstFilePath: String; //путь к текущему файлу назначения
const FileBytes: Extended; //размер текущего файла в байтах
const FileBytesCopied: Extended; //сколько байт текущего файла скопировано
const OverallBytes: Extended; //размер всех файлов в байтах
const OverallBytesCopied: Extended //сколько байт всех файлов скопировано
): Boolean; //чтоб отменить копирование нужно вернуть False
function QuadPart(const HighPart: Longint; const LowPart: DWORD): Extended;
begin
Result := HighPart * $80000000{2^32} + LowPart;
end;
procedure AddFileInfo
(
const uFileInfo: TFindRec;
const uFilePath: String;
var Files: array of _FILE_INFO;
var FilesCount: Integer
);
begin
Inc(FilesCount);
SetArrayLength(Files, FilesCount);
Files[FilesCount-1].FilePath := uFilePath + uFileInfo.Name;
Files[FilesCount-1].Size := QuadPart(uFileInfo.SizeHigh, uFileInfo.SizeLow);
end;
procedure FindFiles
(
const srcFolder: String;
const f: _FILES_MASKS_SHOBLA;
const FindAll: Boolean;
var Files: array of _FILE_INFO;
var FilesCount: Integer;
var Canceled: Boolean;
const CallBack: _FILE_CALLBACK
);
var
FileInfo: TFindRec;
begin
if FindFirst(srcFolder + ALL_FILES, FileInfo) then
try
repeat
if Canceled then Break;
if (FileInfo.Name <> '.') and (FileInfo.Name <> '..') then
begin
if FileInfo.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
if FindAll then
begin
AddFileInfo(FileInfo, srcFolder, Files, FilesCount);
if CallBack <> nil then
if not CallBack
(
COPY_COLLECTING_INFO,
Files[FilesCount-1].FilePath,
'',
Files[FilesCount-1].Size,
UNDEF_INT,
UNDEF_INT,
UNDEF_INT
) then
begin
Canceled := True;
Break;
end;
end
else if ThatFile(FileInfo.Name, f) then
begin
AddFileInfo(FileInfo, srcFolder, Files, FilesCount);
if CallBack <> nil then
if not CallBack
(
COPY_COLLECTING_INFO,
Files[FilesCount-1].FilePath,
'',
Files[FilesCount-1].Size,
UNDEF_INT,
UNDEF_INT,
UNDEF_INT
) then
begin
Canceled := True;
Break;
end;
end;
end else if FileInfo.Attributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY then
FindFiles(
srcFolder + FileInfo.Name + BACKSLASH,
f,
FindAll,
Files,
FilesCount,
Canceled,
CallBack
);
end;
until not FindNext(FileInfo);
finally
FindClose(FileInfo);
end;
end;
function CountFilesSize(const Files: array of _FILE_INFO; const FilesCount: Integer): Extended;
var
i: Integer;
begin
Result := 0;
for i := 0 to FilesCount-1 do IncEx(Result, Files[i].Size);
end;
function GetNewFilePath(
const srcFolder: String;
const dstFolder: String;
const srcFilePath: String
): String; // returns dstFilePath
var
BuffFilePath: String;
begin
BuffFilePath := srcFilePath;
StringChange(BuffFilePath, srcFolder, '');
Result := dstFolder + BuffFilePath;
end;
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
function SetFileAttributes(lpFileName: String; dwFileAttributes: DWORD): BOOL; external 'SetFileAttributes{#A}@kernel32.dll stdcall';
function GetFileAttributes(lpFileName: PAnsiChar): DWORD; external 'GetFileAttributes{#A}@kernel32.dll stdcall';
function CopyFiles(
const srcFolder: String; //путь, откуда копировать
const dstFolder: String; //путь, куда откуда копировать
const Masks: array of String; //массив масок файла, например: ['*Soft*.exe', '*Soft*a*.exe', 'Valve*.*', '*.e*', '*.exe']
const dwOptions: DWORD;
const CallBack: _FILE_CALLBACK //указатель на функцию обратного вызова _FILE_CALLBACK или nil
): Boolean;
var
Files: array of _FILE_INFO;
f: _FILES_MASKS_SHOBLA;
FilesCount: Integer;
CopyAll: Boolean;
Canceled: Boolean;
ReadOnlyOff, ReadOnlyFile: Boolean;
OverallBytes, OverallBytesCopied: Extended;
srcFileStream, dstFileStream: TFileStream;
dstFilePath, srcFilePath: String;
i, CopyBytes, BytesLeft: Integer;
CurrentFileDir: String;
begin
Result := False;
if not DirExists(srcFolder) then Exit;
Canceled := False;
ReadOnlyFile := False;
CopyAll := AllFiles(Masks);
if not CopyAll then SplitFilesMasks(Masks, f);
FilesCount := 0;
FindFiles
(
AddBackslash(RemoveBackslash(srcFolder)),
f,
CopyAll,
Files,
FilesCount,
Canceled,
CallBack
);
if (FilesCount = 0) or Canceled then Exit;
if CallBack <> nil then
begin
OverallBytes := CountFilesSize(Files, FilesCount);
OverallBytesCopied := 0;
end;
for i := 0 to FilesCount-1 do
begin
if Canceled then Break;
srcFilePath := Files[i].FilePath;
dstFilePath := GetNewFilePath(srcFolder, AddBackslash(RemoveBackslash(dstFolder)), srcFilePath);
if dwOptions and SET_OVERWRITE_EXISTING_FILES = 0 then
if FileExists(dstFilePath) then Continue;
if dwOptions and SET_PROCESS_READONLY_FILES = SET_PROCESS_READONLY_FILES then
if FileExists(dstFilePath) then
if (GetFileAttributes(dstFilePath) and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then
begin
ReadOnlyFile := True;
ReadOnlyOff := SetFileAttributes(dstFilePath, FILE_ATTRIBUTE_NORMAL);
if not ReadOnlyOff then
begin
Canceled := True;
Break;
end;
end;
if not ForceDirectories(ExtractFilePath(dstFilePath)) then
begin
Canceled := True;
Break;
end;
srcFileStream := TFileStream.Create(srcFilePath, fmOpenRead);
dstFileStream := TFileStream.Create(dstFilePath, fmCreate);
BytesLeft := srcFileStream.Size - srcFileStream.Position;
CopyBytes := COPY_BLOCK_SIZE;
try
while BytesLeft > 0 do
begin
if BytesLeft < COPY_BLOCK_SIZE then CopyBytes := BytesLeft;
dstFileStream.CopyFrom(srcFileStream, CopyBytes);
BytesLeft := srcFileStream.Size-srcFileStream.Position;
IncEx(OverallBytesCopied, CopyBytes);
if CallBack <> nil then
if not CallBack
(
COPY_IN_PROGRESS,
srcFilePath,
dstFilePath,
Files[i].Size,
Files[i].Size - BytesLeft,
OverallBytes,
OverallBytesCopied
) then
begin
Canceled := True;
Break;
end;
end;
finally
srcFileStream.Free;
dstFileStream.Free;
if ReadOnlyFile then
begin
ReadOnlyOff := not SetFileAttributes(dstFilePath, FILE_ATTRIBUTE_READONLY);
if ReadOnlyOff then
Canceled := True
else
ReadOnlyFile := False;
end;
if Canceled then
DeleteFile(dstFilePath);
if dwOptions and SET_MOVE_FILES = SET_MOVE_FILES then
begin
DeleteFile(srcFilePath);
CurrentFileDir := ExtractFilePath(srcFilePath);
if CurrentFileDir <> srcFolder then
RemoveDir(CurrentFileDir); // removes dir if it is empty
end;
end;
end;
Result := not Canceled;
if Result then
if CallBack <> nil then
CallBack(COPY_FINISHED, '', '', UNDEF_INT, UNDEF_INT, UNDEF_INT, UNDEF_INT);
end;
//////////////////////////////////////////// demo //////////////////////////////////////////////////////////////////
var
MainCopyPrgBar,FileCopyPrgBar: TNewProgressBar;
function ____________________
(
const Msg: Integer;
const srcFilePath: String;
const dstFilePath: String;
const FileBytes: Extended;
const FileBytesCopied: Extended;
const OverallBytes: Extended;
const OverallBytesCopied: Extended
): Boolean;
begin
case Msg of
COPY_IN_PROGRESS:
begin
WizardForm.Caption := FloatToStr(FileBytes) + #32#32 + FloatToStr(FileBytesCopied);
FileCopyPrgBar.Position := Round( (100*FileBytesCopied) / FileBytes );
MainCopyPrgBar.Position := Round( (100*OverallBytesCopied) / OverallBytes );
end;
COPY_FINISHED: MsgBox('Finish! :)', mbInformation, MB_OK);
end;
Application.ProcessMessages;
Result := not Application.Terminated;
end;
procedure ButtonClick(Sender: TObject);
begin
CopyFiles('C:\src\', 'C:\test',['*'], SET_PROCESS_READONLY_FILES or SET_OVERWRITE_EXISTING_FILES, @____________________);
end;
procedure InitializeWizard();
begin
WizardForm.OuterNotebook.Hide;
WizardForm.Canvas.Brush.Style := bsClear;
MainCopyPrgBar := TNewProgressBar.Create(nil);
with MainCopyPrgBar do
begin
Parent:= WizardForm;
SetBounds(ScaleX(5), ScaleY(5), WizardForm.ClientWidth-10, ScaleY(20));
end;
FileCopyPrgBar := TNewProgressBar.Create(nil);
with FileCopyPrgBar do
begin
Parent:= WizardForm;
SetBounds(ScaleX(5), ScaleY(30), WizardForm.ClientWidth-10, ScaleY(20));
end;
with TButton.Create(WizardForm) do
begin
Parent:= WizardForm;
Left := ScaleX(0);
Top := ScaleY(200);
Width := ScaleY(150);
Caption:='Copy';
OnClick:=@ButtonClick;
end;
end;
пробуй!
dima.dmitrienko.71@fb
21-11-2013, 21:19
Всем привет ребята помогите выдаёт ошибкуhttp://forum.oszone.net/attachment.php?attachmentid=107113&d=1385054354
FX-DENIS
21-11-2013, 21:29
Джони ну помоги пожалуйста,на прошлой стр описал проблемки. Или ткни носом,может уже решение было проблем таких.:)
А мне не поможете ? »
Всё отображается. (http://rghost.ru/50339454)
habib2302
22-11-2013, 14:18
доброе время суток. как сделать если отсутствует какой-то компонент например DirectX была снята галка с компонента и был не активным
Dinvin4ester
22-11-2013, 16:55
nik1967,
Отображается если использовать сторонние архиваторы , а я использую только средства инно . Понимаю что так не получится , но мне бы прикрутить стандартный прогресс бар .
El Sanchez
22-11-2013, 21:58
Совместил фри арк и скрипт процентов и размера который мне давал Serega.Но вот беда,прогресс бар не отображается »
FX-DENIS, скажите сначала что нужно на этапе ssInstall (или ssPostInstall) делать. Словами, без кода.
прогресс бар инно именно инно ,не фри арка,показывается 103% а не 100,как это исправить? »
FX-DENIS, это не исправить, в 5 класс школы уже не вернуться. Ищите в скрипте формулу, по которой проценты вычисляются.
Третья проблемка инно не учитывает архивы фри арк и пишет размер только инно,как заставить писать размер места для установки правильно?Смысл тогда в строке #define NeedSize "5000000000" ? »
FX-DENIS, используется, например, так:
#define NeedSize "5000000000"
[Setup]
#ifdef NeedSize
ExtraDiskSpaceRequired (http://www.jrsoftware.org/ishelp/index.php?topic=setup_extradiskspacerequired)={#NeedSize}
#endif
dima.dmitrienko.71@fb
22-11-2013, 23:08
Помогите решить проблему 107162
El Sanchez
22-11-2013, 23:15
Помогите решить проблему ffff.png »
dima.dmitrienko.71@fb, где-то выше не закрытый end-ом begin.
dima.dmitrienko.71@fb
22-11-2013, 23:43
El Sanchez извините но я нуб в этом деле можете помочь?
FX-DENIS
23-11-2013, 00:20
FX-DENIS, это не исправить, в 5 класс школы уже не вернуться. Ищите в скрипте формулу, по которой проценты вычисляются. »Санчес причем тут 5 класс то,мне уже под 30 лет)),кроме шуток помоги,формула я так понял это,его писал Serega,он даже есть в шапке,отображение размера файлов и процентов.Вот кусок кода:
procedure Progress();
begin
with WizardForm.ProgressGauge do
ProgressLabel.Caption := IntToStr((Position-Min)/((Max - Min)/100)) + '%';
SizeLabel.Caption := BytesToReadable(GetFileSize(ExpandConstant(CurrentFileName)), 1);
end;
За размер файлов для установки огромное спасибо,помогло,я не знаю почему в стандартном примере фри арк этого не сказано,что надо такую формулу в SETUP приписать,я так понял там указываеш сумму архивов фри арк,а инно сам плюсует свой размер еще,и получается все правильноFX-DENIS, скажите сначала что нужно на этапе ssInstall (или ssPostInstall) делать. Словами, без кода. »Ну то,есть вначале по умолчанию же идет распаковка фри арк архивов и показывается двойной прогресс бар,фри арк скрывает родной прогресс бар,чтоб он не мешал,а на странице распаковки файлов инно он должен его показать,но он его не показывает.На скриншоте видно. Санчес не издевайся,я не знаю как еще на пальцах объяснить:)
.
El Sanchez извините но я нуб в этом деле можете помочь? »
Там перед красной строчкой вставте еще раз end;
Чтоб получилось так
end;
end;
El Sanchez
23-11-2013, 15:07
Санчес причем тут 5 класс то,мне уже под 30 лет)) »
А проценты когда учат? А операции над целыми числами еще раньше.
формула я так понял это,его писал Serega,он даже есть в шапке,отображение размера файлов и процентов.Вот кусок кода: »
FX-DENIS, формула верна, но где гарантия, что Max всегда равен 100? Если он будет меньше, то это вызовет исключение деления на 0, если больше, то на обеих операциях деления будет небольшая погрешность, ибо дробная часть при делении целых чисел в Inno отбрасывается, поэтому 100% не дождешься, будет писать 99%, а это уже вранье в письменной форме. Формулу можно немного переделать, заменя одну операцию деления на умножение: (Position-Min)*100/(Max - Min). Но рискуем нарваться на переполнение, ибо при первом умножении промежуточный результат может выйти за пределы Integer и до свиданья. Поэтому, если мне нужно получить целочисленные проценты, то использую функцию MulDiv (http://msdn.microsoft.com/en-us/library/windows/desktop/aa383718(v=vs.85).aspx):
function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer; external 'MulDiv@kernel32.dll stdcall';
with WizardForm.ProgressGauge do ProgressLabel.Caption := Format('%d %%', [MulDiv(Position-Min, 100, Max-Min)]);
Если с отображением дробной части, то:
with WizardForm.ProgressGauge do ProgressLabel.Caption := Format('%n %%', [extended(Position-Min)*100/(Max-Min)]);
А насчет того, что вылазит аж 103%, то это где-то Position в коде принимает значения больше Max.
я не знаю как еще на пальцах объяснить »
FX-DENIS, без четкого алгоритма действий на пальцах нет смысла что-то писать на каком-либо языке программирования. ОК, допустим архивы распаковываются на этапе ssInstall, т.е. до основной утановки. Тогда нужно скрыть стандартный прогресс - создать и отобразить интерфейс для freearc - распаковка - удалить/скрыть интерфейс для freearc - показать стандартный прогресс:
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall : begin
// тут скрывается стандарный прогрессбар
WizardForm.ProgressGauge.Hide;
// тут создаются конролы для freearc (прогрессбары, проценты, ...)
CreateControls;
// тут идет распаковка
...
// тут удаляются/скрываются контролы для freearc
...
// тут показывается стандарный прогрессбар для основной установки
WizardForm.ProgressGauge.Show;
end;
end;
end;
но я нуб в этом деле можете помочь? »
dima.dmitrienko.71@fb, поставьте курсор на строку выше, потом скроллом наверх пока не увидите слово begin, try или case, подсвеченное красным. Этот блок и нужно закрыть end-ом. Не сможете найти сами, код до проблемной строки в студию.
FX-DENIS
23-11-2013, 16:50
Если с отображением дробной части, то: » Поменял строчку на твою и все норм 100.00% ,а первую функцию MulDiv: не смог некуда вставить,добавил бегин и енд,все равно ошибку выдает,ее надо же поместить в procedure Progress();,но не смог.Я просто не понимаю почему дают примеры фри арк людям,и потом еще кучу всего надо переделывать в скрипте,что было по человечески,почему до сих пор нет наглядного конструктора где выбираешь что надо, а скрипт делается автоматически как надо,например как в InnoIDE или Game Script Generator,почему нет такого программиста кто сделает все в одном для простых людей,не понимаю.Обязательно надо кучу разных программ,Dll,и прочего ,чтоб мало мальски заработало.И этот скрипт джойнер для кого выпустили хер знает,после него тока каша получается ,а не скрипт.Не хотят сделать программу для массового пользования. Ну это просто мысли в слух,извини.
Насчет прогресса попробую еще раз скрыть при фри арк,а потом показать при распаковке родной.ВОт почему нельзя было это сделать людям сразу? или они думали скрипт распаковки фри арка,без инно будут использоватЬ?
Вот еще кстати,что хотел спросить,у Serega там написано было так
procedure Progress();
begin
with WizardForm.ProgressGauge do
// ProgressLabel.Caption := IntToStr((Position-Min)/((Max - Min)/100)) + '%'; // часто видел, но никогда не вникал в эту формулу...
ProgressLabel.Caption := IntToStr((Position*100)/Max) + '%'; // правильное отображение процентов
SizeLabel.Caption := BytesToReadable(GetFileSize(ExpandConstant(CurrentFileName)), 1);
end;
Первая формула закоментированна у него,он даже написал ,что не знает что это,но если использовать без фри арк в дальнейшем,эта формула лучше или он ее закоментировал не даром?
FX-DENIS
23-11-2013, 17:28
Получается вот так
begin
if CurStep = ssInstall then begin //Если необходимо, можно поменять на ssPostInstall
WizardForm.ProgressGauge.Hide;
WizardForm.CancelButton.Hide;
CreateControls;
WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
ISDoneCancel:=0;
http://x.picp2.com/allimage/666/665537-thumb.jpeg (http://picp2.com/15264/665537/)
Но все тоже самое,при распаковке фри арка стандартный бар торчит под ними,а на распаковке отображает себя,WizardForm.ProgressGauge.Hide; не срабатывает
El Sanchez
23-11-2013, 18:19
а первую функцию MulDiv: не смог некуда вставить,добавил бегин и енд,все равно ошибку выдает,ее надо же поместить в procedure Progress();,но не смо »
FX-DENIS, никуда ее в тело процедуры или функции помещать не надо, просто перемести ее в начало секции Code куда-нибудь после объявления констант, типов и глобальных переменных, у тебя там еще подобные объявления функций есть от ISDone, например, (ISArcExtract, IS7ZipExtract и т.д.).
Первая формула закоментированна у него,он даже написал ,что не знает что это,но если использовать без фри арк в дальнейшем,эта формула лучше или он ее закоментировал не даром? »
FX-DENIS, я в предыдущем сообщении указал уже на недостатки обоих примеров. Используй с MulDiv.
Но все тоже самое,при распаковке фри арка стандартный бар торчит под ними,а на распаковке отображает себя,WizardForm.ProgressGauge.Hide; не срабатывает »
FX-DENIS, ну, дык, понятно, что все то же самое. Ты скрыл прогрессбар, вызвал CreateControls, где создаются контролы для freearc, а потом показал прогрессбар ДО распаковки, а нужно ПОСЛЕ. В представленном коде не вижу реализации распаковки.
как сделать если отсутствует какой-то компонент например DirectX была снята галка с компонента и был не активным »
habib2302, где отсутствует?
habib2302
23-11-2013, 18:21
например: если отсутствует какой-то компонент. как сделать, чтобы была снята галка с этого компонента и был неактивный или вообще не отображался в списке
FX-DENIS
23-11-2013, 20:03
ну, дык, понятно, что все то же самое. Ты скрыл прогрессбар, вызвал CreateControls, где создаются контролы для freearc, а потом показал прогрессбар ДО распаковки, а нужно ПОСЛЕ. В представленном коде не вижу реализации распаковки. »
Вообщем куда тока не вставлял,то ошибки то не работает).Поразмыслил логически и вставил сюда,заработало
ISDoneError:=false;
until true;
ISDoneStop;
end;
HideControls;
WizardForm.CancelButton.Visible:=true;
WizardForm.CancelButton.Enabled:=false;
WizardForm.ProgressGauge.Show;
end;
if (CurStep=ssPostInstall) and ISDoneError then begin
Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
end;
end;
///////////////////// Конец Фри арка
Вообще я думал надо все это вынести в шапку,ведь это изменение стандартного примера фри арка,остальные люди тоже будут мучаться как я с прогресс баром,с процентами.Можно даже выложить правильный фри арк скрипт от начала до конца в шапку,а тот что дается с ISDone в папке ISDone_Example.iss ,бред полный.Спасибо Санчез ,что помогаешь и терпишь меня:)
habib2302
23-11-2013, 22:25
КТО НИБУДЬ ВООБЩЕ ОТВЕТИТ НА МОЙ ВОПРОС (http://forum.oszone.net/post-2260500-1497.html)!!!!
Dinvin4ester
23-11-2013, 22:50
habib2302,
Не нервничай, а лучше откатись на 2- 3 страницы назад .Этот вопрос решили , а я спокойно жду . Главное спокойствие .
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC