Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

WordWrap в TMemo c фиксированным количеством строк [D6, D7, WinXP]


alexvan ©   (2010-04-30 10:04:00) 

Вот код, но дело в том что он корректно работает только в случае если WordWrap=false, в случае true как только происходит WordWrap в последней строке, вылетает EOverFlow.
Подскажите варианты как с этим бороться.

procedure TForm1.Memo1Change(Sender: TObject);
const
  MaxLineCount = 3;
begin
  if Memo1.Lines.Count > MaxLineCount then
    Memo1.Perform(EM_UNDO, 0, 0);
  Memo1.Perform(EM_EMPTYUNDOBUFFER, 0, 0);
end;

Спасибо


alexvan   (2010-04-30 14:42:00) [1]

тема закрыта - задача решена! Вариант №2 рулит.


Leonid Troyanovsky   (2010-04-30 14:37:00) [2]


> alexvan ©   (30.04.10 14:05) [13]

> уже мои трудности. В данном случае TMemo  именно то что
> надо.

Флаг в руки и барабан на шею.

--
Regards, LVT.


alexvan   (2010-04-30 14:05:00) [3]


> Попытайся сначала разобраться, для каких целей
> используются те или иные контролы.


Что я  пытаюсь или не пытаюсь - судить об этом мне. Выбор конечного и оптимального решения и наиболее правильного с моей точки зрения - тоже дело моё, другой вопрос что это может в действительности оказаться заблуждением, но это уже мои трудности. В данном случае TMemo  именно то что надо. А то что над Вами висит MASTER DELPHI совсем не означает, что все должны беспрекословно следовать вашему мнению и рекомендациям.

With Regards!!!


Leonid Troyanovsky   (2010-04-30 13:40:00) [4]


> alexvan ©   (30.04.10 13:28) [9]

>  Я пытаюсь разобраться в данном вопросе

Попытайся сначала разобраться, для каких целей
используются те или иные контролы.

--
Regards, LVT.


Демо   (2010-04-30 13:35:00) [5]


>{RASkov} ©   (30.04.10 12:54) [4]
> еще один дурацкий вариант:

Тогда уж так:

procedure TForm1.Memo1Change(Sender: TObject);
begin
 while Memo1.Lines.Count>MaxCount then Memo1.Lines.Delete(Memo1.Lines.Count-1);
end;


{RASkov}   (2010-04-30 13:34:00) [6]

> [9] alexvan ©   (30.04.10 13:28)

Тогда создавай свой TMyMemo, а тык ты действительно лыжу приделываешь...


alexvan   (2010-04-30 13:28:00) [7]

Вообще постановка вопроса в 2-х первых постах. Это вообще-то работает - только в 1 случае WordWrap не идёт а во втором случае всё ок кроме странностей с шириной строки и ClientWidth. Я пытаюсь разобраться в данном вопросе а не в практикуме использования различных компонентов при наталкивании на первый же подводный камень.


Leonid Troyanovsky   (2010-04-30 13:16:00) [8]


> alexvan ©   (30.04.10 13:08) [7]

> А если 10 строк то 10 Edit

Хоть 100. T*Grid, T*View.

--
Regards, LVT.


alexvan   (2010-04-30 13:08:00) [9]

А если 10 строк то 10 Edit? А вообще на телегу вместо колеса можно лыжу приделать.


Leonid Troyanovsky   (2010-04-30 12:58:00) [10]


> {RASkov} ©   (30.04.10 12:54) [4]

> еще один дурацкий вариант:

Дурацких вариантов еще больше.

> А какая конкретно задача? Может есть другие решения....

Вот.
Пусть объяснится, чем ему 3 edit или 1 stringgrid не угодил.

--
Regards, LVT.


alexvan   (2010-04-30 12:57:00) [11]

Задача n-строк и не больше и WordWrap true


{RASkov}   (2010-04-30 12:54:00) [12]

еще один дурацкий вариант:
procedure TForm1.Memo1Change(Sender: TObject);
begin
 if Memo1.Lines.Count>2 then Memo1.Lines.Delete(3);
end;

А какая конкретно задача? Может есть другие решения....


{RASkov}   (2010-04-30 12:46:00) [13]

Хотя нет... от вордврап не спасет...


{RASkov}   (2010-04-30 12:44:00) [14]

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13) and (Memo1.Lines.Count>=3) then Key:=#0;
end;


alexvan   (2010-04-30 12:40:00) [15]

Нашёл другое решение только здесь ещё один косяк

procedure TFMain.Memo1KeyPress(Sender: TObject; var Key: Char);
var
 l, w: Integer;
 b: TBitmap;
begin
 b:=TBitmap.Create;
 try
   l:=Memo1.Perform(EM_LINEFROMCHAR, -1, 0);
   b.Canvas.Font:=Memo1.Font;
   w:=b.Canvas.TextWidth(Memo1.Lines[l]);
   if ((w>=Memo1.ClientWidth) AND (l>=1)) then
   begin
     case Key of
       ' '..#255, #13: key:=#0;
     end;
   end;
 finally
   b.Free;
 end;
end;

Странно как то с ClientWidth строка Сanvas.TextWidth(Memo1.Lines[l] при переносе получается значительно больше чем видимая часть Memo - что это баг или както фиксится?


Наверх

Титульная страница Поиск, карта сайта Написать письмо