[Code] var MyExit: TSetupForm; YesBtn, NoBtn: HWND;
function InitializeSetup:boolean; begin if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll'); if not FileExists(ExpandConstant('{tmp}\innocallback.dll')) then ExtractTemporaryFile('CallbackCtrl.dll'); Result := True; end;
procedure DeinitializeSetup(); begin gdipShutdown; end;
procedure ButtonOnClick(hBtn:HWND); begin case hBtn of YesBtn: begin MyExit.ModalResult:= mrYes; end; NoBtn: begin MyExit.ModalResult:= mrNo; end; end; end;
procedure MyExitMessage(); var MyIcon: String; Font: TFont; begin MyExit := CreateCustomForm(); with MyExit do begin Position := poScreenCenter; ClientWidth := WizardForm.Width; ClientHeight := WizardForm.Height div 2; Caption := ExpandConstant(SetupMessage(msgExitSetupTitle)); Color := clBlack;
MyIcon := ExpandConstant(AddBackSlash('{tmp}') + 'WizModernSmallImage.bmp'); if not FileExists(MyIcon) then ExtractTemporaryFile(ExtractFileName(MyIcon));
with TBitmapImage.Create(MyExit) do begin Stretch := True; Left := ScaleX(10); Top := ScaleY(20); Width := 55; Height := 55; Bitmap.LoadFromFile(MyIcon); Parent := MyExit; end;
with TNewStaticText.Create(MyExit) do begin Left := ScaleX(110); Top := ScaleY(20); Width := MyExit.Width - ScaleX(115); Height := MyExit.Height div 2; AutoSize := False; WordWrap := True; Caption := ExpandConstant(SetupMessage(msgExitSetupMessage)); Parent := MyExit; Font.Color := clWhite; end; end;
Font := TFont.Create; Font.Size := WizardForm.CancelButton.Font.Size;
function InitializeSetup: Boolean; begin if not FileExists(ExpandConstant('{tmp}\isskin.dll')) then ExtractTemporaryFile('isskin.dll'); if not FileExists(ExpandConstant('{tmp}\Skin.cjstyles')) then ExtractTemporaryFile('Skin.cjstyles'); LoadSkin(ExpandConstant('{tmp}\Skin.cjstyles'), ''); Result:=true; end;
procedure MyExitMessage(); var MyIcon: String; begin MyExit := CreateCustomForm(); MyExit.Position := poScreenCenter; MyExit.ClientWidth := WizardForm.Width; MyExit.ClientHeight := WizardForm.Height div 2; MyExit.Caption := ExpandConstant(SetupMessage(msgExitSetupTitle));
MyIcon := ExpandConstant(AddBackSlash('{tmp}') + '18.ico'); if not FileExists(MyIcon) then ExtractTemporaryFile(ExtractFileName(MyIcon));
with TNewIconImage.Create(MyExit) do begin SetBounds(ScaleX(30), ScaleY(30), ScaleX(55), ScaleY(55)); Icon.LoadFromFile(MyIcon); Parent := MyExit; end;
with TNewStaticText.Create(MyExit) do begin SetBounds(ScaleX(110), ScaleY(20), ScaleX(MyExit.Width - ScaleX(115)), ScaleY(MyExit.Height div 2)); AutoSize := False; WordWrap := True; Caption := ExpandConstant(SetupMessage(msgExitSetupMessage)); Parent := MyExit; end;
Form := TBitmapImage.Create(WizardForm); with Form do begin Parent := WizardForm; Left := ScaleX(0); Top := ScaleY(0); Width := ScaleX(600); Height := ScaleY(490); Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\form.bmp') end; end;
В: А можно тоже самое, но с использованием Botva2.dll О: Да, здесь пример с PNG-изображением, но так же подходят и другие форматы:
function InitializeSetup:boolean; begin if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll'); if not FileExists(ExpandConstant('{tmp}\innocallback.dll')) then ExtractTemporaryFile('innocallback.dll'); Result:=True; end;
procedure InitializeWizard; begin with WizardForm do begin BorderStyle:=bsNone; Bevel.Hide; InnerNotebook.Hide; OuterNotebook.Hide; SetBounds(ScaleX(0), ScaleY(0), ScaleX(600), ScaleY(490)); Position:=poScreenCenter; BackButton.Top := ScaleY(435); NextButton.Top := ScaleY(435); CancelButton.Top := ScaleY(435); end;
procedure CurPageChanged(CurPageID: Integer); begin ImgApplyChanges(WizardForm.Handle); end;
procedure DeinitializeSetup; begin gdipShutdown; end;
Вырезаемый цвет(везде): $00FF00 (зеленый) Архив с файлами и скриптами: Скачать UPD (5.05.2011): Удалил дубликат скрипта. Edison007, второй и третий примеры по функционалу идентичны. Процедура SetRgn делает не совсем то что ты думаешь.Shegorat Кто не с нами, тот в запое...
Сообщение отредактировал Edison007 - Среда, 04.05.2011, 23:04
Дата: Понедельник, 02.05.2011, 22:48 | Сообщение # 19
Злой модер
Модератор
Сообщений: 186
Статус: Offline
В: Возможно-ли на WizardForm.PageNameLabel.Caption и WizardForm.PageDescriptionLabel сменить на надписи с другой страницы? О: Можно использовать для этого функцию SetupMessage(const ID: TSetupMessageID): String; Получается весело:
[Setup] AppName=My Application AppVersion=1.5 DefaultDirName={pf}\My Application [Code] procedure CurPageChanged(CurPageID: Integer); var S1,S: String; begin S := SetupMessage(msgWizardSelectProgramGroup); S1 := SetupMessage(msgSelectStartMenuFolderDesc); case CurPageID of wpSelectDir: begin WizardForm.PageNameLabel.Caption:=S; WizardForm.PageDescriptionLabel.Caption:=S1; end; end; end;
В: Как сделать в инсталляторе "Бегущую строку"? О: Так
Code
[Setup] AppName=My Program AppVerName=My Program v 1.5 DefaultDirName={pf}\My Program OutputDir=. Compression=lzma/ultra InternalCompressLevel=ultra SolidCompression=yes
В: А возможно-ли сделать "Бегущую строку" без InnoCallback.dll? О: Конечно можно (! Требуется расширенная версия Inno Setup !):
Code
[Setup] AppName=My Program AppVerName=My Program v 1.5 DefaultDirName={pf}\My Program OutputDir=. Compression=lzma/ultra InternalCompressLevel=ultra SolidCompression=yes
[Code] type TCallbackProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint;
var Frame : TForm; WFOldProc : Longint;
function SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall'; function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall'; function ReleaseCapture: Longint; external 'ReleaseCapture@user32.dll stdcall'; function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall'; function WndProcCallBack(P:TCallbackProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall'; function LoadImage(hInst: THandle; ImageName: PChar; ImageType: UINT; X, Y: Integer; Flags: UINT): THandle; external 'LoadImageA@user32.dll stdcall'; function GetDC(hWnd: HWND): Longword; external 'GetDC@user32.dll stdcall'; function SetWindowRgn(hWnd: HWND; hRgn: LongWord; bRedraw: BOOL): Integer; external 'SetWindowRgn@user32.dll stdcall'; function ReleaseDC(hWnd: HWND; hDC: LongWord): Integer; external 'ReleaseDC@user32.dll stdcall'; function DeleteObject(p1: LongWord): BOOL; external 'DeleteObject@gdi32.dll stdcall';
procedure SetRgn(h:HWND;FileName:string;Width,Height:integer); var dc:LongWord; FRgn:LongWord; bmp:HBITMAP; begin BMP:=LoadImage(0,PAnsiChar(ExpandConstant('{tmp}')+'\'+FileName),0,Width,Height,$10); dc:=GetDC(h); FRgn:=CreateBitmapRgn(dc,bmp,$FFFFFF,0,0); SetWindowRgn(h,FRgn,True); ReleaseDC(h,dc); DeleteObject(BMP); end;
function WFProc(h:hWnd;Msg,wParam,lParam:Longint):Longint; begin if Msg=$3 then SetWindowPos(Frame.Handle,0,WizardForm.Left-126,WizardForm.Top-45,0,0,$515); Result:=CallWindowProc(WFOldProc,h,Msg,wParam,lParam); end;
function InitializeSetup:boolean; begin if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll'); Result:=True; end;
procedure CreateFrame; begin Frame:=TForm.Create(nil);; Frame.BorderStyle:=bsNone; CreateFormFromImage(Frame.Handle,ExpandConstant('{tmp}\frame.png'));
with TLabel.Create(Frame) do begin Parent:=Frame; AutoSize:=False; Left:=0; Top:=0; Width:=Frame.CLientWidth; Height:=Frame.ClientHeight; OnMouseDown:=@FrameMouseDown; end; WizardForm.Left:=Frame.Left+126; WizardForm.Top:=Frame.Top+45;
procedure InitializeWizard; begin with WizardForm do begin BorderStyle:=bsNone; ClientWidth:=770; ClientHeight:=515; InnerNotebook.Hide; OuterNotebook.Hide; Bevel.Hide; end; ExtractTemporaryFile('mask.bmp'); ExtractTemporaryFile('background.png'); ExtractTemporaryFile('frame.png');
Добавлено (04.05.2011, 10:59) --------------------------------------------- В: Можно ли как-то в инсталятор вставить видео с возможностью остановки и воспроизведения. O: Можно с помощью библиотеки XVID от South
procedure CreateVideoPage; begin ExtractTemporaryFile('1.avi');
NewButton1 := TNewButton.Create(WizardForm); with NewButton1 do begin Name := 'NewButton1'; Parent:=WizardForm.InstallingPage; Left := ScaleX(340); Top := ScaleY(180); Width := ScaleX(75); Height := ScaleY(25); Caption:='play'; OnClick:=@CreateVideoPage1; end;
NewButton2 := TNewButton.Create(WizardForm); with NewButton2 do begin Name := 'NewButton2'; Parent:=WizardForm.InstallingPage; Left := ScaleX(340); Top := ScaleY(210); Width := ScaleX(75); Height := ScaleY(25); Caption:='close'; OnClick:=@CreateVideoPage2; end;
NewButton3 := TNewButton.Create(WizardForm); with NewButton3 do begin Name := 'NewButton3'; Parent:=WizardForm.InstallingPage; Left := ScaleX(340); Top := ScaleY(180); Width := ScaleX(75); Height := ScaleY(25); Caption:='pause'; OnClick:=@CreateVideoPage3; end;
NewButton4 := TNewButton.Create(WizardForm); with NewButton4 do begin Name := 'NewButton4'; Parent:=WizardForm.InstallingPage; Left := ScaleX(340); Top := ScaleY(180); Width := ScaleX(75); Height := ScaleY(25); Caption:='play'; OnClick:=@CreateVideoPage4; end; end;
procedure InitializeWizard; begin XvidInstall; CreateVideoPage; end;
procedure CurPageChanged(CurPageID: Integer); begin NewButton2.hide; NewButton3.hide; NewButton4.hide; case CurPageID of wpInstalling:begin NewButton1.show; end; wpFinished:begin mciSendString('Close Video1','',0,0); end; end; end;
procedure DeinitializeSetup; begin mciSendString('Close Video1','',0,0); end;
Скрипт с файлами Если надо могу выложить на ботве с регулятором громкости.
Сообщение отредактировал Riper - Среда, 04.05.2011, 13:18
В: Как сделать, чтобы после распаковки файлов происходила проверка количества файлов в {app}, и если количество файлов меньше, чем задано, то выбивало ошибку и начиналось удаление программы? О: Сделать можно так:
[code] function GetFilesCount(Dir: String): Integer; var FSR: TFindRec; FindResult: Boolean; begin try FindResult:= FindFirst(AddBackslash(Dir)+'*.*', FSR); repeat if ((FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = 0) then begin Result:= Result+1; end else if ((FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY)and((FSR.Name<>'.')and(FSR.Name<>'..')) then begin Result:=GetFilesCount(AddBackslash(Dir)+FSR.Name); end; FindResult:= FindNext(FSR); until not FindResult finally FindClose(FSR); end; end;
procedure CurStepChanged(CurStep: TSetupStep); var Res: Integer; begin if CurStep = ssPostInstall then begin If GetFilesCount(ExpandConstant('{app}')) <{#CountFiles} then If MsgBox(ExpandConstant('{cm:Error}'), mbCriticalError , MB_OK) = IDOK then Exec(ExpandConstant('{uninstallexe}'), '/Silent', '', SW_SHOW, ewWaitUntilterminated, Res) end; end;
[CustomMessages] Error=Во время распаковки были распакованы не все файлы!
В: Как сделать, чтобы нельзя было устанавливать если в пути есть определённые символы. О: так (на примере запрета русских символов):
[Code] function NextButtonClick(CurPageID: Integer): Boolean; var i,j: integer; s,c: string; begin Result := True; if CurPageID = wpSelectDir then begin c := 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя'; for i:=1 to length(WizardForm.DirEdit.text) do for j:=1 to length(c) do begin if WizardForm.DirEdit.text[i] = c[j] then begin s := 'В пути установки присутствуют русские буквы, что недопустимо'#13#13'Пожалуйста, повторите ввод.'; MsgBox(s, mbError, mb_Ok); Result := False ; exit; end else Result := True; end; end; end;
Сообщение отредактировал Edison007 - Четверг, 05.05.2011, 11:09
[Code] var IsCustomFontInstalled: boolean; FontName: string;
function AddFontResource(FileName: PAnsiChar): Integer; external 'AddFontResourceA@gdi32.dll stdcall'; function RemoveFontResource(FileName: PAnsiChar): BOOL; external 'RemoveFontResourceA@gdi32.dll stdcall';
Procedure InitializeWizard(); begin ExtractTemporaryFile('{#Font}'); IsCustomFontInstalled:=AddFontResource(ExpandConstant('{tmp}')+'\{#Font}')>0; if IsCustomFontInstalled then SendMessage(HWND_BROADCAST,$1D,0,0); if FontExists('{#FontName}') then FontName:='{#FontName}' else FontName:='Arial'; WizardForm.Font.Name:= FontName; end;
procedure DeInitializeSetup(); begin WizardForm.Free; if IsCustomFontInstalled then if RemoveFontResource(PAnsiChar(ExpandConstant('{tmp}')+'\{#Font}')) then SendMessage(HWND_BROADCAST,$1D,0,0); end;
Архив с файлами и скриптом: Скачать Кто не с нами, тот в запое...
В: Можно ли как-то в инсталятор вставить видео с возможностью остановки и воспроизведения.
В: А можно это сделать через botva и с регулятором громкости? О: Конечно можно, вот ссылка с примерами. P.s.Использовал модули XVID от South и BASS от Shegorat
Сообщение отредактировал Riper - Четверг, 05.05.2011, 12:39
В: Как наложить текстуру на кнопки инсталлятора? О: Пример от Shegorat'a:
Code
;Скрипт текстурирования кнопок, с четырмя видами состояния кнопок ;Используется текстура размером 320х23, где размер одной кнопки 80х23 ;Скрипт написал Shegorat [Setup] AppName=Test AppVerName=Test DefaultDirName={pf}\Test OutputDir=userdocs:Test.
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 begin if i = n then Button:= UsedButtons[n]; end; 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:=-ButtonWidth*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 ButtonLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var n, I: Integer; begin I:=TLabel(Sender).Tag; //Сначала восстанавливаем картинку у всех кнопок, так надо иначе могут быть глюки for n:=0 to (ButtonsCount-1) do begin if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2)and(I<>N) then ButtonImage[n].Left:= 0; end; //Теперь собственно ставим нужную картинку if (ButtonLabel[I].Enabled)and(ButtonImage[I].Left <> -ButtonWidth*2) then begin ButtonImage[I].Left:= -ButtonWidth; end; end;
procedure WizardLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var n: Integer; begin //Т.к Sender'ом выступает WizardLabel то не получится испльзовать индекс кнопки for n:=0 to (ButtonsCount-1) do if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2) then begin ButtonImage[n].Left:= 0; end; end;
procedure LoadButtonImage(AButton: TButton); 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(WizardForm) ButtonPanel[n].SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height) ButtonPanel[n].Tag:= n ButtonPanel[n].Enabled:= AButton.Enabled ButtonPanel[n].Parent:=AButton.Parent
with TLabel.Create(WizardForm) do begin Tag:=n Parent:=ButtonPanel[n] Width:=AButton.Width Height:=AButton.Height Transparent:=True OnClick:=@ButtonLabelClick OnDblClick:=@Bu ttonL abelClick OnMouseMove:=@ButtonLabelMove OnMouseDown:=@ButtonLabelMouseDown OnMouseUp:=@ButtonLabelMouseUp end
B u ttonLabel[n]:=TLabel.Create(WizardForm) ButtonLabel[n].Autosize:=True ButtonLabel[n].Alignment:=taCenter ButtonLabel[n].Tag:=n ButtonLabel[n].Enabled:= AButton.Enabled ButtonLabel[n].Transparent:=True ButtonLabel[n].Font.Color:=clWhite ButtonLabel[n].Caption:=AButton.Caption ButtonLabel[n].OnClick:=@ButtonLabelClick ButtonLabel[n].OnDblClick:=@ButtonLabelClick ButtonLabel[n].OnMouseMove:=@ButtonLabelMove ButtonLabel[n].OnMouseDown:=@ButtonLabelMouseDown ButtonLabel[n].OnMouseUp:=@ButtonLabelMouseUp ButtonLabel[n].Parent:=ButtonPanel[n]
ButtonsCount:= ButtonsCount+1 end;
procedure UpdateButtons(); var n: Integer; begin for n:=0 to ButtonsCount-1 do begin ButtonLabel[n].Caption:=UsedButtons[n].Caption ButtonPanel[n].Visible:=UsedButtons[n].Visible if (UsedButtons[n].Enabled = False) then ButtonImage[n].Left:= -ButtonWidth*3 else ButtonImage[n].Left:= 0; ButtonLabel[n].Enabled:= UsedButtons[n].Enabled; ButtonPanel[n].Enabled:= UsedButtons[n].Enabled; //Ставим Left и Top лейбла соразмерно размеру лейбла ButtonLabel[n].Left:= ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2; ButtonLabel[n].Top:= ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2; 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 CurPageChanged(CurPageID: Integer); begin UpdateButtons() end;
Добавлено (05.05.2011, 17:01) --------------------------------------------- В: Как сделать, чтобы нельзя было устанавливать если в пути есть русские символы. О: Пример от Profrager'a:
//************************************************[Русофобия]*************************************************************// function NextButtonClick(CurPageID: Integer): Boolean; var i: integer; c: char; begin Result := True; if CurPageID = wpSelectDir then begin for i:=1 to length(WizardForm.DirEdit.text) do begin c:=WizardForm.DirEdit.text[i]; if (c>=A1)and(c<=Z1) or (c>=A2)and(c<=Z2) or (c=X1) or (c=X2) then begin MsgBox( 'В пути установки присуствуют русские символы'#13#13'Пожалуйста, повторите ввод.', mbError, mb_Ok); Result := False ; exit; end; end; end; end; //************************************************[Конец- русофобия]*************************************************************//
Во-первых первый пример был не совсем корректен. Он, я так понимаю, брался из справки от Krinkels старой версии, а в ней были проблемы с пробелами. Из-за этого многие скрипты не работалиShegorat
Сообщение отредактировал BlackSelf - Четверг, 05.05.2011, 20:12
procedure InfoButtonOnClick(Sender: TObject); begin MsgBox('Информация о релизе:'#13#13'- Ничего не вырезано/не перекодировано.'#13'- Язык озвучки: Русский/Английский.'#13'- Язык интерфейса: Русский/Английский. '#13'- Таблетка: вшита (TRiViUM). '#13'- Защита: StarForce 5.70 + Online Activation. '#13'- Время установки: 5 минут. '#13'- Автор RePacka: человек.', mbInformation, MB_OK) end;
procedure InitializeWizard(); begin InfoButton := TButton.Create(WizardForm); with InfoButton do begin Left:=40 Top:=327 Width:=80 Height:=23 OnClick:=@InfoButtonOnClick Parent:=WizardForm Caption := 'Информация'; end end;
Кто не с нами, тот в запое...
Сообщение отредактировал Edison007 - Суббота, 07.05.2011, 15:45
[code] function IsAnsi(S: string): boolean; var S1: string; S2: string; begin S1 := AnsiUppercase(S); S2 := Uppercase(S); if CompareStr(S1, S2) = 0 then begin S1 := Lowercase(S); S2 := AnsiLowercase(S); if CompareStr(S1, S2) = 0 then Result := True; end; end;
function NextButtonClick(CurPageID: Integer): Boolean; begin Result:= True; if CurPageID = wpSelectDir then if not(IsAnsi(WizardForm.DirEdit.Text)) then begin MsgBox( 'В пути установки присуствуют русские символы'#13#13'Пожалуйста, повторите ввод.', mbError, mb_Ok); Result := False ; end; end;
Поправил пример - кнопка "Далее" не отрабатывала клик на страницах отличных от SelectDirPage.Shegorat
Code
function GetTickCount: LongWord; external 'GetTickCount@Kernel32.dll stdcall';
function IsAnsi(S: string): boolean; var S1: string; S2: string; k: LongWord; begin k := GetTickCount; S1 := AnsiUppercase(S); S2 := Uppercase(S); if CompareStr(S1, S2) = 0 then begin S1 := Lowercase(S); S2 := AnsiLowercase(S); if CompareStr(S1, S2) = 0 then Result := True; end; WizardForm.Caption := FloatToStr(GetTickCount) + '-' + FloatToStr(k) + '=' + FloatToStr(GetTickCount-k); end;
function IsAnsi2(S: string): boolean; var i: integer; c: char; k: LongWord; begin k := GetTickCount; Result := True; for i:=1 to length(s) do begin c:=s[i]; if (c>=A1)and(c<=Z1) or (c>=A2)and(c<=Z2) or (c=X1) or (c=X2) then begin Result := False ; end; end; WizardForm.Caption := FloatToStr(GetTickCount) + '-' + FloatToStr(k) + '=' + FloatToStr(GetTickCount-k); end;
function NextButtonClick(CurPageID: Integer): Boolean; begin Result := True; if CurPageID = wpSelectDir then if not(IsAnsi(WizardForm.DirEdit.Text)) then begin MsgBox( 'В пути установки присуствуют русские символы'#13#13'Пожалуйста, повторите ввод.', mbError, mb_Ok); Result := False ; Exit; end; end;
Пройгрыш других вариантов по сравнению с этим на лицо ... А уж если использовать длинные пути ... то он далеко оставляет конкурентов
и если Про действительно хотел сделать САМЫЙ быстрый код по хорошему нужно поставить после
Code
if (c>=A1)and(c<=Z1) or (c>=A2)and(c<=Z2) or (c=X1) or (c=X2) then begin Result := False ;
Code
break;
Зачем проверять ВСЮ строку если в ней УЖЕ есть русские символы - это улучшит быстродействие но не намного
Сообщение отредактировал VoLT - Пятница, 06.05.2011, 10:49
procedure OnShow(Sender: TObject); begin AnimateWindow(WizardForm.Handle,1000,AW_EXPLODE); WizardForm.NextButton.OnClick(WizardForm.NextButton); WizardForm.BackButton.OnClick(WizardForm.BackButton); end;
procedure InitializeWizard(); begin WizardForm.OnShow:=@OnShow; end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean); begin Confirm:=False; AnimateWindow(WizardForm.Handle,1000,AW_IMPLODE); Cancel:=True; end;
В: Как добавить в инсталлятор системные дату и время? О: Можно так (нужна InnoCallback.dll)
Code
[Setup] AppName=My Program AppVerName=My Program v 1.5 DefaultDirName={pf}\My Program OutputDir=. Compression=lzma/ultra InternalCompressLevel=ultra SolidCompression=yes
[Code_] #ifdef UNICODE #define A "W" type PChar = PAnsiChar; #else #define A "A" ; меняется на A или W в зависимости от версии #endif function GetWindowText(hWnd: HWND; lpString: String; nMaxCount: Integer): Integer; external 'GetWindowText{#A}@user32.dll stdcall'; function CreateWindow(dwExStyle: DWORD; lpClassName: PChar; lpWindowName: PChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: LongWord; hInstance: Cardinal; lpParam: LongWord): HWND; external 'CreateWindowExA@user32.dll stdcall';
#ifndef IS_ENHANCED type TimerProc = procedure(Sender: TObject);
function CallbackAddr(Callback: TimerProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall'; function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall'; function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall'; #endif
const DATETIMEPICK_CLASS = 'SysDateTimePick32'; WS_CHILD = $40000000; WS_VISIBLE = $10000000; DTS_SHORTDATEFORMAT = $0000; // use the short date format DTS_LONGDATEFORMAT = $0004; // use the long date format DTS_TIMEFORMAT = $0009; // use the time format WM_GETTEXTLENGTH = $000E;
procedure GetSysClock(Sender: TObject); // процедура для таймера begin lbClock.Caption:= GetDateTimeString('Дата: dd.mm.yy, время: hh:nn:ss', '.', ':'); if UpdateLabel.Checked then lbSysTime.Caption:= 'Считанное значение - Системное время: ' + Copy(lbClock.Caption, Pos('время:', lbClock.Caption) + 7, Length(lbClock.Caption)-(Pos('время:', lbClock.Caption) + 6)); end;
procedure CreateClock; begin // создаём часы lbClock:= TLabel.Create(WizardForm); with lbClock do begin Left:= 10; Top:= 330; AutoSize:= True; Font.Size:= 10; Font.Style:= [fsBold]; Caption:= GetDateTimeString('Дата: dd.mm.yy, время: hh:nn:ss', '.', ':'); Transparent:= True; Parent:= WizardForm; end; // запускаем таймер #ifdef IS_ENHANCED // если расширенная версия Inno Setup от Resstools with TTimer.Create(WizardForm) do begin Interval:= 500; // интервал полсекунды OnTimer:= @GetSysClock; end; #else // если обычная версия Inno Setup SetTimer(WizardForm.Handle, 1, 500 {интервал полсекунды}, CallbackAddr(@GetSysClock, 0)); #endif end;
procedure InitializeWizard(); begin WizardForm.WelcomeLabel2.Height:= 100; // чебокс UpdateLabel:= TNewCheckBox.Create(WizardForm); with UpdateLabel do begin SetBounds(260, 170, 120, 15); Caption:= 'Обновлять время.'; Parent:= WizardForm.SelectDirPage; end; CreateClock; // создаём описание with TLabel.Create(WizardForm) do begin Left:= 190; Top:= 193; AutoSize:= True; Caption:= 'Дата на момент запуска -'; Transparent:= True; Parent:= WizardForm.WelcomePage; end; with TLabel.Create(WizardForm) do begin Left:= 190; Top:= 243; AutoSize:= True; Caption:= 'Время на момент запуска -'; Transparent:= True; Parent:= WizardForm.WelcomePage; end; // создаём SysDateTimePick32 с показом даты DatePick:= CreateWindow(0, DATETIMEPICK_CLASS, '', WS_CHILD or WS_VISIBLE or DTS_SHORTDATEFORMAT, 335, 190, 90, 21, WizardForm.WelcomePage.Handle, 0, 0, 0); // создаём SysDateTimePick32 с показом времени TimePick:= CreateWindow(0, DATETIMEPICK_CLASS, '', WS_CHILD or WS_VISIBLE or DTS_TIMEFORMAT, 335, 240, 90, 21, WizardForm.WelcomePage.Handle, 0, 0, 0); // создаём Label'ы для оттображения данных lbDate:= TLabel.Create(WizardForm); with lbDate do begin Left:= 0; Top:= 130; AutoSize:= True; Transparent:= True; Parent:= WizardForm.SelectDirPage; end; lbTime:= TLabel.Create(WizardForm); with lbTime do begin Left:= 0; Top:= 150; AutoSize:= True; Transparent:= True; Parent:= WizardForm.SelectDirPage; end; lbSysTime:= TLabel.Create(WizardForm); with lbSysTime do begin Left:= 0; Top:= 170; AutoSize:= True; Transparent:= True; Parent:= WizardForm.SelectDirPage; end; end;
function GetTextPick(pick: HWND): string; // процедура для считывания текста из SysDateTimePick32 var Count: Integer; str: string; begin Count:= SendMessage(pick, WM_GETTEXTLENGTH, 0, 0) + 1; str:= StringOfChar(#0, Count); GetWindowText(pick, str, Count); Result:= Trim(str); end;
procedure CurPageChanged(CurPageID: Integer); begin if CurPageID = wpSelectDir then begin // показываем значения... lbDate.Caption:= 'Считанное значение - Дата на момент запуска: ' + GetTextPick(DatePick); lbTime.Caption:= 'Считанное значение - Время на момент запуска: ' + GetTextPick(TimePick); lbSysTime.Caption:= 'Считанное значение - Системное время: ' + Copy(lbClock.Caption, Pos('время:', lbClock.Caption) + 7, Length(lbClock.Caption)-(Pos('время:', lbClock.Caption) + 6)); end; end;
procedure DeinitializeSetup(); begin #ifndef IS_ENHANCED KillTimer(WizardForm.Handle, 1); #endif end;
Если я знаю, что знаю мало, я добьюсь того, чтобы знать больше... В.И. Ленин
Сообщение отредактировал YURSHAT - Вторник, 10.05.2011, 15:09