WebMasterok
Главная
Вход
Регистрация
Среда, 08.01.2025, 07:04Приветствую Вас Гость | RSS
Меню сайта

Главная » 2013 » Март » 24 » Вызов всплывающих подсказок средствами Delphi
21:50
Вызов всплывающих подсказок средствами Delphi
Вы наверное уже направляли внимание на форматированные подсказки при работе с редакторомMS Word. Если нет, по объясню: вызываете хоть какое диалоговое окно (например,Файл->Характеристики странички), нажимаете правой кнопкой мыши на хоть какой компонент, в итоге чего возникает выпадающее меню с текстом "Что это такое?". При щелчке на этом пт возникает подсказка с описанием элемента управления. Подсказка может содержать форматированный текст, картинки, гиперссылки и т.п.. Можно вызвать такую подсказку и другим методом: команда Справка->Что это такое? - в данном случае указатель мыши изменит свою форму на символ вопроса, и сейчас вы сможете щелкнуть на хоть какой отран управления, что приведет к возникновению всплывающей подсказки.

Такую же технологию вы сможете воплотить и вDelphi. Вам пригодится hlp-файл, содержащий сами подсказки. Для подготовки такового файла рекомендую пользоваться программкой Help & Manual. Эта программка просит платной регистрации, как и сама Delphi, потому думаю, что заморочек с регистрацией у вас не возникнет.

Итак, после установки программка автоматом встраивается во все продукты компании Borland (Delphi, Builder и т.д.). В итоге в меню Tools среды Delphi появится новый пункт Help Manual Project Wizard..., а у характеристики HelpContext, которое имеют многие зрительные составляющие, появится кнопка с троеточием. Благодаря этой кнопке процесс сотворения контекстной справки очень упрощается.

Разработка контекстной справки
Контекстная справка может употребляться в 2-ух случаях: во-1-х, если вы желаете, чтоб юзер мог узреть подробное описание элемента управления в окне справки; во-2-х, чтоб юзеру предоставить форматированную всплывающую подсказку. В обоих случаях процесс разработки справки однообразный. Разглядим этот процесс.

Сделайте в Delphi обычный проект, положите на форму несколько зрительных компонент (панели, кнопки и т.д.). После чего сможете приступить к созданию файла справки. У хоть какого зрительного компонента (или у самой формы) нажмите напротив характеристики HelpContext кнопку с троеточием. В итоге появится окно HelpContext Property Editor. В этом окне нужно задать размещение и название файла проекта справки. Назовем его Popups.hm3 (если употребляется H & M версии 3). Нажмите ОК. Запустится программка Help & Manual. Для начала необходимо выполнить последующие опции:

Найти заглавие окна, которое будет появляться при запуске файла справки (если вы желаете использовать вызов контекстной справки). Избираем пункт меню Project ->Project Properties ->Help Windows ->Main и заполняем поле Title bar text.

Настроить российский язык. Избираем в перечне Common Properties (см. п. 1) пункт Language and Character Sets, где указываем язык Russain и набор знаков RUSSIAN_CHARSET.

Сделать стартовую страничку, текст которой будет появляться при запуске файла справки (это животрепещуще только для hlp-справок). Для этого в поле Invisible Topics нажимаем правую кнопку мыши и избираем пункт Insert Before. В показавшемся окне задаем заглавие раздела, к примеру "StartPage" и нажимаем "ОК". В поле Help Text задаем какой-либо текст, к примеру: "В этом файле хранятся всплывающие подсказки".

Сохраняем проект.

Сейчас посмотрите на поле Invisible Topics. В нем вы увидите имя компонента, для которого формируется свойство HelpContext. При нажатии на строчку с этим именованием шаблон подсказки появится на вкладке HelpText. В этом поле задаем текст подсказки, исполняем по мере надобности форматирование (можно также воткнуть набросок из буфера обмена). После чего сохраните проект при помощи команды File ->Save. Перейдите в Delphi и сделайте подсказки для всех других частей управления. Направьте внимание, что сейчас характеристики HelpContext у разных компонент имеют различные числовые значения. Конкретно по этим значениям и будет отыскиваться подходящий раздел в справке.

Нажмите в H & M кнопку со значком мясорубки "Make Help File and Run" и изберите пункт Winhelp, после этого нажмите ОК. В итоге программка должна скомпилировать hlp-справку.

Мы попутно разглядим процесс вызова всплывающей подсказки, лежащей в файле формата *.chm, потому, если у вас установлен "MS HTML Help Workshop", то скомпилируйте также и chm-справку (для этого необходимо будет избрать пункт HTML HELP и надавить ОК).

Все! Разработка контекстной справки удачно завершена.
Программирование вызова всплывающей hlp-подсказки при помощи контекстного меню

Применение контекстного меню - самый обычный метод воплотить вызов всплывающей подсказки. Приступим к программированию.

Добавим в модуль формы переменную ContextID типа Integer и PopupFile типа String. Поместим на форму контекстное меню TPopupMenu и выделим на форме те составляющие, для которых мы желаем сделать подсказки. В свойстве PopupMenu избранной группы компонент избираем PopupMenu1. Если вы желаете сделать подсказку для компонента, на котором лежат составляющие с пустым свойством PopupMenu, то текст его подсказки будет появляться у лежащих на нем компонент. Это явление необходимо иметь ввиду. Сейчас в обработчике OnMouseDown избранной группы пишем последующий код:

if ssRight in Shift then ContextID:= (Sender as TControl).HelpContext;

Сейчас два раза щелкаем на компоненте TPopupMenu и создаем всего один пункт меню: "Что это такое?" либо "What's that?". В обработчике OnClick этого пт пишем последующий текст:

WinHelp(Handle, PChar(PopupFile), HELP_CONTEXTPOPUP, ContextID);

где PopupFile - заглавие файла подсказок (*.hlp). Значение этой переменной можно к примеру задать по событию OnCreate формы последующим образом:

if FileExists('Popups.hlp') then PopupFile:= 'Popups.hlp';

Сейчас вы сможете поглядеть программку в действии. При нажатии правой кнопкой мыши на элементах формы должно появляться всплывающее меню с текстом "Что это такое?". При выборе этого пт появится всплывающая подсказка.

Программирование вызова всплывающей chm-подсказки при помощи контекстного меню

Если у вас есть скомпилированный chm-файл с подсказками, то вы сможете прочесть данный раздел. Отмечу, что хранить всплывающие подсказки в файле chm-формата нет смысла (дело в том, что форматированный текст и рисунки в таких подсказках отображаться не будут, остается только нагой текст). Не считая того, код для вызова таких подсказок существенно усложняется. Итак, изменим предшествующий код последующим образом.

В разделе interface объявите последующую функцию:

Код:
  function HtmlHelp(hwndCaller: HWND; pszFile: String; uCommand: UINT;

    dwData: DWORD): Integer; stdcall; external 'hhctrl.ocx' name 'HtmlHelpA';


Потом в разделе type следует объявить последующий тип:

Код:
  HH_POPUP = packed record

     cbStruct:    Integer;

     hinst:     HWND;

     idString:    UINT;

     pszText:   LPCTStr;

     pt:      TPOINT;

     clrForeground: COLORREF;

     clrBackground: COLORREF;

     rcMargins:   TRECT;

     pszFont:   LPCTStr;

  end;


В разделе var необходимо будет объявить переменную: PopUps: HH_POPUP; а в разделе const: HH_DISPLAY_TEXT_POPUP = $000E;

В обработчике OnCreate формы необходимо будет указать файл справки:

Код:
  if FileExists(ExtractFilePath(ParamStr(0)) + 'Popups.chm')  then

    PopupFile:= ExtractFilePath(ParamStr(0)) + 'Popups.chm';


Сейчас в обработчике OnClick компонента TPopupMenu изменяем текст последующим образом:

Код:
  procedure TForm1.N1Click(Sender: TObject);

  var

    Cur: TPoint;

  begin

    GetCursorPos(Cur);

    fillchar(PopUps, SizeOf(PopUps), 0);

    with PopUps do begin

      cbStruct:= SizeOf(PopUps);

      hinst:= 0;

      pt:= Cur;

      idString:= ContextID;

      rcMargins:= Rect(5, 5, 5, 5);

      clrBackground:= RGB(255, 255, 238);

    end;

     HtmlHelp(0, PopupFile + '::/CSHelp.txt',

       HH_DISPLAY_TEXT_POPUP, DWORD(@PopUps));

  end;


Очередной недочет таких подсказок состоит в том, что функция HtmlHelp не смотрит за тем, поместится ли подсказка на дисплее на 100 процентов, а с функцией WinHelp такая неувязка не появляется.

Программирование вызова всплывающей hlp-подсказки при помощи кнопки "Что это такое?" либо "What's that?"

Кнопка "Что это такое?" находится в практически всех приложениях, а именно, в MS Word. Эта кнопка работает также, как работает подобная кнопка в заголовке окна. При нажатии на нее курсор мыши меняет свою форму на символ вопроса. В предстоящем при щелчке мыши на каком-либо элементе интерфейса должна появляться всплывающая hlp-подсказка. Во время того, как курсор имеет форму знака вопроса, должны блокироваться нажатия всех кнопок, не считая "Escape". При нажатии кнопки "Escape", правой кнопки мыши и средней кнопки мыши необходимо производить отмену, т.е. устанавливать стандартный курсор. Во время режима "What's that" кнопки не должны реагировать на щелчок мыши, т.е. не должен вызываться способ OnClick.

Все это делается достаточно просто. Поначалу в разделе var объявляем 2 глобальные переменные:

Код:
  IsHelp: Boolean = False;

  ContextID: Integer;


У главной формы устанавливаем свойство ShowHint в True - это свойство должно быть таким же у всех зрительных компонент на этой форме. Сейчас кидаем на форму панель инструментов ToolBar (Win32) и кладем на эту панель кнопку SpeedButton.

У этой кнопки изменяем последующие характеристики:

Name:sbHelpContext;

Caption:"?";

AllowAllUp:True;

GroupIndex:1 (или другое число, хорошее от нуля).

Заместо кнопки SpeedButton вы сможете использовать кнопку ToolButton - в данном случае заместо характеристики GroupIndex вы должны будете установить свойство Style в tbsCheck.

Два раза щелкаем на эту кнопку и пишем последующий обработчик:

Код:
  procedure TfrmMain.sbHelpContextClick(Sender: TObject);

  begin

    if sbHelpContext.Down then begin

      Screen.Cursor:= crHelp;

      IsHelp:= True;

      Application.HintPause:= 0;

    end

    else begin

      Screen.Cursor:= crDefault;

      IsHelp:= False;

      Application.HintPause:= 500;

    end;

  end;


Сейчас кидаем на форму компонент TApplicationEvents с вкладки Additional и создаем для него 2 процедуры:

Код:
  procedure TfrmMain.ApplicationEvents1ShowHint(var HintStr: String;

    var CanShow: Boolean; var HintInfo: THintInfo);

  begin

    if IsHelp then CanShow:= False;

    ContextID:= HintInfo.HintControl.HelpContext;


{Не у всех компонент можно так просто выяснить значение HelpContext

Для таких компонентов-исключений переменную ContextID необходимо задавать вручную

Пример 1:

Код:
     if (HintInfo.HintControl.ClassName = 'TNavButton') then

     ContextID:= 140;


Пример 2:

Код:
     if (HintInfo.HintControl.Name = 'DBNavigator1') then

     ContextID:= 150;}

  end;



  procedure TfrmMain.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);

    procedure EndHelp;

    begin

      IsHelp:= False;

      Screen.Cursor:= crDefault;

      sbHelpContext.Down:= False;

      Handled:= not Handled;

      Application.HintPause:= 500;

    end;

  begin

    if IsHelp then begin

      if (MSg.message = WM_LBUTTONDOWN) or (MSg.message = WM_LBUTTONDBLCLK) then

      begin

        if (ContextID >0) and (ContextID< 10000) then

          WinHelp(Handle, 'Popups.hlp', HELP_CONTEXTPOPUP, ContextID);

        EndHelp();

      end;

      if ((Msg.message = WM_KEYDOWN) and (Msg.wParam = 27)) or

        (MSg.message = WM_RBUTTONDOWN) or

          (MSg.message = WM_MBUTTONDOWN) then EndHelp();

      if ((Msg.message = WM_KEYDOWN) and (Msg.wParam<>27))

        then Handled:= not Handled;

    end;

  end;



Условие "if ContextID< 10000 then" нужно, но число может быть другим (оно не может быть меньше, чем наибольшее значение HelpContext в вашей справке). Если не указать это условие, то справка будет запускаться через один раз (или через два раза). В первой процедуре указывается, что в режиме "Что это такое?" родные подсказки компонент появляться не должны.

Единственное ограничение нашего обработчика сообщений - невозможность заблокировать способы, обрабатывающие событие OnMouseMove. В данном случае программер для каждого компонента с таким способом должен будет писать последующий код (пример):

Код:
  procedure TfrmMain.BitBtn1MouseMove(Sender: TObject; Shift: TShiftState; X,

    Y: Integer);

  begin

    if IsHelp then Exit;

    // Основной код обработчика..... 

  end;


Также вы сможете сделать пункт "Что это такое?" в основном меню. В данном случае обработчик выбора пт меню будет последующим:

Код:
  procedure TfrmMain.N2Click(Sender: TObject);

  begin

    sbHelpContext.Down:= True;

    sbHelpContext.Click;

  end;
Просмотров: 2115 | Добавил: Romik72 | Теги: скрипты | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0