PDA

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


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

audiofeel
22-05-2014, 21:32
если игра устанавливается по умолчанию в C:\GameXP\AccessPoint\installed\World of Dragons\, а файл запуска "лежит" по пути
C:\GameXP\AccessPoint\installed\World of Dragons\WOD.exe, то и "рабочая папка у него находится там же = C:\GameXP\AccessPoint\installed\World of Dragons
а что у вас указанно в #define {#MyAppName} ?????
; Ñêðèïò ñîçäàí ÷åðåç Ìàñòåð Inno Setup Script.
; ÈÑÏÎËÜÇÓÉÒÅ ÄÎÊÓÌÅÍÒÀÖÈÞ ÄËß ÏÎÄÐÎÁÍÎÑÒÅÉ ÈÑÏÎËÜÇÎÂÀÍÈß INNO SETUP!

#define MyAppName "World of Dragons"
#define MyAppVersion "1.5"
#define MyAppPublisher "GameXP"
#define MyAppURL "http://www.ñàéò.com/"
#define MyAppExeName "WOD.exe"

[Setup]
; Ïðèìå÷àíèå: Çíà÷åíèå AppId èäåíòèôèöèðóåò ýòî ïðèëîæåíèå.
; Íå èñïîëüçóéòå îäíî è òîæå çíà÷åíèå â ðàçíûõ óñòàíîâêàõ.
; (Äëÿ ãåíåðàöèè çíà÷åíèÿ GUID, íàæìèòå Èíñòðóìåíòû | Ãåíåðàöèÿ GUID.)
AppId={{5579DEF8-4821-43B2-B20A-F0768A5F1284}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\GameXP\AccessPoint\installed\World of Dragon
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
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
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0,6.1

[Files]
; Ïðèìå÷àíèå: Íå èñïîëüçóéòå "Flags: ignoreversion" äëÿ ñèñòåìíûõ ôàéëîâ
Source: WOD.exe; DestDir: {app}

[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL}
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: quicklaunchicon

[Run]
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent



http://file.sampo.ru/nkz7n3/

Irenis
22-05-2014, 21:35
надо наверняка отследить какие изменения вносит в реестр веб установщик »
То есть нужно просто все, что найду в реестре, связанное в веб установщиком, экспортировать и потом вставить в скрипт? Или что то еще делать? Просто насчет реестра мне тоже не все понятно. Я уже выше писала, что уроки всякие смотрела и читала про создание установщиков. Так где то говорится, что файлы (или значения правильно?) реестра просто вставить в скрипт. А где то сказано, что этот реестр нужно вставлять через ISTool и еще там какие то команды выполнять. :unsure:

а что у вас указанно в #define {#MyAppName} ????? »
#define MyAppName "World of Dragons"

audiofeel
22-05-2014, 21:53
вот честно, про эту игру я ни чего не знаю, иногда достаточно указать один ключь, иногда необходимо наличие пристутствия определенного файла в какой нить папке, чаще скрытой
давайте сперва разберемся почему ярлык не работает, а потом уже нужно разбираться почему не видит веб установщик что игра уже установленна
выложите скрипт на файлообменник

Irenis
22-05-2014, 22:12
если игра устанавливается по умолчанию в C:\GameXP\AccessPoint\installed\World of Dragons\ »
давайте сперва разберемся почему ярлык не работает »
Знаете, вы меня натолкнули на мысль, что я изначально все неправильно сделала. Просто у меня уже в C:\GameXP\AccessPoint куча папок и файлов, а сама игра ведь и правда в C:\GameXP\AccessPoint\installed\World of Dragons, а то что в AccessPoint это файлы веб установщика, я так понимаю. И архивировать нужно было все что в папке World of Dragons, а не в папке AccessPoint, как сделала я. Может поэтому не работает?

saurn
22-05-2014, 22:20
Irenis, audiofeel, рабочая папка указывает на то, какая папка будет сделана текущей при запуске приложения, в которой рассположены определенные файлы. И это не всегда та папка, в которой находится ексишник.

Dodakaedr
22-05-2014, 22:28
Всем привет. Мне нужно реализовать 2 чекбокса на странице "Каталог" в установщике.
Т.е. у нас есть полоска выбора пути (куда устанавливать наши компоненты) и нужно чтобы под ней было 2 чекбокса.
1 чекбокс: Удаление старых компонентов. Т.е. у меня есть папка res_mods... Нужно чтобы при выборе этого чекбокса очищало папку res_mods от всего содержимого.
2 чекбокс: Бекап файлов. У меня есть папка res_mods, но допустим в ней нужные компоненты и я хочу их сохранить. То при выборе этого чекбокса будет создана копия папки res_mods которая будет называться old_res_mods. »
Попробуйте вот так:
#include "SHFileOperation.iss"

[Setup]
AppName=Моя программа
AppVersion=1.5
DefaultDirName={pf}\Моя программа

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

[ Code]
var
ModCheck, BackupCheck: TNewCheckBox;

procedure InitializeWizard;
begin
ModCheck:= TNewCheckBox.Create(PageFromID(wpSelectDir));
ModCheck.Width := PageFromID(wpSelectDir).SurfaceWidth;
ModCheck.Parent := PageFromID(wpSelectDir).Surface;
ModCheck.Caption:='Удалить все старые моды';
ModCheck.left:=wizardForm.DirEdit.left;
ModCheck.Top:=wizardForm.DirEdit.top + ScaleY(30);

BackupCheck:= TNewCheckBox.Create(PageFromID(wpSelectDir));
BackupCheck.Width := PageFromID(wpSelectDir).SurfaceWidth;
BackupCheck.Parent := PageFromID(wpSelectDir).Surface;
BackupCheck.Caption:='Сохранить резервную копию старых модов';
BackupCheck.left:=wizardForm.DirEdit.left;
BackupCheck.Top:=ModCheck.top + ScaleY(30);
end;

procedure CurStepChanged (CurStep: TSetupStep);
begin
if CurStep=ssInstall then
if BackupCheck.Checked then
begin
CopyDir(ExpandConstant('{app}\res mods\'),ExpandConstant('{app}\old res mods'));
end;

if ModCheck.Checked then
begin
DelTree(ExpandConstant('{app}\res mods\*'), False, True, True);
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\old res mods\'), ExpandConstant('{app}\res mods'));
RemoveDir(ExpandConstant('{app}\old res mods'));
end;
end;

Kashtan007
23-05-2014, 00:02
Dodakaedr, спасибо большое)

saneksanek
23-05-2014, 05:48
Уважаемые форумчане.Может кто-то помочь из данного кода вырезать код плеера.Как не ковырял все с ошибкой идет
Что требуется http://s006.radikal.ru/i214/1405/ed/abaa971a0aae.png
Сам код:http://yadi.sk/d/wSVC64JhR47hf

Dodakaedr
23-05-2014, 07:51
saneksanek, Выложите все файлы необходимые для работы вашего скрипта, потому что никто не будет сам искать всякие dll-ки, mp3 файлы и т.д.

Dodakaedr
23-05-2014, 08:14
Как место серых окон (Inner Notebook и Inner Page) на страницах установщика поставить изображение (фон)? »
А легче способа нету? »
Возможно такой подойдет:
#include "WizardFormResise.iss"

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
WizardImageFile=Fon.bmp
OutputBaseFilename=2

[Files]
Source: IsPicture_for_all.dll; Flags: dontcopy
Source: Fon.bmp; Flags: dontcopy


[ Code]
procedure Initialize(AhWnd,BhWnd:hWnd);external 'Initialize@{tmp}\IsPicture_for_all.dll stdcall delayload';
procedure Deinitialize;external 'Deinitialize@{tmp}\IsPicture_for_all.dll stdcall delayload';
function NewFont(Height:Integer;thickness,italic,underline,strikeout:DWORD;name:String):hWnd;external 'NewFont@{tmp}\IsPicture_for_all.dll stdcall delayload';
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';

const
TfonColor = $000008; // Цвет фона $000008 - не изменять!
TfontColor = $ffffff; // Цвет тeкста

Var Font1,Font2:hWnd;


function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('IsPicture_for_all.dll');
ExtractTemporaryFile('fon.bmp');
Result:=True;
end;

procedure InitializeWizard();
begin
Font1:= NewFont(16,600,0,0,0,'Comic Sans MS');
Font2:= NewFont(24,900,0,0,0,'Tahoma');

WizardForm.WizardSmallBitmapImage.Hide;
WizardForm.WizardBitmapImage2.Hide;
WizardForm.DirEdit.AutoSelect:=False;

WizardForm.WelcomePage.Color:=TfonColor;// не изменять!
WizardForm.FinishedPage.Color:=TfonColor;
WizardForm.InnerPage.Color:=TfonColor;
WizardForm.DirEdit.Color:=TfonColor;
WizardForm.ReadyMemo.Color:=TfonColor;
WizardForm.MainPanel.Color:=TfonColor;

WizardForm.Font.Handle:=Font1;
WizardForm.WelcomeLabel1.Font.Handle := Font2;
WizardForm.FinishedHeadingLabel.Font.Handle := Font2;
WizardForm.PageNameLabel.Font.Handle := Font1;
WizardForm.PageNameLabel.Font.Color := clGreen;
WizardForm.Font.Color:=TfontColor;

WizardForm.SelectDirBitmapImage.BackColor := clNone;
WizardForm.SelectDirBitmapImage.ReplaceColor := clBtnFace;

WizardForm.WizardBitmapImage.Parent := MainForm;
WizardForm.WizardBitmapImage.SetBounds(0, 0, WizardForm.ClientWidth, WizardForm.ClientHeight);

Initialize(WizardForm.Handle,MainForm.Handle);
end;

procedure DeinitializeSetup();
begin
Deinitialize;
end;

Dodakaedr
23-05-2014, 08:42
saneksanek, Есть вот такой пример по вашему вопросу:
#include "botva2.iss"
#include "BASS_Module.iss"

[Setup]
AppName=BassExample
AppVerName=BassExample
DefaultDirName={pf}\BassExample

[Files]
Source: compiler:Dll Pack\BASS.dll; Flags: dontcopy
Source: compiler:Dll Pack\CallbackCtrl.dll; Flags: dontcopy
Source: compiler:Dll Pack\botva2.dll; Flags: dontcopy
Source: BASS_Files\*; Flags: dontcopy
//Source: music.mp3; DestDir: {tmp}; Flags: dontcopy

[ code]
procedure InitializeWizard();
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('volmax.png');
ExtractTemporaryFile('volmin.png');
ExtractTemporaryFile('volpb.png');
ExtractTemporaryFile('voldote.png');
//ExtractTemporaryFile('Music.mp3');

//BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
//Можно добавить в инсталл несколько песен
//BASS_Init(ExpandConstant('{tmp}\*')) //Поиск по маске

//Создаем регулятор громкости
BASS_CreateMediaPlayer(WizardForm, '{tmp}\volmax.png', '{tmp}\volmin.png', '{tmp}\volpb.png', '{tmp}\voldote.png', 20, 325)
end;

procedure DeinitializeSetup();
begin
//BASS_DeInit; //Освобождаем процесс
gdipShutdown
end;
файлы.rar (http://dodakaedr.spaces.ru/files/?r=main%2Fview&Li=690572&Lii=50204624&Link_id=721177&Lt=1&Read=50204624&Sn=1&sid=::sid::)

El Sanchez
23-05-2014, 10:13
Как место серых окон (Inner Notebook и Inner Page) на страницах установщика поставить изображение (фон)? »
Способов несколько:
1. Самый распространенный способ - скрыть OuterNotebook, влепить фоновую картинку на форму, сверху создать аналоги скрытых статиков (TNewStaticText -> TLabel), менять родителя остальных контролов (TBitmapImage, TEdit, TNewCheckListBox и т.д.) в нужное время для имитации перехода между страницами.
2. Сабклассинг (http://ru.wikipedia.org/wiki/Сабклассинг). Переопределить оконные процедуры WizardForm, страниц OuterNotebook (включая вложенные) на свои и отрисовывать фон самому. В TWizardForm и TNewNotebookPage фон рисуется с помощью системной кисти цвета clBtnFace, которую можно представить как узорчастую кисть цвета clBtnFace размером в 1х1 пикселя. Имея картинку, можно создать узорчастую кисть на ее основе, и рисовать фон ею вместо системной в своей оконной процедуре. В примере создается кисть на основе картинки (я не стал создавать кисть на основе картинки с размерами клиентской части формы, взял WizardSmallBitmapImage, чтобы увидеть воочию как система заливает фон кистью), переопределяются оконные процедуры для TWizardForm и TNewNotebookPage, в оконных процедурах фон рисуется созданной кистью при получении сообщения WM_ERASEBKGND.

[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no

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

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
GWL_USERDATA = (-21);
GWL_WNDPROC = (-4);
WM_ERASEBKGND = $0014;
GA_ROOT = 2;

var
g_hBackgroundBrush: THandle;
g_pWndProc, g_pNotebookPageWndProc: Longint;

function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external 'CallWindowProc{#A}@user32.dll stdcall';
function CreatePatternBrush(hbmp: HBITMAP): THandle; external 'CreatePatternBrush@gdi32.dll stdcall';
function DeleteObject(hObject: THandle): BOOL; external 'DeleteObject@gdi32.dll stdcall';
function GetUpdateRect(hWnd: HWND; var lpRect: TRect; bErase: BOOL): BOOL; external 'GetUpdateRect@user32.dll stdcall';
function GetAncestor(hwnd: HWND; gaFlags: UINT): HWND; external 'GetAncestor@user32.dll stdcall';
function FillRect(hDC: Longint; const lprc: TRect; hbr: Longint): Integer; external 'FillRect@user32.dll stdcall';
function MapWindowPoints(hWndFrom, hWndTo: HWND; var lpPoints: TPoint; cPoints: UINT): Integer; external 'MapWindowPoints@user32.dll stdcall';
function SetBrushOrgEx(hdc: Longint; nXOrg, nYOrg: Integer; var lppt: TPoint): BOOL; external 'SetBrushOrgEx@gdi32.dll stdcall';

//////////////////////////////////////////////////////////////////////////
function WndProc(hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
var
rc: TRect;
begin
case Msg of
WM_ERASEBKGND: begin
GetUpdateRect(hWnd, rc, False);
FillRect(wParam, rc, g_hBackgroundBrush);
Result := 1;
end;
else
Result := CallWindowProc(GetWindowLong(hWnd, GWL_USERDATA), hWnd, Msg, wParam, lParam);
end;
end;

//////////////////////////////////////////////////////////////////////////////////////
function NotebookPageWndProc(hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
var
pt: TPoint;
rc: TRect;
begin
case Msg of
WM_ERASEBKGND: begin
MapWindowPoints(hWnd, GetAncestor(hWnd, GA_ROOT), pt, 1);
SetBrushOrgEx(wParam, -pt.x, -pt.y, pt);
GetUpdateRect(hWnd, rc, False);
FillRect(wParam, rc, g_hBackgroundBrush);
Result := 1;
end;
else
Result := CallWindowProc(GetWindowLong(hWnd, GWL_USERDATA), hWnd, Msg, wParam, lParam);
end;
end;

//////////////////////////////////////////////////////////
procedure SubclassControlProc(const Control: TWinControl);
var
i: Integer;
begin
for i := 0 to Control.ControlCount-1 do if Control.Controls[i] is TWinControl then
begin
// subclass notebook page
if Control.Controls[i] is TNewNotebookPage then with TNewNotebookPage(Control.Controls[i]) do
if GetWindowLong(Handle, GWL_USERDATA) = 0 then
SetWindowLong(Handle, GWL_USERDATA, SetWindowLong(Handle, GWL_WNDPROC, g_pNotebookPageWndProc));

if TWinControl(Control.Controls[i]).ControlCount > 0 then
SubclassControlProc(TWinControl(Control.Controls[i]));
end;
end;

///////////////////////////////////
procedure SubclassWizardFormProc();
begin
// callback proc
if g_pWndProc = 0 then g_pWndProc := CallbackAddr('WndProc');
if g_pNotebookPageWndProc = 0 then g_pNotebookPageWndProc := CallbackAddr('NotebookPageWndProc');

// subclass WizardForm
if GetWindowLong(WizardForm.Handle, GWL_USERDATA) = 0 then
SetWindowLong(WizardForm.Handle, GWL_USERDATA, SetWindowLong(WizardForm.Handle, GWL_WNDPROC, g_pWndProc));

// subclass controls
SubclassControlProc(WizardForm);
end;

////////////////////////////////////////////////////////////
procedure UnSubclassControlProc(const Control: TWinControl);
var
i: Integer;
begin
for i := 0 to Control.ControlCount-1 do if Control.Controls[i] is TWinControl then
begin
// unsubclass notebook page
if (Control.Controls[i] is TNewNotebookPage) then with TNewNotebookPage(Control.Controls[i]) do
if GetWindowLong(Handle, GWL_USERDATA) > 0 then
SetWindowLong(Handle, GWL_WNDPROC, GetWindowLong(Handle, GWL_USERDATA));

if TWinControl(Control.Controls[i]).ControlCount > 0 then
UnSubclassControlProc(TWinControl(Control.Controls[i]));
end;
end;

/////////////////////////////////////
procedure UnSubclassWizardFormProc();
begin
// unsubclass controls
UnSubclassControlProc(WizardForm);

// unsubclass WizardForm
if GetWindowLong(WizardForm.Handle, GWL_USERDATA) > 0 then
SetWindowLong(WizardForm.Handle, GWL_WNDPROC, GetWindowLong(WizardForm.Handle, GWL_USERDATA));
end;

/////////////////////////////
procedure InitializeWizard();
begin
// create pattern brush
g_hBackgroundBrush := CreatePatternBrush(WizardForm.WizardSmallBitmapImage.Bitmap.Handle);

// subclass
SubclassWizardFormProc();
end;

//////////////////////////////
procedure DeinitializeSetup();
begin
// unsubclass
UnSubclassWizardFormProc();

// delete pattern brush
if g_hBackgroundBrush <> 0 then DeleteObject(g_hBackgroundBrush);
end;


Когда доходит до строчки, где происходит вызов функции, падает с ошибкой "Could not call proc". Похоже на ошибку инициализации, но если смотреть в дебагере, то на этот момент все длл уже извлечены.
Не подскажете, в чем может быть проблема? »
Shkutu, с типами параметров что-то напутали в GetCRMUserGuid. Попробуйте сменить PAnsiChar на String.

Shkutu
23-05-2014, 12:05
El Sanchez, в каком смысле напутала?) Библиотека моя, и в качестве параметров там pchar, который в инно как раз pansichar. А в самой библиотеке (она на fpc) юзать стринги не получается

saurn
23-05-2014, 12:27
Shkutu, залейте скрипт с дллками. Гляну.

Shkutu
23-05-2014, 14:32
saurn, вот, несколько обрезанный, а то там много было
http://www.ex.ua/290099597218

altef_4
23-05-2014, 14:38
Shkutu

[Files]
...
Source: "mslib.dll"; Flags: dontcopy
Source: "dblib.dll"; Flags: dontcopy
Source: "libiconv.dll"; Flags: dontcopy
;2 последние длл требуются для работы функции из 1й длл, я их просто кладу рядом с 1й

[Сode]

function GetCRMUserGuid(dbname, host, user, pass:PansiChar):PansiChar;
external 'GetCRMUserGuid@{tmp}\mslib.dll stdcall delayload setuponly';

procedure InitializeWizard;
var s: string;
begin
ExtractTemporaryFile('dblib.dll');
ExtractTemporaryFile('libiconv.dll');
ExtractTemporaryFile('mslib.dll');
s:=GetCRMUserGuid('DB', '127.0.0.1:1433', 'sa', '111');
...
end;

Alloc
23-05-2014, 14:58
Приветствую всех! Уважаемые, подскажите как реализовать задачу:

Вообщем инсталлятор двуязычный: русский/английский (выберается сразу).
Необходимо как-то определить какой язык был выбран и в соответствие с этим выбором дать знать инсталлятору какой из файлов грузить в "InfoBeforeFile"


#ifdef InfoBefore
#if {language} = "english"
InfoBeforeFile=InfoB_E.rtf
#if {language} = "russian"
InfoBeforeFile=InfoB_R.rtf
#endif


что то типо это.. надеюсь вы поняли мою мысль. Помогите разобраться пожалуйста. Заранее спасибо

Shkutu
23-05-2014, 15:16
altef_4, вместо files {tmp} указать? Так я уже пробовала, не помогает
Alloc, попробуйте так
[Languages]
Name: "English"; MessagesFile: "compiler:Default.isl"; InfobeforeFile: "InfoB_E.rtf"
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"; InfobeforeFile:"InfoB_R.rtf

saurn
23-05-2014, 15:44
Shkutu, смотрите в сторону библиотеки, что то вы напутали, при ее создании.

El Sanchez
23-05-2014, 16:21
Библиотека моя, и в качестве параметров там pchar »
Shkutu, почитайте здесь (http://www.cyberguru.ru/delphi/strings-details-page8.html), пример в конце как раз ваш случай.




© OSzone.net 2001-2012