Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Подсказки типа "Что это такое?"


Автор: MLS 3.12.2005, 13:18
Хочу сделать пояснения к пунктам, но обычные Hint'ы не подходят - некрасиво и исчезают быстро. К тому же нельзя выделять слова внутри текста (жирным, например). Подскажите кто-нибудь, как сделать подсказки, как, например, в настройках в Винде - окошко с сообщением, которое исчезает, когда по нему кликаешь ("Что это такое")?

Автор: maxim1000 3.12.2005, 15:41
какая среда разработки?

Автор: MLS 3.12.2005, 19:02
Извиняюсь, забыл между делом - Delphi 7.0.

Автор: FRAGNATIC 3.12.2005, 20:38
в FAQ заглени и посмотри про BalloonTips

Автор: Poseidon 3.12.2005, 20:49
Цитата(MLS @ 3.12.2005, 13:18)
исчезают быстро
Поставь Application.HintPause побольше

Автор: Snowy 3.12.2005, 21:24
http://forum.vingrad.ru/index.php?act=module&module=vingradfaq§ion=664
Добавлено @ 21:25
Модератор: Пожалуйста, один топик - один вопрос.

Автор: MLS 4.12.2005, 13:03
FRAGNATIC
Poseidon
Спасибо, но это не совсем то, что мне нужно. Мне нужна подсказка, которая будет исчезать только при клике, причём чтобы я мог выделять отдельные слова внутри текста (зайдите, например, в свойства экрана, и в контекстном меню для какого-нибудь пункта выберите "Что это такое?" - мне нужны такие подсказки).

Автор: Snowy 4.12.2005, 13:17
Тогда делай для них оттдельную форму и показывай ее в нужном месте.
Убери рамку формы и закрывай ее по OnClick.

Автор: MLS 4.12.2005, 14:33
Snowy
Внутри какого компонента можно текст выделять жирным или курсивом (в смысле, не весь текст, а часть)?

Автор: Snowy 4.12.2005, 14:52
RichEdit, TWebBrowser
При желании можно самому нарисовать на любой поверхности через Canvas.

Автор: ~FoX~ 5.12.2005, 10:24
Вот тебе хтнт с любым шрифтом
Код

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure MyShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo);


procedure TForm1.MyShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo);
var
  i : integer;
begin
  for i := 0 to Application.ComponentCount - 1 do
    if Application.Components[i] is THintWindow then
      with THintWindow(Application.Components[i]).Canvas do begin
        Font.Name := 'Arial';
        Font.Size := 18;
        Font.Style := [fsBold];
        HintInfo.HintColor := clWhite;
      end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := MyShowHint;
end;


Вот пример из кулибы как делать хинт из Едит-а
Цитата
На TabbedNotebook у меня есть множество компонентов TEdit. Я изменяю цвет компонентов TEdit на желтый и назначаю свойству Hint компонента строчку предупреждения, если поле редактирования содержит неверные данные.
Поведение окна со всплывающей подсказкой (hintwindow) позволяет делать его видимым только тогда, когда курсор мыши находится в области элемента управления. Но мой заказчик хочет видеть подсказки все время, пока поле редактирования имеет фокус.

Я не знаю как изменить поведение всплывающей подсказки, заданное по умолчанию. Я знаю что это возможно, но кто мне подскажет как?

Ниже приведен модуль, содержащий новый тип hintwindow, TFocusHintWindow. Когда вы "просите" TFocusHintWindow появиться, он появляется ниже элемента управления, имеющего фокус. Для показа и скрытия достаточно следующих команд:



--------------------------------------------------------------------------------
    FocusHintWindow.Showing := True;
FocusHintWindow.Showing := False;

Пример того, как это можно использовать, содержится в комментариях к модулю. Это просто.



--------------------------------------------------------------------------------
    unit FHintWin;

{ -----------------------------------------------------------

TFocusHintWindow --


Вот пример того, как можно использовать TFocusHintWindow.
Данный пример выводит всплывающую подсказку ниже любого
TEdit, имеющего фокус. В противном случае выводится
стандартная подсказка Windows.

Код

unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, FHintWin;


type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
FocusHintWindow: TFocusHintWindow;
procedure AppIdle( Sender: TObject; var Done: Boolean );
procedure AppShowHint( var HintStr: string;
var CanShow: Boolean; var HintInfo: THintInfo );
end;


implementation


procedure TForm1.FormCreate( Sender: TObject );
begin
Application.OnIdle := AppIdle;
Application.OnShowHint := AppShowHint;
FocusHintWindow := TFocusHintWindow.Create( Self );
end;


procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
begin
FocusHintWindow.Showing := Screen.ActiveControl is TEdit;
end;


procedure TForm1.AppShowHint( var HintStr: string;
var CanShow: Boolean; var HintInfo: THintInfo );
begin
CanShow := not FocusHintWindow.Showing;
end;


end.
----------------------------------------------------------- }


interface


uses SysUtils, WinTypes, WinProcs, Classes, Controls, Forms;


type
TFocusHintWindow = class( THintWindow )
private
FShowing: Boolean;
HintControl: TControl;
protected
procedure SetShowing( Value: Boolean );
function CalcHintRect( Hint: string ): TRect;
procedure Appear;
procedure Disappear;
public
property Showing: Boolean read FShowing write SetShowing;
end;


implementation


function TFocusHintWindow.CalcHintRect( Hint: string ): TRect;
var
Buffer: array[ Byte ] of Char;
begin
Result := Bounds( 0, 0, Screen.Width, 0 );
DrawText( Canvas.Handle, StrPCopy( Buffer, Hint ), -1, Result,
DT_CALCRECT or DT_LEFT or DT_WORDBREAK or DT_NOPREFIX );


with HintControl, ClientOrigin do
OffsetRect( Result, X, Y + Height + 6 );
Inc( Result.Right, 6 );
Inc( Result.Bottom, 2 );
end;


procedure TFocusHintWindow.Appear;
var
Hint: string;
HintRect: TRect;
begin
if ( Screen.ActiveControl = HintControl ) then Exit;


HintControl := Screen.ActiveControl;
Hint := GetShortHint( HintControl.Hint );
HintRect := CalcHintRect( Hint );
ActivateHint( HintRect, Hint );
FShowing := True;
end;


procedure TFocusHintWindow.Disappear;
begin
HintControl := nil;
ShowWindow( Handle, SW_HIDE );
FShowing := False;
end;


procedure TFocusHintWindow.SetShowing( Value: Boolean );
begin
if Value then Appear else Disappear;
end;


end. 

- Ed Jordan


Автор: Snowy 5.12.2005, 13:46
Ему не хинт нужен, а окошко с текстом. Закрывающееся по онклику.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)