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

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

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

    Leos Гость

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

    Barmutik Гость

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

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

    Leos Гость

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

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

    Barmutik Гость

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

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

    Leos Гость

    Репутация:
    0
    <!--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 Гость

    Репутация:
    0
    Думаю эта процедура тебе поможет:
    Код:
    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 Гость

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

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

    zubr Гость

    Репутация:
    0
    Да в чем проблема? Не обрабатывай весь текст, обрабатывай только пользовательский ввод - события 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;
     
Загрузка...
Статус темы:
Закрыта.

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