Войти

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]


Страниц : 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

saurn
31-03-2013, 03:55
audiofeel, можно создать бевел и внутри него разместить лейбл, чтобы получилась обводка. Я бы оставил так, но это дело вкуса. С таск листом наверное можно что-то сделать, но я незнаю как - с оформлением инсталов я на "вы", больше предпочитаю стандартный спартанский интерфейс.

alert30
31-03-2013, 08:15
saurn, в тегах кода скрипта используй [Code] начальная жирная квадратная скобка и не будет конфликты с тегом и прочих символов перед словом Code.

ABBAT
31-03-2013, 10:48
Всем привет. Помогите пожалуйста с кодом. Нужно внести ключ в реестр в зависимости от разрешения экрана, если FullHD и выше то ключ один, если ниже то ключ другой.

Crazy Noise
31-03-2013, 13:32
saurn, скажи те вот а чтобы оное обвести (рамка) придется бевел создавать »

Вот на скорую руку накидал:
[*Code]
var
GroupBox_DirPage: TNewGroupBox;

procedure InitializeWizard();
begin
GroupBox_DirPage := TNewGroupBox.Create(WizardForm);
GroupBox_DirPage.Parent := WizardForm.SelectDirPage;
GroupBox_DirPage.Left := ScaleX(0);
GroupBox_DirPage.Top := ScaleY(0);
GroupBox_DirPage.Width := ScaleX(416);
GroupBox_DirPage. Height := ScaleY(140);
GroupBox_DirPage.Caption := 'Папка установки';

WizardForm.SelectDirBitmapImage.Left := ScaleX(10);
WizardForm.SelectDirBitmapImage.Top := ScaleY(20);
WizardForm.SelectDirBitmapImage.Parent := GroupBox_DirPage;

WizardForm.SelectDirLabel.Left := ScaleX(54);
WizardForm.SelectDirLabel.Top := ScaleY(20);
WizardForm.SelectDirLabel.Width := ScaleX(300);
WizardForm.SelectDirLabel.Parent := GroupBox_DirPage;

WizardForm.SelectDirBrowseLabel.Left := ScaleX(10);
WizardForm.SelectDirBrowseLabel.Top := ScaleY(54);
WizardForm.SelectDirBrowseLabel.Width := ScaleX(405);
WizardForm.SelectDirBrowseLabel.Parent := GroupBox_DirPage;

WizardForm.DirEdit.Left := ScaleX(10);
WizardForm.DirEdit.Top := ScaleY(87);
WizardForm.DirEdit.Width := ScaleX(317);
WizardForm.DirEdit.Parent := GroupBox_DirPage;

WizardForm.DirBrowseButton.Left := ScaleX(332);
WizardForm.DirBrowseButton.Top := ScaleY(86);
WizardForm.DirBrowseButton.Parent := GroupBox_DirPage;

WizardForm.DiskSpaceLabel.Left := ScaleX(10);
WizardForm.DiskSpaceLabel.Top := ScaleY(116);
WizardForm.DiskSpaceLabel.Width := ScaleX(405);
WizardForm.DiskSpaceLabel.Parent := GroupBox_DirPage;
end;

Lex_from_Belarus
31-03-2013, 14:23
Подскажите пожалуйста как лучше организовать инсталлер:

имеется 3 вида компонентов:

компоненты №1 - это компоненты, которые не много занимают места и часто обновляются;
компоненты №2 - это компоненты, которые много занимают и редко обновляются;
компоненты №3 - это компоненты, которые не сильно много места, но больше чем компоненты №1 и не обновляются вообще, ну т.е. устанавливаются только 1 раз в принципе.

Из этого следует, что рационально бы их все устанавливать раздельно, т.е. сделать 3 разных инсталла и обновлять по отдельности, но хочется сделать 1 общий инсталл на всё и в зависимости от того есть ли с инсталлером определённый файл содержащий компонент №1, №2 или №3, предлагало к установке соответствующие компоненты в окне выборов компонентов, т.е. глубо говоря структура была бы такой:
Install.exe - сам установщик
xxx1.xxx - файл с компонентами №1
xxx2.xxx - файл с компонентами №2
xxx3.xxx - файл с компонентами №3

и чтобы xxx1-3.xxx не были просто архивами, чтобы их отдельно нельзя было распаковать. можно ли реализовать такое?

neorom
31-03-2013, 21:23
habib2302 спасибо за скрипт dead-space-2-fenixx-ot-vasyakrn.7z . Именно єто я искал !!!

Johny777
01-04-2013, 03:30
ABBAT,
Нужно внести ключ в реестр в зависимости от разрешения экрана, если FullHD и выше то ключ один, если ниже то ключ другой. »
используй методы Width и Height класса TScreen
пример только через код:

procedure InitializeWizard();
begin
if (Screen.Width >= 1920) and (Screen.Height >= 1080) then RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'Alpha', '1')
else RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'ShowName', '0');
end;

или так, если используешь секцию [Registry]:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Registry]
// будет внесён если не фулл хд
Root: HKCU; Subkey: "Software\Valve"; ValueType: String; Flags: uninsdeletevalue uninsdeletekeyifempty; Check: not FullHD_or_Higher();

// будет внесён если фулл хд или выше
Root: HKLM; Subkey: "SOFTWARE\Bethesda Softworks\Skyrim"; ValueName: "Installed Path"; ValueType: String; ValueData: "{app}\"; Flags: uninsdeletevalue uninsdeletekeyifempty; Check: FullHD_or_Higher();

[code]
function FullHD_or_Higher(): Boolean;
begin
Result := (Screen.Width >= 1920) and (Screen.Height >= 1080);
end;


можно и через функцию WinApi GetDeviceCaps(...)
пример:

const
HORZRES = 8; // Horizontal width in pixels
VERTRES = 10; // Vertical height in pixels

type
HDC = LongWord;


function GetDeviceCaps(DC: HDC; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function GetDC(hWnd: HWND): HDC; external 'GetDC@user32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';


procedure InitializeWizard();
var
uHDC: HDC;
begin
uHDC := GetDC(0);
try
if (GetDeviceCaps(uHDC, HORZRES) >= 1920) and (GetDeviceCaps(uHDC, VERTRES) >= 1080) then RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'Alpha', '1')
else RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'ShowName', '0');
finally
ReleaseDC(0, uHDC);
end;
end;


==========================================================

saurn, по этому самому принципу можно извлечь кол-во необходимого места и из WizardForm.DiskSpaceLabel. Если нет компонентов в инстале.
Так верно? »

молоток, всё верно! :)

saurn,

Alloc Пост http://forum.oszone.net/post-1932100-239.html»
касательно процентов установки вот тебе пример лучше
у того примера 2 минуса
1. использование необязательной в расширенной версии инно библиотеки innocallback.dll для получения адреса процедуры...
2. использование таймера у которого по умолчанию задержка + он стоит в очередях и задержка может усилиться

для себя уже сделал другой пример, но ещё не выкладывал
принцип такой:
прогрессбар является наследником TWinControl или другим словом он окно, а значит для него действует стандартная оконная функция винды (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633572%28v=vs.85%29.aspx) ,
как и для всех остальных окон (форма, статик текст и прочие наследники)
но в инно мы к ней по дефоту доступа не имеем и поэтому установим ему свою такую же функцию
дело в том что окно получает сообщения и поле того как оно пройдёт (если пройдёт, тк мы если можем их получать можем и обнулять и прочее) будет выполнен код для этого сообщения (закрыть окно, свернуть, отрисовать нажатие кнопки...) и прогрессбар каждый раз перед отрисовкой новой позиции получает сообщение PBM_SETPOS и именно в этот момент мы можем обновлять проценты перед тем как сообщение пойдёт дальше
пример:



[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external

[code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

const
WM_USER = $0400;
CCM_FIRST = $2000;
CCM_SETBKCOLOR = CCM_FIRST + 1;

PBS_SMOOTH = 01;
PBS_VERTICAL = 04;
PBM_SETRANGE = WM_USER+1;
PBM_SETPOS = WM_USER+2;
PBM_DELTAPOS = WM_USER+3;
PBM_SETSTEP = WM_USER+4;
PBM_STEPIT = WM_USER+5;
PBM_SETRANGE32 = WM_USER+6; // lParam = high, wParam = low
PBM_GETRANGE = WM_USER+7; // lParam = PPBRange or Nil
// wParam = False: Result = high
// wParam = True: Result = low
PBM_GETPOS = WM_USER+8;
PBM_SETBARCOLOR = WM_USER+9; // lParam = bar color
PBM_SETBKCOLOR = CCM_SETBKCOLOR; // lParam = bkColor

{ For Windows >= XP }
PBS_MARQUEE = $08;
PBM_SETMARQUEE = WM_USER+10;

{ For Windows >= Vista }
PBS_SMOOTHREVERSE = $10;

{ For Windows >= Vista }
PBM_GETSTEP = WM_USER+13;
PBM_GETBKCOLOR = WM_USER+14;
PBM_GETBARCOLOR = WM_USER+15;
PBM_SETSTATE = WM_USER+16; { wParam = PBST_[State] (NORMAL, ERROR, PAUSED) }
PBM_GETSTATE = WM_USER+17;

{ For Windows >= Vista }
PBST_NORMAL = $0001;
PBST_ERROR = $0002;
PBST_PAUSED = $0003;




GWL_WNDPROC = -4;


type
LPARAM = Integer;
WPARAM = Integer;
LRESULT = Integer;
TFNWndProc = Integer;


function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';

var
OldProgressBarProc: Longint;

function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
if Msg = PBM_SETPOS then with WizardForm.ProgressGauge do WizardForm.Caption := FormatFloat('0.#0 %', (Position*100)/Max);

Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
end;

procedure DeinitializeSetup();
begin
SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;




=======================================================================

Lex_from_Belarus, но хочется сделать 1 общий инсталл на всё и в зависимости от того есть ли с инсталлером определённый файл содержащий компонент №1, №2 или №3, предлагало к установке соответствующие компоненты в окне выборов компонентов »
можно конечно, только сделал проще - не три разных файла с компонентами а один в котором столбиком(обязательно для первой функции, которая закоментирована) или просто перечислены компоненты, те если имя компонента есть в файле, то он будет добален в чеклистбокс, если нет то пропущен
вот пример из двух функций (вторая, которая не закомментирована работает быстрее, но в познавательных целях оставил первую (у меня какая-то странная тяга к массивам и первая на их основе :) ))



[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
SolidCompression=yes
Compression=lzma/ultra


[Components]
Name: A; Description: The Elder Scrolls V - Skyrim; Types: full custom; Flags: disablenouninstallwarning checkablealone fixed; Check: InExternalTextFile('The Elder Scrolls V - Skyrim');
Name: B; Description: на английском языке; Types: full; Flags: exclusive disablenouninstallwarning; Check: InExternalTextFile('на английском языке');
Name: C; Description: на русском языке; Types: full; Flags: exclusive disablenouninstallwarning; Check: InExternalTextFile('на русском языке');

Name: FF; Description: Visual C++ 2010 (x86) (необходим для запуска приложения); Types: full; Flags: dontinheritcheck disablenouninstallwarning; Check: InExternalTextFile('Visual C++ 2010 (x86) (необходим для запуска приложения)');
Name: HL; Description: DirectX; Types: full; Flags: dontinheritcheck disablenouninstallwarning; Check: InExternalTextFile('DirectX');




[Code]
//var
// Buff: array of String;
//
//function InExternalTextFile(const SearchName: String): Boolean;
//var
// i: Integer;
//begin
// if GetArrayLength(Buff) = 0 then if LoadStringsFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff) then
// for i := 0 to GetArrayLength(Buff)-1 do
// begin
// Result := Buff[i] = SearchName;
// if Result then Break;
// end;
//end;


var
Buff: String;

function InExternalTextFile(const SearchName: String): Boolean;
begin
if Buff = '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff);
Result := Pos(SearchName, Buff) > 0;
end;


для этого примера положи рядом с экзешником инсталла текстовый файл Install.txt содержащий:
The Elder Scrolls V - Skyrim
на английском языке
на русском языке

nik1967
01-04-2013, 08:37
Lex_from_Belarus, а я сделал сложнее (наверное, хотя для меня этот вариант проще). В зависимости от нахождения файла рядом (ну или ещё где - путь задаётся в шапке скрипта) с инсталлятором будет отображаться компонент (ну или не будет). If components exist (http://rghost.ru/44939722)и чтобы xxx1-3.xxx не были просто архивами, чтобы их отдельно нельзя было распаковать. можно ли реализовать такое?Воспользуйся паролем на архив при сжатии.

ABBAT
01-04-2013, 09:19
Johny777, Большое спасибо дружище за примеры (GetDeviceCaps по моему более элегантна)
Ещё вопрос, можно убрать иконку инсталятора с панели задач (не критично просто интересно кто нибудь слышал о током)

Crazy Noise
01-04-2013, 10:22
alert30, Можно и проще.
Посто скопировать в редакторе как UBB-код
http://imageshack.us/scaled/thumb/407/ubb.png (http://imageshack.us/photo/my-images/407/ubb.png/)

получется вот так

[Setup]
AppName=My Program
AppVersion=1.5
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: C:\Program Files\Inno Setup 5\Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe; Tasks: desktopicon

[Run]
Filename: {app}\MyProg.exe; Description: {cm:LaunchProgram,My Program}; Flags: nowait postinstall skipifsilent

alert30
01-04-2013, 12:37
Crazy Noise, я говорю о секциях , о копировании через UBB уже и так давно знаю (это уже не по теме).
А у Вас секция [Code] нету.

Лучше Всем расскажу:
[CODE][Code]
begin
end.
[*Code]
begin
end.
[Code]
begin
end.

Lex_from_Belarus
01-04-2013, 15:09
можно конечно, только сделал проще - не три разных файла с компонентами а один в котором столбиком(обязательно для первой функции, которая закоментирована) или просто перечислены компоненты, те если имя компонента есть в файле, то он будет добален в чеклистбокс, если нет то пропущен
вот пример из двух функций (вторая, которая не закомментирована работает быстрее, но в познавательных целях оставил первую (у меня какая-то странная тяга к массивам и первая на их основе )) »
так тут смысл в том, чтобы уменьшить скачиваемый инсталл с наиболее частыми обновляемыми файлами.

Crazy Noise
01-04-2013, 15:57
alert30, Вижу не часто попадалось.
При применении BB таким образом, очень легко ошибиться и не заметить
[]Code]
var
Buff: String;

function InExternalTextFile(const SearchName: String): Boolean;
begin
if Buff = '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff);
Result := Pos(SearchName, Buff) > 0;
end;

А у Вас секция [code] нету. »Смысл и так понятен, там не только код но и весь скрипт.


Кто-то запрещает использовать http://forum.oszone.net/images/editor/html.gif или http://forum.oszone.net/images/editor/php.gif ?

[Code]
var
Buff: String;

function InExternalTextFile(const SearchName: String): Boolean;
begin
if Buff = '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff);
Result := Pos(SearchName, Buff) > 0;
end;

[Code]
var
Buff: String;

function InExternalTextFile(const SearchName: String): Boolean;
begin
if Buff = '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff);
Result := Pos(SearchName, Buff) > 0;
end;

И ничего не нужно подставлять или изобретать!

Lex_from_Belarus
01-04-2013, 16:14
Lex_from_Belarus, а я сделал сложнее (наверное, хотя для меня этот вариант проще). В зависимости от нахождения файла рядом (ну или ещё где - путь задаётся в шапке скрипта) с инсталлятором будет отображаться компонент (ну или не будет). If components exist
Цитата:
и чтобы xxx1-3.xxx не были просто архивами, чтобы их отдельно нельзя было распаковать. можно ли реализовать такое?
Воспользуйся паролем на архив при сжатии. »
что-то я наверное туплю наверное, но в каждом архиве находится от 2 до 30 компонетов и наверное этот метод не прокатит?

alert30
01-04-2013, 16:20
Crazy Noise, ну это Ваше дело. Тег [CODE] и его закрытия тега я привык вставлять.

habib2302
01-04-2013, 19:41
Доброе время суток.Как сделаль (добавить) в инсталлятор и деинсталлятор Wizard Small Image и Wizard Image без фона?

Johny777
02-04-2013, 20:09
habib2302, .Как сделаль (добавить) в инсталлятор и деинсталлятор Wizard Small Image и Wizard Image без фона? »
Использовать ботву (botva2.dll от South) для прозрачных картинок, но тк тебе ещё и для деинсталятора, то проще всего запихать картинки и библиотеку в ресурсы (в экзешник) и грузить оттуда
Важно: в соглашении вызова импортируемых из библы функциий указать delayload (вроде как стоит по дефолту)

код(целых 87 строк :) ):

#include "botva2.iss"
[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png

[Code]
const
AXEL_YELLOW = $48c1ca;
RT_RCDATA = 10;


function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
lResStream: TResourceStream;
begin
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
finally
lResStream.Free;
Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
end;
end;


procedure InitializeWizard;
var
bPicHandle, bPicHandle2, lPicHandle: THandle;
begin
with WizardForm do
begin
WelcomePage.Color := AXEL_YELLOW;
MainPanel.Color := AXEL_YELLOW;

if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
begin
bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
WizardBitmapImage.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(WelcomePage.Handle);

bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
WizardBitmapImage2.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(FinishedPage.Handle);

lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;

procedure DeinitializeSetup();
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown();
end;

/////////////////////////////////////////////////////////////////////

procedure InitializeUninstallProgressForm();
var
lPicHandle: THandle;
begin
with UninstallProgressForm do
begin
MainPanel.Color := AXEL_YELLOW;

if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;

procedure DeinitializeUninstall();
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown();
end;



скрин:
http://img811.imageshack.us/img811/6926/18189759.png (http://imageshack.us/photo/my-images/811/18189759.png/)

архив с примером и со всем необходимым:
http://sendfile.su/788305

PS: для себя я бы не выносил загрузку ресурсов в функцию function GetFromRes(const ResName, SaveFileName: String): Boolean; с точки зрения оптимизации скорости работы
но думаю так будет проще понять что к чему. Потом поменяешь, если захочешь!

Gnom_aka_Lexander
02-04-2013, 20:28
для себя я бы не выносил загрузку ресурсов в функцию function GetFromRes(const ResName, SaveFileName: String): Boolean; с точки зрения оптимизации скорости работы »
наоборот. несколько мелких функций гораздо оптимальнее одного здоровенного уродливого монстра. единственное, для дополнительной оптимизации есь смысл передавать TStrings со списком ресурсов , дабы не создавать для каждого ресурса отдельный объект TResourceStream. Создали и в цикле по списку выгружаем на диск, с очисткой после выгрузки. Это точно будет быстрее, чем столько-же раз создать и разрушить объект.

habib2302
02-04-2013, 21:14
Johny777, а почему в скрипте указанно 3 изображения?

Gnom_aka_Lexander
02-04-2013, 21:45
habib2302, потому, что изображения на первой и на последней страницах - это разные объекты. плюс смалл имидж - 3 ведь получается?




© OSzone.net 2001-2012