Войти

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


Страниц : 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

nik1967
15-08-2012, 12:58
Yury_Prizrak, никогда не работал с xml документами, может стоит посмотреть XML - Модуль для работы с XML файлами. (http://krinkels.org/showthread.php?t=129)

El Sanchez
15-08-2012, 15:47
Как сначала проверить наличие атрибута 'bbb' »
Yury_Prizrak,

//способ №1
XMLAttributes := XMLNode.attributes;
XMLAttrib := XMLAttributes.getNamedItem('bbb');
if not VarIsEmpty(XMLAttrib) then MsgBox(XMLAttrib.value, mbInformation, MB_OK);

//способ №2
XMLAttrib := XMLNode.getAttribute('bbb');
if not VarIsNull(XMLAttrib) then MsgBox(XMLAttrib, mbInformation, MB_OK);

Ivan_009
15-08-2012, 16:41
Как передвинуть кнопку "завершить" где должна быть кнопка "отмена" :sorry:

Johny777
15-08-2012, 17:39
Ivan_009,
кнопки "завершить" и "установить" нет!
это всё кнопка "далее" текст которой зависит от её, кнопки, расположения на той или иной странице

передвигать кнопки, если их расположение, на разных страницах разное нужно во встроенной процедуре переключения страниц

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpFinished:
begin
/// здесь пишешь координаты кнопки (если ширина и высотра не менялись, то только Top и Left)
end;
end;
end;

также запомни для повышении оптимизации, укорачивания кода и тем самым удалении ненужного кода:
если ты кнопку например на странице приветствия расположил слева снизу
и на следующей странице она там же, то при переходе на след. страницу остаются настройки с предыдущей, те не надо указывать те же координаты пока кнопка там же
пример:

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpWelcome:
begin
WizardForm.NextButton.SetBounds(ScaleX(543), ScaleY(556), ScaleX(87), ScaleY(27));
end;

wpSelectDir:
begin
WizardForm.NextButton.SetBounds(ScaleX(543), ScaleY(556), ScaleX(87), ScaleY(27));
end;
end;
end;


================================== Demo ===================================
настройки переключения как выше(для примера двигаем кнопку далее) :

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
UninstallFilesDir={app}\uninstall


[code]
procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpWelcome: WizardForm.NextButton.Left := ScaleX(5);

wpSelectDir: WizardForm.NextButton.Left := ScaleX(30);

wpReady: WizardForm.NextButton.Left := ScaleX(70);
end;
end;


те же настройки через таймер (не использовать такой метод без нужды)
под расширенную версию:

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
UninstallFilesDir={app}\uninstall


[code]
var
Page_Timer: Longword;

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Pages;
begin
case WizardForm.CurPageID of
wpWelcome: WizardForm.NextButton.Left := ScaleX(5);

wpSelectDir: WizardForm.NextButton.Left := ScaleX(30);

wpReady: WizardForm.NextButton.Left := ScaleX(70);
end;
end;


procedure InitializeWizard;
begin
Page_Timer := SetTimer(WizardForm.Handle, 3, 1, CallbackAddr('Pages')); /// где 3 уникальное число и в другом таймере должно быть другое, чтоб они не пересекались
end;

procedure DeinitializeSetup;
begin
KillTimer(WizardForm.Handle, Page_Timer);
end;

Ivan_009
15-08-2012, 17:49
Johny777, у меня почемуто вышло так

Johny777
15-08-2012, 18:14
Ivan_009,
так сделай:

в процедуре обновления кнопок припиши строки
procedure UpdateButtons();
begin
...
ButtonPanel[n].Left:= UsedButtons[n].Left;
ButtonPanel[n].Top:= UsedButtons[n].Top;
...
end;

if CurPageID = wpFinished then
begin
ButtonPanel[1].Hide;
WizardForm.NextButton.SetBounds(твои координаты);
LoadButtonImage(WizardForm.NextButton, 2);
UpdateButtons;
end;
дело в том что текстурирование не кнопок
а создание панелей поверх и на них картинок с 2-мя лейблами

Ivan_009
16-08-2012, 00:51
Возможно ли на эти кнопки наложить текстуру :search:

Mafioza
16-08-2012, 01:06
как ассоциировать файлы *.apm с программой Autoplay menu builder ? заранее спасибо !!!!!

Ivan_009
16-08-2012, 01:17
Mafioza, при установке программы автоматически ассоциируются :read:

Fifth Intellect
16-08-2012, 01:37
как ассоциировать файлы »
Смотри примеры в справке.
Делается примерно так

Пример 1
[Registry]
Root: HKLM; Subkey: "Software\Classes\.w3m"; ValueType: string; ValueName: ""; ValueData: "WorldEdit.Scenario"; Flags: uninsdeletevalue
Root: HKLM; Subkey: "Software\Classes\WorldEdit.Scenario\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\WorldEdit.exe,2"; Flags: uninsdeletevalue
Root: HKLM; Subkey: "Software\Classes\WorldEdit.Scenario\shell\open\command"; ValueType: string; ValueName: ""; ValueData: "{app}\World Editor.exe ""%1"""; Flags: uninsdeletevalue

Пример 2
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Registry]
Root: HKLM; Subkey: SOFTWARE\Classes\.v64; Check: CheckOption(0)
Root: HKLM; Subkey: SOFTWARE\Classes\.z64; Check: CheckOption(1)
Root: HKLM; Subkey: SOFTWARE\Classes\MP64; ValueType: string; ValueData: My Program; Flags: uninsdeletekey
Root: HKLM; Subkey: SOFTWARE\Classes\MP64\DefaultIcon; ValueType: string; ValueData: {app}\MyProgram.exe,0
Root: HKLM; Subkey: SOFTWARE\Classes\MP64\shell\open\command; ValueType: string; ValueData: {app}\MyProgram.exe %1

[ Code]
var
Page: TInputOptionWizardPage;

procedure InitializeWizard();
begin
Page := CreateInputOptionPage(wpSelectTasks,
'Select File Extension Association', 'Which the file extension you would like to associate?',
'Select the file extension you would like to associate with My Program,'#13#10'then click Next.',
False, False);

{0} Page.Add('.v64');
{1} Page.Add('.z64');

Page.Values[0] := True;
end;

function CheckOption(OptionNum: integer): Boolean;
begin
Result:= Page.Values[OptionNum];
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpReady then
begin
WizardForm.ReadyMemo.Lines.Add('');
if Page.Values[1] or Page.Values[2] then
WizardForm.ReadyMemo.Lines.Add('File extension association:');
if Page.Values[1] then
WizardForm.ReadyMemo.Lines.Add(' .v64');
if Page.Values[2] then
WizardForm.ReadyMemo.Lines.Add(' .z64');
end;
end;



Пример 3

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program

[Types]
Name: full; Description: Полная установка
Name: cu stom_clean; Description: Пользовательская установка; Flags: iscustom

[Components]
Name: main; Description: Основные компоненты; Types: full custom_clean; Flags: checkablealone
Name: main\ass; Description: Установить ассоциации:; Types: full custom_clean; Flags: checkablealone
Name: main\ass\ani; Description: .ani; Types: full custom_clean

[Registry]
Root: HKCU; Subkey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani; ValueType: string; ValueName: ; ValueData: ; Components: main\ass\ani
Root: HKCU; Subkey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani; ValueType: string; ValueName: ProgID; ValueData: IrfanView.ani; Flags: uninsdeletevalue uninsdeletekeyifempty; Components: main\ass\ani

[ Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
String: String;
begin
if (CurStep = ssInstall) and (IsComponentSelected('main\ass\ani') = False) then
if (ExpandConstant('{ reg:HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani,ProgID}') = 'IrfanView.ani') or
(ExpandConstant('{reg:HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani,ProgID}' ) = 'IrfanView.ANI') then
begin
RegDeleteValue(HKEY_CURRENT_ USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani', 'ProgID')
if (RegQueryStringValue(HKEY_CURRENT_ USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani', '', String)) and (String = '') then
RegDeleteValue(HKEY_CURRENT_ USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani', '')
RegDeleteKeyIfEmpty(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani')
end
end;

Первый пример можно так же ассоциировать не только через HKLM но и HKCU. Это уж по личному усмотрению, кому как удобно.

Вкратце:
HKLM - идёт как общая расчитана на всех пользователей, т.е при таком условии даже новый созданный юзер на компе автоматически ассоциируется с программой.
HKCU - В основном расчитана на одного пользователя, т.е при каком пользователе программа ассоциировалась то на нём и останется, на других зверей не повлеяет.

Johny777
16-08-2012, 05:06
Эх Ваня...

в общем так
за основу взял "4 состояния"
1. Используется текстура размером 320х23, где размер одной кнопки 80х23
Теперь пофиг какая, тк картинка растягивается (только растягивать нужно в разумных пределах).
Главное чтоб были 4 кнопки одинакового размера с таким вот расположением картинок-состояний:
;обычное состояние - при наведении - при нажатии - заблокировано

2. тк картинка растягивается размеры кнопок больше не привязаны к константам
const
ButtonWidth = 80;
ButtonHeight = 23;
а это занчит, что кнопки могут быть отличными по размеру от ширины и высоты раздела тектстуры и друг от друга

3. сильно оптимизировал код:
убрал лишнее
переписал грамотнее
заменил процедуры наведения и "уведения" курсора мыши с кнопки (стали быстрее на глаз)

4. две текстуры для кнопок на месте как были

Результат:

;обычное состояние - при наведении - при нажатии - заблокировано
[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
OutputDir=.
BitmapResource=button1:buttonA.bmp|button2:buttonB.bmp
LicenseFile=compiler:License.txt


[ Code]
var
WizardLabel: TLabel;
ButtonPanel: array of TPanel;
ButtonImage: array of TBitmapImage;
ButtonLabel: array of TLabel;
UsedButtons: array of TButton;
ButtonsCount: Integer;

procedure ButtonLabelClick(Sender: TObject);
var
Button: TButton;
n, i: Integer;
begin
i:= TLabel(Sender).Tag;
ButtonImage[i].Left := 0;
for n:=0 to (ButtonsCount-1) do if i = n then Button:= UsedButtons[n];
Button.OnClick(Button);
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-TLabel(Sender).Width*2
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure ButtonLabelOnEnter(Sender: TObject);
var
i: Integer;
begin
i := TLabel(Sender).Tag;
if (ButtonLabel[i].Enabled) then ButtonImage[i].Left:= -TLabel(Sender).Width;
end;

procedure ButtonLabelOnLeave(Sender: TObject);
var
i: Integer;
begin
i := TLabel(Sender).Tag;
if (ButtonLabel[i].Enabled) then ButtonImage[i].Left := 0;
end;


procedure LoadButtonImage(AButton: TButton; Texture: Integer);
var
n: Integer;
begin
n := ButtonsCount;
SetArrayLength(ButtonPanel, n+1);
SetArrayLength(ButtonImage, n+1);
SetArrayLength(ButtonLabel, n+1);
SetArrayLength(UsedButtons, n+1);
UsedButtons[n] := AButton;

ButtonPanel[n]:=TPanel.Create(nil)
with ButtonPanel[n] do
begin
SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height);
Tag := n;
Enabled := AButton.Enabled;
Parent := AButton.Parent;
end;

ButtonImage[n]:=TBitmapImage.Create(nil)
with ButtonImage[n] do
begin
SetBounds(ScaleX(0), ScaleY(0), AButton.Width*4, AButton.Height);
Enabled:=False;
Stretch := True;
Parent:=ButtonPanel[n];
if Texture = 1 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON1');
if Texture = 2 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON2');
end;

ButtonLabel[n]:=TLabel.Create(nil)
with ButtonLabel[n] do
begin
Autosize := True;
Alignment := taCenter;
Tag := n;
Enabled := AButton.Enabled;
Transparent := True;
Font.Color := clBlack;
Caption := AButton.Caption;
Parent := ButtonPanel[n];
end;

with TLabel.Create(nil) do
begin
Tag := n;
Parent := ButtonPanel[n];
Width := AButton.Width;
Height := AButton.Height;
Transparent := True;
OnClick := @ButtonLabelClick;
OnDblClick := @ButtonLabelClick;
OnMouseEnter := @ButtonLabelOnEnter;
OnMouseLeave := @ButtonLabelOnLeave;
OnMouseDown := @ButtonLabelMouseDown;
OnMouseUp := @ButtonLabelMouseUp;
end;

ButtonsCount := ButtonsCount + 1;
end;

procedure UpdateButtons();
var
n: Integer;
begin
for n:=0 to ButtonsCount-1 do
begin
with ButtonPanel[n] do
begin
Visible := UsedButtons[n].Visible;
Enabled := UsedButtons[n].Enabled;
Left:= UsedButtons[n].Left;
Top:= UsedButtons[n].Top;
end;

with ButtonLabel[n] do
begin
Caption := UsedButtons[n].Caption;
Enabled := UsedButtons[n].Enabled;
Left := ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
Top := ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
end;

if not UsedButtons[n].Enabled then ButtonImage[n].Left := - UsedButtons[n].Width*3 else ButtonImage[n].Left := 0;
end;
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
WizardForm.NextButton.Enabled:= True;
UpdateButtons();
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
WizardForm.NextButton.Enabled:= False;
UpdateButtons()
end;

procedure InitializeWizard();
begin
with WizardForm do
begin
Color := clWhite;
LicenseAcceptedRadio.OnClick := @LicenceAcceptedRadioOnClick;
LicenseNotAcceptedRadio.OnClick := @LicenceNotAcceptedRadioOnClick;

NextButton.Width := ScaleX(60);
end;

LoadButtonImage(WizardForm.BackButton, 1)
LoadButtonImage(WizardForm.NextButton, 1)
LoadButtonImage(WizardForm.CancelButton, 2)
LoadButtonImage(WizardForm.DirBrowseButton, 1)
LoadButtonImage(WizardForm.GroupBrowseButton, 2)
end;

procedure CurPageChanged(CurPageID: Integer);
begin
UpdateButtons();

if CurPageID = wpFinished then
begin
ButtonPanel[1].Hide;
WizardForm.NextButton.Left := ScaleX(60);
LoadButtonImage(WizardForm.NextButton, 2);
UpdateButtons;
end;
end;


скрин:
http://img338.imageshack.us/img338/3310/94008229.png (http://imageshack.us/photo/my-images/338/94008229.png/)

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

==================== Важно!

в изначальной версии этого скрипта тектурирование такое
сначала создаётся панель
на ней картинка
сверху лейбл прозрачный на всю панель на котрый мы: нажимаем, дважды нажимаем, наводим, уводим
а сверху другой по центру с надписью типа "Обзор" или "Далее "

так вот у двух последних лейблов и были эвенты : нажимаем, наводим, уводим
Почему?
да потому то что сначала создавался тот что на всю панель, а потом надпись и надпись ложилась сверху
у меня в коде этого нет, тк согдание идёт по порядку от begin до end;
те у меня сначала создаётся лейбл с надписью а потом другой - на всю панель - и он перекрывает тот
Если б не это то код выше был бы невозможен тк используется TLabel(Sender).Width
те берём размер посыльного лейбла
вот и получалось, что при наведении на большой всё в порядке, а при наведении на маленький ерунда

другой пример
у меня в инсталле на одной странице есть спидбаттоны и накладывается прозрчный лейбл на участок под ними за который можно хвататься мышью
но так получалось, что он перекрывал их и них просто нельзя было нажать - они становились частью окружения не являясь больше контролами

долго не мог докумекать почему пока не записал создание лейбла до создания кнопок

я говорю это потому что мне кажется это не все знают, а это важно!

Ivan_009
16-08-2012, 14:29
Johny777, а возможно или нет наложить изображение через bmp на чекбоксы :unsure:

Johny777
16-08-2012, 14:59
Ivan_009, в шапке пример El Sanchez-а "Создание кастомного чекбокса"
а вообще думаю можно доработать текстурирование кнопок под эти цели
не уверен

Ivan_009
17-08-2012, 00:22
Как добавить крестик и кнопку свернуть вот сюда без использования ботвы подскажите кто знает заранее спасибо... :search:

Johny777
17-08-2012, 02:59
Ivan_009,
3 способа:

1. использовать TNewButton с текстом "X" и "-"
(С текстурированием страницей назад можно добиться уровня 2-го способа)
код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.


[ Code]
procedure Close_or_Minimize(Sender: TObject);
begin
case TNewButton(Sender).Caption of
'X': WizardForm.Close;
'-': SendMessage(WizardForm.Handle,$112,61472,0);
end;
end;

procedure InitializeWizard;
begin
with WizardForm do
begin
OuterNotebook.Hide;
BorderStyle := bsNone;
Color := $506a5a;
end;

with TNewButton.Create(WizardForm) do
begin
Parent := WizardForm;
SetBounds(WizardForm.Width - ScaleX(25),ScaleY(10),ScaleX(16),ScaleY(16));
Caption := 'X';
OnClick := @Close_or_Minimize;
ShowHint := True;
Hint := 'Закрыть';
end;

with TNewButton.Create(WizardForm) do
begin
Parent := WizardForm;
SetBounds(WizardForm.Width - ScaleX(40),ScaleY(10),ScaleX(16),ScaleY(16));
Caption := '-';
OnClick := @Close_or_Minimize;
ShowHint := True;
Hint := 'Свернуть';
end;
end;

2. использовать TNewSpeedButton с глифами (советую)
код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

BitmapResource=Mini:min.bmp|Close:Close.bmp


[ Code]
procedure Close_or_Minimize(Sender: TObject);
begin
case TNewSpeedButton(Sender).Hint of
'Закрыть': WizardForm.Close;
'Cвернуть': SendMessage(WizardForm.Handle,$112,61472,0);
end;
end;

procedure InitializeWizard;
begin
with WizardForm do
begin
OuterNotebook.Hide;
BorderStyle := bsNone;
Color := $506a5a;
end;

with TNewSpeedButton.Create(nil) do
begin
Parent := WizardForm;
SetBounds(WizardForm.Width - ScaleX(50),ScaleY(10),ScaleX(16),ScaleY(16));
Glyph.LoadFromResourceName(HInstance, '_IS_MINI');
ShowHint := True;
Hint := 'Cвернуть';
OnClick := @Close_or_Minimize;
end;

with TNewSpeedButton.Create(nil) do
begin
Parent := WizardForm;
ThemeEnabled := False;
SetBounds(WizardForm.Width - ScaleX(25),ScaleY(10),ScaleX(16),ScaleY(16));
Glyph.LoadFromResourceName(HInstance, '_IS_CLOSE');
ShowHint := True;
Hint := 'Закрыть';
OnClick := @Close_or_Minimize;
end;
end;

архив с кодом и картинками-примерами: http://sendfile.su/650884

3. использовать ImageButton (лучший вариант), те картинку с событиями как при текстурировании
извиняй
рисованием мне сейчас заниматься некогда
так что сам попробуй разобрать, будут вопросы спрашивай
пример такой кнопки это: ...\Inno Setup 5\Examples\Example_MouseEvent_ImgBtn.iss
там и наведение и нажатие и пр.
можно такую кнопку навернуть...
... не хуже чем в аэро стиле семёрки (свечение)!
но не думаю, что стоит с ним заморачиваться, если только ты не делаешь инсталл типа StarCraft 2 за авторством South

ChVL
17-08-2012, 11:23
Чтобы положить файлы в папку "Мои видеозаписи" устанавливаю путь к этой папке:
[Сode]
const
MAX_PATH = 260;
CSIDL_MYVIDEO = $0e;
function SHGetSpecialFolderPath(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL;
external 'SHGetSpecialFolderPathA@shell32.dll stdcall';

function GetSpecialPath(CSIDL: Word): string;
var
s: string;
begin
SetLength(s, MAX_PATH);
if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, True) then s := '';
Result:= PChar(s);
end;
Скрипт отрабатывает нормально, путь создаётся.
Прописываю путь к этой папке:
[Files]
Source: {code_GetSpecialPath}\MyProg; DestDir: {code:GetSpecialPath}\MyProg
Компилятор, однако, ругается на ошибку в строке:
function GetSpecialPath(CSIDL: Word): string;
пишет:
Invalid prototype for 'GetSpecialPath'

Как правильно прописать?

Gnom_aka_Lexander
17-08-2012, 11:49
ChVL, вот так:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: {code_GetSpecialPath}\MyProg; DestDir: {code:GetVideoPath}\MyProg

[*code]
const
MAX_PATH = 260;
CSIDL_MYVIDEO = $0e;
function SHGetSpecialFolderPath(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL;
external 'SHGetSpecialFolderPathA@shell32.dll stdcall';

function GetSpecialPath(CSIDL: Word): string;
var
s: string;
begin
SetLength(s, MAX_PATH);
if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, True) then s := '';
Result:= PChar(s);
end;

function GetVideoPath(s: string): string;
begin
Result:= GetSpecialPath(CSIDL_MYVIDEO);
end;
Протип выглядит так: function MyStrFunc(s: string): string;

ChVL
17-08-2012, 12:57
Gnom_aka_Lexander,
Компиляция прошла, однако что-то не срослось при установке программы:

http://rghost.ru/39833947/image.png (http://rghost.ru/39833947.view)

R.i.m.s.k.y.
17-08-2012, 13:00
ChVL, может антивирь блокирует?

ChVL
17-08-2012, 13:03
может антивирь блокирует? »
У меня его нет в принципе.




© OSzone.net 2001-2012