Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2014.03.23;
Скачать: [xml.tar.bz2];

Вниз

Hint   Найти похожие ветки 

 
Psionic   (2013-06-05 11:09) [0]

Задача: при наведении мыши на Edit, если текст в него не вмещается, нужно выводить всплывающую подсказку с этим текстом. Как это правильно сделать? Вычислять длину текста (Canvas.TextWidth) и проверять, если его длина больше клиентской длины Edit"а - выводить Hint? Все это делать в событии OnMouseMove?


 
robt5   (2013-06-05 11:28) [1]


> Все это делать в событии OnMouseMove?

нафига? во время ввода текста проверять, если влазит хинт:="" иначе ...


 
Psionic   (2013-06-05 11:34) [2]


> нафига? во время ввода текста проверять, если влазит хинт:
> ="" иначе ...


текст не обязательно будет вводится


 
Psionic   (2013-06-05 11:46) [3]

Сделал так:


procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 TEdit(Sender).Hint := TEdit(Sender).Text;
 TEdit(Sender).ShowHint := Canvas.TextWidth(TEdit(Sender).Text) >
   TEdit(Sender).ClientWidth;
end;


Вроде бы работает.


 
robt5   (2013-06-05 12:38) [4]


> текст не обязательно будет вводится

так если он не вводится, то и хинт пустой, логично?
нафига при каждом дрыге мышью насиловать проц?

> Вроде бы работает.

машина со спущенными колесами тоже вроде бы едет....


 
Dimka Maslov ©   (2013-06-05 14:10) [5]

Надо делать треккинг мыши. Тогда венда сама будет говорить, что усер навёл мышь на окно и держит курсор там. Искать по ключевому слову TrackMouseEvent


 
Psionic   (2013-06-06 10:42) [6]

В продолжении темы: Как определить размер отступа (pix) от левого края текста в TEdit. Это нужно, чтобы проверить влазил ли текст в область TEdit. Так некорректно работает:


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   procedure Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 if Canvas.TextWidth(Edit1.Text) > Edit1.ClientWidth then
   Edit1.Hint := "Текст не влазит"
 else
   Edit1.Hint := "Текст влазит";
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Edit1.Text := "yyyyyyyyyyyyyyyyyyyyyytr";
 Edit1.ShowHint := True;
end;

end.


При наведении выводится, что текст влазит, хотя реально нет (Длина Edit"а - 121 pix).


 
Psionic   (2013-06-06 10:45) [7]

Погрешность где-то 1 символ.


 
Германн ©   (2013-06-06 15:40) [8]

Копай в сторону DrawText с параметром DT_CALCRECT.


 
Ega23 ©   (2013-06-07 14:48) [9]


> так если он не вводится, то и хинт пустой, логично?

Не логично, он может быть вставлен из буфера.


> Сделал так:

Только делать это надо не на MouseMove, а на Edit.OnChange
И ты TextWidth берёшь от канвы формы, а надо - от канвы TEdit, которой у неё, вроде как, нету...


 
Германн ©   (2013-06-08 02:52) [10]


> И ты TextWidth берёшь от канвы формы, а надо - от канвы
> TEdit, которой у неё, вроде как, нету...

А мне вообще уже не понятно как найти/посчитать ширину текста в TEdit и во многих других контролах, у которых нет канвы.


 
Ega23 ©   (2013-06-08 12:09) [11]


> А мне вообще уже не понятно как найти/посчитать ширину текста
> в TEdit и во многих других контролах, у которых нет канвы.


Был тут код один от ИШ. Давно-давно себе в склерозничек записал. Ща поищу.

Во, нашёл


function GetTextWidthInPixels(AText: string; AControl: TControl): integer;
// Copyright by Игорь Шевченко ©
var
propInfo: PPropInfo;
thisFont: TFont;
begin
Result := 0;
propInfo := GetPropInfo(AControl.ClassInfo, "Font");
if propInfo <> nil then begin
  thisFont := TFont(GetObjectProp(AControl, "Font"));
  if Assigned(thisFont) then
    with TControlCanvas.Create do
      try
        Control := AControl;
        Font.Assign(thisFont);
        Result  := TextWidth(AText);
      finally
        Free;
      end;
end;
end;


 
Германн ©   (2013-06-08 15:19) [12]


> Был тут код один от ИШ.

Значит стараниями двух модераторов задача автора решена полностью.
Вот только сам автор пропал :)


 
han_malign   (2013-06-11 09:59) [13]


> Был тут код один от ИШ

- дык у него и Hint такой был, только для CB - HSHintComboBox...


 
Германн ©   (2013-06-12 04:04) [14]


> han_malign   (11.06.13 09:59) [13]
>
>

Для EDIT контрола есть ещё одна тонкость. :)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2014.03.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.002 c
3-1296788998
Кайрат
2011-02-04 06:09
2014.03.23
Работа с датами


1-1323258416
Kamilos
2011-12-07 15:46
2014.03.23
Как сделать чтобы Image изменялся вместе с формой?


15-1380905527
BBC
2013-10-04 20:52
2014.03.23
XML просмотрщик


2-1369985084
Owl
2013-05-31 11:24
2014.03.23
работа с TStringStream


15-1380629744
aka
2013-10-01 16:15
2014.03.23
аналог TImage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский