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


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

Так некорректно работает:

Код

if Canvas.TextWidth(S) > Edit1.ClientWidth then
  ShowMessage('Text fit!')
else
  ShowMessage('Text can''t fit!');

Автор: northener 5.6.2013, 17:43
А так?
Код

if Canvas.TextWidth(S) < Edit1.ClientWidth then
  ShowMessage('Text fit!')
else
  ShowMessage('Text can''t fit!');

Автор: Dmitry1987 5.6.2013, 17:45
Цитата(northener @ 5.6.2013,  15:43)
А так?
Код

if Canvas.TextWidth(S) < Edit1.ClientWidth then
  ShowMessage('Text fit!')
else
  ShowMessage('Text can''t fit!');

перепутал ShowMessage местами, но смысл задачи от этого не меняется

Автор: Poseidon 5.6.2013, 20:03
А что конкретно работает не корректно? У меня вроди нормально обрабатывается. Может вся загвоздка в том, что в S, а что реально в Edit.Text?

Автор: Dmitry1987 6.6.2013, 09:39
Цитата(Poseidon @ 5.6.2013,  18:03)
А что конкретно работает не корректно? У меня вроди нормально обрабатывается. Может вся загвоздка в том, что в S, а что реально в Edit.Text?

Вот пример:

Код

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).

Автор: Poseidon 6.6.2013, 13:09
Цитата(Dmitry1987 @  6.6.2013,  09:39 Найти цитируемый пост)
При наведении выводится, что текст влазит
Ты не поверишь... На XE3 пишет что "не влазит". Какие настройки Font?

Автор: northener 6.6.2013, 14:37
Цитата(Dmitry1987 @  6.6.2013,  09:39 Найти цитируемый пост)
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;


А причём тут канва формы и ширина текста в эдите?

Автор: Poseidon 6.6.2013, 15:08
Цитата(northener @  6.6.2013,  14:37 Найти цитируемый пост)
А причём тут канва формы и ширина текста в эдите?
Если принять во внимание, что очень редко Font форм отличается от Font'a компонентов на этой форме, можно при помощи Canvas.TextWidth узнать ширину занимаемого текста. Хотя, в серьезных проектах, это может служить не более чем временной заглушкой, тем не менее это работает.

Автор: northener 6.6.2013, 15:13
Цитата(Poseidon @  6.6.2013,  15:08 Найти цитируемый пост)
тем не менее это работает.

У меня пример автора выдает "Текст не влазит", хотя он реально влазит и даже ещё чуток места осталось.
ParentFont = True
Вот если три буковки y убрать, тогда напишет "влазит" smile

Автор: northener 7.6.2013, 01:11
Цитата(Poseidon @  6.6.2013,  15:08 Найти цитируемый пост)
Если принять во внимание, что очень редко Font форм отличается от Font'a компонентов на этой форме, можно при помощи Canvas.TextWidth узнать ширину занимаемого текста. Хотя, в серьезных проектах, это может служить не более чем временной заглушкой, тем не менее это работает.

Я не знаю что нужно принять во внимание при вычислении ширины текста в TEdit.
Д2007

Автор: Shaggy 7.6.2013, 03:49
http://msdn.microsoft.com/en-us/library/windows/desktop/bb761596(v=vs.85).aspx
?

Автор: northener 7.6.2013, 15:04
Цитата(Shaggy @  7.6.2013,  03:49 Найти цитируемый пост)
EM_GETRECT

Т.е. предлагаешь использовать возвращенный в этом сообщении RECT вместо TEdit.ClientRect?
Это конечно ближе к истине. Но всё равно не решает задачу гарантировано.
Хотя вру. С помощью этого сообщения действительно правильно проверяется влазит текст или нет.

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