![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Hint
Psionic © (2013-06-05 11:09:00)Задача: при наведении мыши на Edit, если текст в него не вмещается, нужно выводить всплывающую подсказку с этим текстом. Как это правильно сделать? Вычислять длину текста (Canvas.TextWidth) и проверять, если его длина больше клиентской длины Edit'а - выводить Hint? Все это делать в событии OnMouseMove?
Германн (2013-06-12 04:04:00) [1]
> han_malign (11.06.13 09:59) [13]
>
>
Для EDIT контрола есть ещё одна тонкость. :)
han_malign (2013-06-11 09:59:00) [2]
> Был тут код один от ИШ
- дык у него и Hint такой был, только для CB - HSHintComboBox...
Германн (2013-06-08 15:19:00) [3]
> Был тут код один от ИШ.
Значит стараниями двух модераторов задача автора решена полностью.
Вот только сам автор пропал :)
Ega23 (2013-06-08 12:09:00) [4]
> А мне вообще уже не понятно как найти/посчитать ширину текста
> в 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 02:52:00) [5]
> И ты TextWidth берёшь от канвы формы, а надо - от канвы
> TEdit, которой у неё, вроде как, нету...
А мне вообще уже не понятно как найти/посчитать ширину текста в TEdit и во многих других контролах, у которых нет канвы.
Ega23 (2013-06-07 14:48:00) [6]
> так если он не вводится, то и хинт пустой, логично?
Не логично, он может быть вставлен из буфера.
> Сделал так:
Только делать это надо не на MouseMove, а на Edit.OnChange
И ты TextWidth берёшь от канвы формы, а надо - от канвы TEdit, которой у неё, вроде как, нету...
Германн (2013-06-06 15:40:00) [7]Копай в сторону DrawText с параметром DT_CALCRECT.
Psionic (2013-06-06 10:45:00) [8]Погрешность где-то 1 символ.
Psionic (2013-06-06 10:42:00) [9]В продолжении темы: Как определить размер отступа (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).
Dimka Maslov (2013-06-05 14:10:00) [10]Надо делать треккинг мыши. Тогда венда сама будет говорить, что усер навёл мышь на окно и держит курсор там. Искать по ключевому слову TrackMouseEvent
robt5 (2013-06-05 12:38:00) [11]
> текст не обязательно будет вводится
так если он не вводится, то и хинт пустой, логично?
нафига при каждом дрыге мышью насиловать проц?
> Вроде бы работает.
машина со спущенными колесами тоже вроде бы едет....
Psionic (2013-06-05 11:46:00) [12]Сделал так:
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;
Вроде бы работает.
Psionic (2013-06-05 11:34:00) [13]
> нафига? во время ввода текста проверять, если влазит хинт:
> ='' иначе ...
текст не обязательно будет вводится
robt5 (2013-06-05 11:28:00) [14]
> Все это делать в событии OnMouseMove?
нафига? во время ввода текста проверять, если влазит хинт:='' иначе ...