Вопрос Страница лицензионного соглашения без радиокнопок

Хамик

Старожил
Как можно сделать, чтобы кнопка "Далее" на странице лицензионного соглашения становилась активной только тогда когда скроллбар с LicenseMemo опуститься до самого низу?
 

Krinkels

Он где то тут
Администратор
Как вариант:
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
LicenseFile=compiler:License.txt

[Files]
Source: compiler:InnoCallback.dll; Flags: dontcopy

[Code]
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
const
  EM_GETFIRSTVISIBLELINE = $CE; TestLine = 5;
var
  TimerID: LongWord;

function WrapTimerProc(callback:TProc; paramcount:integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
  CurrLine: integer;
begin
  CurrLine:= SendMessage(WizardForm.LicenseMemo.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
  If CurrLine >= TestLine then
    begin
      WizardForm.LicenseAcceptedRadio.Enabled:= True;
      KillTimer(0, TimerID);
    end;
  //WizardForm.Caption:= IntToStr(CurrLine);
end;

procedure InitializeWizard();
begin
  WizardForm.LicenseAcceptedRadio.Enabled:= False;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
begin
  if CurPageID = wpLicense then
    begin
      pfunc:= WrapTimerProc(@OnTimer, 4);
      TimerID:= SetTimer(0, 0, 500, pfunc);
    end else
      KillTimer(0, TimerID);
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;
 

sergey3695

Ветеран
Модератор
Добавлю от себя.
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
LicenseFile=compiler:License.txt

[Code]
const
  EM_GETFIRSTVISIBLELINE = $CE;
var
  CurrLine: integer;
  OnlyOne: boolean;

procedure AppOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
if not OnlyOne then
begin
  CurrLine:= SendMessage(WizardForm.LicenseMemo.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
if CurrLine >= (WizardForm.LicenseMemo.Lines.Count-11) then  // сколько проскролено строк. (11 на странице помещяется, поэтому минус)
begin
  OnlyOne:= True;
  WizardForm.NextButton.Enabled:= True;
end;
end;
end;

procedure InitializeWizard();
begin
  WizardForm.LicenseAcceptedRadio.Checked:= True;
  WizardForm.LicenseAcceptedRadio.Hide;
  WizardForm.LicenseNotAcceptedRadio.Hide;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpLicense then
    begin
    if not OnlyOne then
      WizardForm.NextButton.Enabled:= False;
      CurrLine:= SendMessage(WizardForm.LicenseMemo.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
      Application.OnMessage:= @AppOnMessage;
    end;
end;
вот такой код имеется. есть ли альтернатива?
 
Последнее редактирование:

Хамик

Старожил
sergey3695, вот эта строка
Код:
if CurrLine >= (WizardForm.LicenseMemo.Lines.Count-11) then
знак > оказывается играет важную роль.
 
Сверху