автоматическое расширение Richedit при вводе текста

  • Автор темы Leos
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L

Leos

Такая задача:
Есть RichEdit. В него вводят текст. Необходимо, чтобы если текст не помещается, RichEdit автоматически расширялся бы. То же касается и его высоты. Например, если изначально он имел высоту в одну стороку и нажали Enter, RichEdit увеличил бы свою высоту, чтобы была возможность вводить текст далее.
Заранее спасибо.
 
B

Barmutik

Нуу .. как вариант только ручками рассчитывать ширину и длину текста в контроле и изменять его размеры...

Стандартного такого точно поведения нет...
 
L

Leos

Хорошо, если расчитывать ручками, то для начала надо пройтись по всем символам и получить их ширину, высоту - это можно.
Но как получить определённый символ, не используя RichEdit1.SelLength?
Ведь если я вручную буду выделять символ в RichEdit'e будет ужасное мелькание.

Т.е. теперь задача как получить SelAttributes определённого символа, не выделяя его?
 
B

Barmutik

Мне кажется что возможнос тоит пересмотреть постановку задачи...

Вполне возможно что стоит придумать другое вариант ...потому ка изначально задуманно нестандартное поведение GUI...
 
L

Leos

<!--QuoteBegin-Barmutik+4:01:2007, 19:23 -->
<span class="vbquote">(Barmutik @ 4:01:2007, 19:23 )</span><!--QuoteEBegin-->Мне кажется что возможнос тоит пересмотреть постановку задачи...

Вполне возможно что стоит придумать другое вариант ...потому ка изначально задуманно нестандартное поведение GUI...
[snapback]52322" rel="nofollow" target="_blank[/snapback]​
[/quote]

По сути, в идеале, мне надо получить возможность ввода текста как в PhotoShop'e или аналогичных программ.

Какие у Вас есть предложения по тому, как это можно реализовать по-другому?
 
Z

zubr

Думаю эта процедура тебе поможет:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
fnt:TFont;
len:Integer;
begin
fnt:=TFont.Create;
try
fnt.Assign(Form1.canvas.Font);
Form1.canvas.Font:=RichEdit1.Font;
len:=Form1.canvas.TextWidth(RichEdit1.text);
RichEdit1.ClientWidth:=len;
RichEdit1.Invalidate;
Form1.canvas.Font.Assign(fnt);
finally
fnt.Free;
end;
end;
 
L

Leos

видимо не совсем поможет, так как в RichEdit можно использовать разные шрифты для разных символов.
Что тогда? можно, конечно, по символу выводить, как у тебя в примере и складывать ширину этих символов. Но это будет очень медленно и заметно на глаз. Проверено.

может есть какой-нибудь другой метод?
 
Z

zubr

видимо не совсем поможет, так как в RichEdit можно использовать разные шрифты для разных символов.
Что тогда? можно, конечно, по символу выводить, как у тебя в примере и складывать ширину этих символов. Но это будет очень медленно и заметно на глаз. Проверено.
Да в чем проблема? Не обрабатывай весь текст, обрабатывай только пользовательский ввод - события OnKeyUp, OnKeyPress, OnSelectionChange, OnMouseUp.
Есть еще способ, использовать событие OnResizeRequest, но тут все равно придется обрабатывать пользовательский ввод, так как при удалениях не корректно отрабатывается параметр Rect:
Код:
procedure TForm1.RichEdit1ResizeRequest(Sender: TObject; Rect: TRect);
begin
RichEdit1.ClientWidth:=Rect.Right-Rect.Left;
RichEdit1.ClientHeight:=Rect.Bottom-Rect.Top;
end;
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!