1. Акция на весь декабрь! Получай оплату х2 за уникальные статьи, объемом от 200 слов, если в заголовке темы и теле статьи присутствует слово Python
    Скрыть объявление

Hint (подсказку) На Передний План

Тема в разделе "Delphi - Компоненты", создана пользователем Port111, 8 апр 2014.

  1. Port111

    Port111 Member

    Регистрация:
    17 янв 2009
    Сообщения:
    5
    Симпатии:
    0
    Здравствуйте. Столкнулся с такой проблемой... Есть форма, на форме ListView с ViewStyle=vsReport (таблица). И в этой таблице если строка полностью не помещается в столбец, то при наведении на эту строку выскакивает hint который показывает всю строку. Причем этот hint я нигде не включал, он срабатывает по умолчанию.
    Но вот если я у формы выставляю свойство FormStyle=fsStayOnTop (на передний план), то этот hint отображается под формой... см. картинку ;)
    hint.jpg

    Подскажите как вывести этот hint на передний план?

    Заранее спасибо.
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Попробуйте следующий трюк:
    В дизайнере, в свойствах Вашего ListView поставьте
    1. ParentShowHint := False;
    2. ShowHint := True;
    В обработчике события OnInfoTip следующий код:
    Код (Delphi):
    procedure TMainForm.ListViewInfoTip(Sender: TObject; Item: TListItem;
    var InfoTip: string);
    begin
    // если длина текста айтема короче ширины рамки, то хинт не выводить.
    with Item do
    if (ListView.Canvas.TextWidth(InfoTip) <= DisplayRect(drLabel).Width) then
    InfoTip := '';
    end;
    Важно!
    Даже если Вы решите выводить подсказки и для короткого текста (который влезает по ширине), обработчик OnInfoTip всё равно должен присутствовать.
    Напишите туда любой "тупой" код типа if Item = nil then InfoTip := '';
     
  3. Port111

    Port111 Member

    Регистрация:
    17 янв 2009
    Сообщения:
    5
    Симпатии:
    0
    Хотел попробовать ваш вариант решения, но delphi ругается на DisplayRect(drLabel).Width - говорит,ч то нет такого параметра как Width.
     
  4. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Вы шутите наверное... :lamer:
    Метод объявлен следующим образом:
    function TListItem.DisplayRect(Code: TDisplayCode): TRect;
    Как Вы видите результатом функции являемтся TRect.
    Как у TRect не может быть Width ?
    Я пожалуй "погорячился" слегка использовав запись with Item do... не всем может оказаться понятно что там в коде происходит реально.
    Вот. Тоже самое (последовательно и подробно) в несколько шагов.
    Код (Delphi):
    procedure TMainForm.ListViewInfoTip(Sender: TObject; Item: TListItem;
    var InfoTip: string);
    var
    ItemLabelRect: TRect; // регион канвы ListView в котором отрисовывается текст Item-а
    TextWidth: Integer;  // ширина текста InfoTip в пикселях
    // (сколько он будет занимать напечатаным на канве ListView)
    begin
    // узнаем ширину текста
    TextWidth := Item.ListView.Canvas.TextWidth(InfoTip);
    // получаем размеры прямоугольника в котором отрисовывается Caption Item-а
    ItemLabelRect := Item.DisplayRect(drLabel);

    { если ширина текста меньше ширины прямоугольника в котором
    отрисовывается Caption Item-а значит весь текст виден
    и InfoTip показывать не надо.
    }

    if (TextWidth <= ItemLabelRect.Width) then
    InfoTip := '';
    end;
    Так работает? ;)
    Естественно предполагается что в uses у Вас есть модуль ComCtrls. (там объявлен тип TDisplayCode = (drBounds, drIcon, drLabel, drSelectBounds) ; )
     
Загрузка...
Похожие Темы - Hint (подсказку) На
  1. Shouldercannon
    Ответов:
    3
    Просмотров:
    3.769
  2. NickProstoNick
    Ответов:
    3
    Просмотров:
    2.218

Поделиться этой страницей