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

Тема в разделе "Delphi - Компоненты", создана пользователем Leos, 4 янв 2007.

Статус темы:
Закрыта.
  1. Leos

    Leos Гость

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

    Barmutik Гость

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

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

    Leos Гость

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

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

    Barmutik Гость

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

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

    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 или аналогичных программ.

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

    zubr Гость

    Думаю эта процедура тебе поможет:
    Код (Text):
    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;
     
  7. Leos

    Leos Гость

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

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

    zubr Гость

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

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