Вопрос Типа подсказка (Hint)

Хамик

Старожил
Если у чекбокса Enabled := False то возможно ли как-то использовать sender процедуры в нем?
Например как в этом примере при наведении на чекбокс отобразить текст с процедуры ShowHint?
Код:
[Setup]
appname=app
AppVersion=1.0
DefaultDirName={pf}\app

[Code]
var
  NewCheckBox1: TNewCheckBox;
  NewStaticText1: TNewStaticText;

procedure ShowHint(Sender: TObject);
begin
   NewStaticText1.Caption := 'Для установки требуется интернет соединение';
end;

procedure RedesignWizardForm;
begin
 
  NewCheckBox1 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox1 do
  begin
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(224);
    Top := ScaleY(192);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'NewCheckBox1';
    Enabled := False;
    OnMouseEnter := @ShowHint;
  end;

  NewStaticText1 := TNewStaticText.Create(WizardForm);
  with NewStaticText1 do
  begin
    Parent := WizardForm.WelcomePage;
    WordWrap := True;
    Left := ScaleX(224);
    Top := ScaleY(232);
    Width := ScaleX(141);
    Height := ScaleY(14);
  end;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;
 

Shegorat

Lord of Madness
Администратор
Если у чекбокса Enabled := False то возможно ли как-то использовать sender процедуры в нем?
Например как в этом примере при наведении на чекбокс отобразить текст с процедуры ShowHint?
Если у контрола стоит enabled=false, то он ни на какие внешние воздействия не отвечает. Можно сделать так, хотя это немного через задницу, хотя в инно всё нестандартное делается через задницу
Код:
[Setup]
appname=app
AppVersion=1.0
DefaultDirName={pf}\app

[Code]
var
  NewCheckBox1: TNewCheckBox;

procedure ShowHint(Sender: TObject);
begin
   WizardForm.WelcomeLabel2.Caption := 'Для установки требуется интернет соединение';
end;
procedure HideHint();
begin
  WizardForm.WelcomeLabel2.Caption:= 'No caption';
end;

procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  //if Point in Rect;
  if (X >= NewCheckBox1.Left)and(X <= (NewCheckBox1.Left + NewCheckBox1.Width))
  and(Y >= NewCheckBox1.Top)and(Y <= (NewCheckBox1.Top + NewCheckBox1.Height)) then
    ShowHint(nil)
  else
    HideHint();
end;

procedure InitializeWizard();
begin
  WizardForm.InnerNotebook.Hide;
  WizardForm.OuterNotebook.Hide;

  WizardForm.OnMouseMove:= @MouseMove;
  WizardForm.WelcomeLabel2.Parent:= WizardForm;

  NewCheckBox1 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox1 do
  begin
    Parent := WizardForm;
    Left := ScaleX(24);
    Top := ScaleY(292);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'NewCheckBox1';
    Enabled := False;
    OnMouseEnter := @ShowHint;
  end;
end;

P.S. Контрол не должен перекрываться другими оконными компонентами с enabled = true. Если контрол находится на панели или т.п., то нужно использовать ее обработчик OnMouseMove.
 

Хамик

Старожил
Shegorat, нашел маленький "баг". Если резко убрать мышку то надпись остается. Это поправимо? Использовал панель.
Код:
[Setup]
appname=app
AppVersion=1.0
DefaultDirName={pf}\app

[Code]
var
  NewCheckBox1: TNewCheckBox;
  NewStaticText1: TNewStaticText;
  Panel1: TPanel;

procedure ShowHint(Sender: TObject);
begin
   NewStaticText1.Caption := 'Для установки требуется интернет соединение';
end;
procedure HideHint();
begin
  NewStaticText1.Caption:= '';
end;

procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  //if Point in Rect;
  if (X >= NewCheckBox1.Left)and(X <= (NewCheckBox1.Left + NewCheckBox1.Width))
  and(Y >= NewCheckBox1.Top)and(Y <= (NewCheckBox1.Top + NewCheckBox1.Height)) then
    ShowHint(nil)
  else
    HideHint();
end;

procedure RedesignWizardForm;
begin

  Panel1 := TPanel.Create(WizardForm);
  with Panel1 do
  begin
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(232);
    Top := ScaleY(200);
    Width := ScaleX(185);
    Height := ScaleY(20);
    BevelOuter := bvNone;
    OnMouseMove := @MouseMove;
  end;

  NewCheckBox1 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox1 do
  begin
    Parent := Panel1;
    Left := ScaleX(6);
    Top := ScaleY(2);
    Width := ScaleX(97);
    Height := ScaleY(16);
    Caption := 'NewCheckBox1';
    Enabled := False;
    OnMouseEnter := @ShowHint;
  end;

  NewStaticText1 := TNewStaticText.Create(WizardForm);
  with NewStaticText1 do
  begin
    Parent := WizardForm.WelcomePage;
    WordWrap := True;
    Left := ScaleX(224);
    Top := ScaleY(232);
    Width := ScaleX(141);
    Height := ScaleY(14);
  end;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;
 

Shegorat

Lord of Madness
Администратор
Shegorat, нашел маленький "баг". Если резко убрать мышку то надпись остается. Это поправимо? Использовал панель.
Ну если подложить панель по размерам чекбокса, то можно просто использовать события OnMouseEnter, OnMouseLeave, без определения позиции курсора.
А так, можно просто добавить действие HideHint на событие OnMouseLeave.
 
Сверху