Johny777
19-02-2013, 05:06
semiono, Если я правильно понял, то вот накатал тебе булев функцию замены всех искомых строк/слов на нужную строку/слово в текстовом файле:
function ReplaseStringInTextFile(const FileName, FromString, ToString: String): Boolean;
var
uText: String;
begin
if not FileExists(FileName) then Exit;
if LoadStringFromFile(FileName, uText) then while Pos(FromString, uText) > 0 do StringChange(uText, FromString, ToString);
Result := SaveStringToFile(FileName, uText, False);
end;
procedure InitializeWizard();
begin
if ReplaseStringInTextFile('C:\A.txt', 'VALVE', 'SOFTWARE') then MsgBox('OK', mbError, MB_OK);
end;
==================================================================================================== ========================
Tco 03, Вот только распаковка 7-Zip архивов http://sendfile.su/764485
Вот пример проверки чекбоксов: »
оптимизировал принятие булев значений в методы чекбокса и функцию для Check:
изучай, пригодится :)
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.
[Files]
Source: 1.zip; DestDir: {app}\File1.exe; Check: CheckBoxResult('File1');
Source: 2.zip; DestDir: {app}\File2.exe; Check: CheckBoxResult('File2');
[ Code]
var
NewCheckBox1: TNewCheckBox;
NewCheckBox2: TNewCheckBox;
function CheckBoxResult(const FileName: String): boolean;
begin
case FileName of
'File1': Result := NewCheckBox1.Checked;
'File2': Result := NewCheckBox2.Checked;
end;
end;
procedure NewCheckBox1Click(Sender: TObject);
begin
if not NewCheckBox1.Checked then NewCheckBox2.Checked:= false;
NewCheckBox2.Enabled:= not NewCheckBox1.Checked;
end;
Кому придёт в голову сразу же повторно устанавливать прогу »
ну например не сразу, но у меня в инсталле 4 игры и иногда приходится доустановливать
Сразу же при повторной установке рядом создаётся файл unins000.exe »
это я не учёл - лечится переименованием файла обратно на этапе ssInstall
По мне так зачем это вообще нужно делать »
Ну, как известно с древних времён - каждый извращается по своему :)
==================================================================================================== ==============
insombia,
как сделать новую папку чтобы при нажатии на неё создавалась сразу папка с названием игры »
[Setup]
AppName=777
AppVerName=777
DefaultDirname=C:\Setup
Compression=none
[ code]
var
DirTreeView: TFolderTreeView;
Edit: TEdit;
Reset_Path_Button: TButton;
procedure DirFolderChange(Sender: TObject);
begin
if TFolderTreeView(Sender).Directory <> WizardDirValue then Edit.Text := AddBackslash(TFolderTreeView(Sender).Directory) + '{#SetupSetting("AppName")}' else Edit.Text := TFolderTreeView(Sender).Directory;
Reset_Path_Button.Enabled := Edit.Text <> RemoveBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}'));
end;
procedure BrowseForm_Buttons_OnClick(Sender: TObject);
begin
case TButton(Sender).Caption of
'Reset':
begin
Edit.Text := RemoveBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}'));
TButton(Sender).Enabled := False;
end;
SetupMessage(msgButtonNewFolder):
begin
DirTreeView.CreateNewDirectory('Half-Life 2');
Edit.Text := AddBackslash(DirTreeView.Directory) + '{#SetupSetting("AppName")}';
end;
SetupMessage(msgButtonOK): if Edit.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := Edit.Text;
end;
end;
procedure BrowseClick(Sender: TObject);
var
DefaultInstallPath: String;
BrowseForm: TForm;
begin
DefaultInstallPath := WizardDirValue;
BrowseForm := TForm.Create(nil);
with BrowseForm do
begin
ClientWidth := ScaleX(387);
ClientHeight := ScaleY(364);
Position := poScreenCenter;
Caption := #32 + SetupMessage(msgBrowseDialogTitle);
with TLabel.Create(nil) do
begin
SetBounds(ScaleX(7), ScaleY(4), ScaleX(207), ScaleY(16));
Caption := SetupMessage(msgBrowseDialogLabel);
Parent := BrowseForm;
end;
DirTreeView := TFolderTreeView.Create(nil)
with DirTreeView do
begin
SetBounds(ScaleX(4), ScaleY(52), ScaleX(379), ScaleY(265));
OnChange := @DirFolderChange;
Parent := BrowseForm;
end;
ActiveControl := DirTreeView;
Edit := TEdit.Create(nil);
with Edit do
begin
SetBounds(ScaleX(4), ScaleY(25), ScaleX(379), ScaleY(21));
Text := DirTreeView.Directory;
Parent := BrowseForm;
end;
with TButton.Create(nil) do
begin
SetBounds(ScaleX(4), ScaleY(330), ScaleX(90), ScaleX(22));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonCancel);
Cursor := crHand;
ModalResult := mrCancel;
end;
Reset_Path_Button := TButton.Create(nil)
with Reset_Path_Button do
begin
SetBounds(ScaleX(99), ScaleY(330), ScaleX(90), ScaleY(22));
Parent := BrowseForm;
Caption := 'Reset';
Enabled := Edit.Text <> RemoveBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}'))
Cursor := crHand;
OnClick := @BrowseForm_Buttons_OnClick;
end;
with TButton.Create(nil) do
begin
SetBounds(ScaleX(194), ScaleY(330), ScaleX(90), ScaleY(22));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonNewFolder);
Cursor := crHand;
OnClick := @BrowseForm_Buttons_OnClick;
end;
with TButton.Create(nil) do
begin
SetBounds(ScaleX(289), ScaleY(330), ScaleX(90), ScaleY(22));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonOK);
OnClick := @BrowseForm_Buttons_OnClick;
Cursor := crHand;
ModalResult := mrOk;
end;
DirTreeView.ChangeDirectory(AddBackslash(DefaultInstallPath), True);
if ShowModal = mrOk then WizardForm.DirEdit.Text := Edit.Text else WizardForm.DirEdit.Text := DefaultInstallPath;
Free;
end;
end;
procedure InitializeWizard();
begin
WizardForm.DirBrowseButton.OnClick := @BrowseClick;
end;
======================================================= UPD ============================================================
вот кому интересно - функция для максимального снижения количества оперативки используемой текущим процессом путём выгрузки страниц на жёсткий диск
например с 1900 кб до 400 кб, но это влияет на производительность, так что без необходимости не использовать
можно и настроить используемый размер памяти (увеличить/уменшить) своими цифрами
[Setup]
AppName=TrimWorkingSet
AppVerName=TrimWorkingSet
DefaultDirName={pf}\TrimWorkingSet
[ Code]
function SetProcessWorkingSetSize(hProcess: THandle; dwMinimumWorkingSetSize, dwMaximumWorkingSetSize: DWORD): BOOL; external 'SetProcessWorkingSetSize@kernel32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): BOOL; external 'KillTimer@user32.dll stdcall';
function TrimWorkingSet(): BOOL;
begin
Result := SetProcessWorkingSetSize(GetCurrentProcess, DWORD(-1), DWORD(-1));
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then SetTimer(WizardForm.Handle, 16, 1, CallbackAddr('TrimWorkingSet'));
end;
function ReplaseStringInTextFile(const FileName, FromString, ToString: String): Boolean;
var
uText: String;
begin
if not FileExists(FileName) then Exit;
if LoadStringFromFile(FileName, uText) then while Pos(FromString, uText) > 0 do StringChange(uText, FromString, ToString);
Result := SaveStringToFile(FileName, uText, False);
end;
procedure InitializeWizard();
begin
if ReplaseStringInTextFile('C:\A.txt', 'VALVE', 'SOFTWARE') then MsgBox('OK', mbError, MB_OK);
end;
==================================================================================================== ========================
Tco 03, Вот только распаковка 7-Zip архивов http://sendfile.su/764485
Вот пример проверки чекбоксов: »
оптимизировал принятие булев значений в методы чекбокса и функцию для Check:
изучай, пригодится :)
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.
[Files]
Source: 1.zip; DestDir: {app}\File1.exe; Check: CheckBoxResult('File1');
Source: 2.zip; DestDir: {app}\File2.exe; Check: CheckBoxResult('File2');
[ Code]
var
NewCheckBox1: TNewCheckBox;
NewCheckBox2: TNewCheckBox;
function CheckBoxResult(const FileName: String): boolean;
begin
case FileName of
'File1': Result := NewCheckBox1.Checked;
'File2': Result := NewCheckBox2.Checked;
end;
end;
procedure NewCheckBox1Click(Sender: TObject);
begin
if not NewCheckBox1.Checked then NewCheckBox2.Checked:= false;
NewCheckBox2.Enabled:= not NewCheckBox1.Checked;
end;
Кому придёт в голову сразу же повторно устанавливать прогу »
ну например не сразу, но у меня в инсталле 4 игры и иногда приходится доустановливать
Сразу же при повторной установке рядом создаётся файл unins000.exe »
это я не учёл - лечится переименованием файла обратно на этапе ssInstall
По мне так зачем это вообще нужно делать »
Ну, как известно с древних времён - каждый извращается по своему :)
==================================================================================================== ==============
insombia,
как сделать новую папку чтобы при нажатии на неё создавалась сразу папка с названием игры »
[Setup]
AppName=777
AppVerName=777
DefaultDirname=C:\Setup
Compression=none
[ code]
var
DirTreeView: TFolderTreeView;
Edit: TEdit;
Reset_Path_Button: TButton;
procedure DirFolderChange(Sender: TObject);
begin
if TFolderTreeView(Sender).Directory <> WizardDirValue then Edit.Text := AddBackslash(TFolderTreeView(Sender).Directory) + '{#SetupSetting("AppName")}' else Edit.Text := TFolderTreeView(Sender).Directory;
Reset_Path_Button.Enabled := Edit.Text <> RemoveBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}'));
end;
procedure BrowseForm_Buttons_OnClick(Sender: TObject);
begin
case TButton(Sender).Caption of
'Reset':
begin
Edit.Text := RemoveBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}'));
TButton(Sender).Enabled := False;
end;
SetupMessage(msgButtonNewFolder):
begin
DirTreeView.CreateNewDirectory('Half-Life 2');
Edit.Text := AddBackslash(DirTreeView.Directory) + '{#SetupSetting("AppName")}';
end;
SetupMessage(msgButtonOK): if Edit.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := Edit.Text;
end;
end;
procedure BrowseClick(Sender: TObject);
var
DefaultInstallPath: String;
BrowseForm: TForm;
begin
DefaultInstallPath := WizardDirValue;
BrowseForm := TForm.Create(nil);
with BrowseForm do
begin
ClientWidth := ScaleX(387);
ClientHeight := ScaleY(364);
Position := poScreenCenter;
Caption := #32 + SetupMessage(msgBrowseDialogTitle);
with TLabel.Create(nil) do
begin
SetBounds(ScaleX(7), ScaleY(4), ScaleX(207), ScaleY(16));
Caption := SetupMessage(msgBrowseDialogLabel);
Parent := BrowseForm;
end;
DirTreeView := TFolderTreeView.Create(nil)
with DirTreeView do
begin
SetBounds(ScaleX(4), ScaleY(52), ScaleX(379), ScaleY(265));
OnChange := @DirFolderChange;
Parent := BrowseForm;
end;
ActiveControl := DirTreeView;
Edit := TEdit.Create(nil);
with Edit do
begin
SetBounds(ScaleX(4), ScaleY(25), ScaleX(379), ScaleY(21));
Text := DirTreeView.Directory;
Parent := BrowseForm;
end;
with TButton.Create(nil) do
begin
SetBounds(ScaleX(4), ScaleY(330), ScaleX(90), ScaleX(22));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonCancel);
Cursor := crHand;
ModalResult := mrCancel;
end;
Reset_Path_Button := TButton.Create(nil)
with Reset_Path_Button do
begin
SetBounds(ScaleX(99), ScaleY(330), ScaleX(90), ScaleY(22));
Parent := BrowseForm;
Caption := 'Reset';
Enabled := Edit.Text <> RemoveBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}'))
Cursor := crHand;
OnClick := @BrowseForm_Buttons_OnClick;
end;
with TButton.Create(nil) do
begin
SetBounds(ScaleX(194), ScaleY(330), ScaleX(90), ScaleY(22));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonNewFolder);
Cursor := crHand;
OnClick := @BrowseForm_Buttons_OnClick;
end;
with TButton.Create(nil) do
begin
SetBounds(ScaleX(289), ScaleY(330), ScaleX(90), ScaleY(22));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonOK);
OnClick := @BrowseForm_Buttons_OnClick;
Cursor := crHand;
ModalResult := mrOk;
end;
DirTreeView.ChangeDirectory(AddBackslash(DefaultInstallPath), True);
if ShowModal = mrOk then WizardForm.DirEdit.Text := Edit.Text else WizardForm.DirEdit.Text := DefaultInstallPath;
Free;
end;
end;
procedure InitializeWizard();
begin
WizardForm.DirBrowseButton.OnClick := @BrowseClick;
end;
======================================================= UPD ============================================================
вот кому интересно - функция для максимального снижения количества оперативки используемой текущим процессом путём выгрузки страниц на жёсткий диск
например с 1900 кб до 400 кб, но это влияет на производительность, так что без необходимости не использовать
можно и настроить используемый размер памяти (увеличить/уменшить) своими цифрами
[Setup]
AppName=TrimWorkingSet
AppVerName=TrimWorkingSet
DefaultDirName={pf}\TrimWorkingSet
[ Code]
function SetProcessWorkingSetSize(hProcess: THandle; dwMinimumWorkingSetSize, dwMaximumWorkingSetSize: DWORD): BOOL; external 'SetProcessWorkingSetSize@kernel32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): BOOL; external 'KillTimer@user32.dll stdcall';
function TrimWorkingSet(): BOOL;
begin
Result := SetProcessWorkingSetSize(GetCurrentProcess, DWORD(-1), DWORD(-1));
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then SetTimer(WizardForm.Handle, 16, 1, CallbackAddr('TrimWorkingSet'));
end;