Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Delphi: Создание простого цветного TMemo или TEdit

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Итак как и обещал вчера, выкладываю рабочий код с правильным во всех смыслах выделением (все было гораздо проще, я изначально не по тому пути пошел).
http://rapidshare.com/files/274481026/ColorMemo.zip.html
и сам модуль
Подробнее...
теперь все работает корректно независимо - моноширный или немоноширный шрифт. Будут баги - отписывайтесь, буду править далее.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:44 02-09-2009
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Теперь просто намного лучше !
И хотя ранее написано

Цитата:
Возможны баги особенно с удалением выделенного текста.

опишу:
 
В начале любой строки жмем Shift-End, Shift-влево, Del - удаляется вся строка.
То же самое в конце строки с Shift-Home, Shift-вправо, Del  
 
Про свой баг скроллирования умолчу.

----------
Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
Кекс. Антибиотики. Ламбада.

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 08:25 02-09-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man

Цитата:
В начале любой строки жмем Shift-End, Shift-влево, Del - удаляется вся строка.
То же самое в конце строки с Shift-Home, Shift-вправо, Del  

Молодец, у меня если длина строки 1 - то ничего не рисовалось )
В общем в процедуре PaintLine перед строкой
       for i:=2 to Length(LineText) do begin
добавить след код

Код:
 
       if Length(LineText)=1 then begin
           Size:=TextExtent(CurWord);
           SetBkMode(Handle, TRANSPARENT);
           if LastBck<>Self.Color then begin
              Brush.Color:=LastBck;
              FillRect(Rect(x,TxtRect.Top,x+Size.cx,TxtRect.Top+Size.cy));
            end;
           Font:=Self.Font;
           Font.Color:=LastFont;
           TextOut(x,TxtRect.Top, CurWord);
         end;
 

 

Цитата:
Про свой баг скроллирования умолчу.

в процедуре procedure TMemo.WMMousewheel(var Message: TWMMouseWheel);
поставь брейкпойты и посмотри будет или нет остановка при скролинге. Я так мельком посмотрел - что то данное сообщение в Висте и Вынь7 коряво работает. В общем пофиксить это возможно только с твоей стороны, у меня вынь7 появится только когда весь софт, который я юзаю будет под ней нормальной работать.


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 08:47 02-09-2009
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
добавить след код

Теперь все отлично !

Цитата:
что то данное сообщение в Висте и Вынь7 коряво работает

А вот с этим немного поспорю - в других то контролах работает нормально.
Тот же VirtualTreeView - но там используется CMMouseWheel.
 
P.S. Спасибо за "шапку"


----------
Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
Кекс. Антибиотики. Ламбада.

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 09:15 02-09-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man

Цитата:
А вот с этим немного поспорю - в других то контролах работает нормально.
Тот же VirtualTreeView - но там используется CMMouseWheel.  

Проблема в том, что я не знаю как в новых версиях Дельфи (у тебя явно не 5 версия) сделана обработка этого события. У меня как видно из кода - все просто, если крутнули колесо, то блокируем отрисовку, прокручиваем текст, отрисовываем текст, убираем блокировку. Так что тестируй сам - попробуй поиграть с сообщениями WM_SETREDRAW вместо моих LockWindowUpdate. Или посмотри реализацию в том же листвью

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:44 02-09-2009
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Да, как говорится, стрижка только началась.
А не пора ли сделать из сабжа полноценный компонент ?
А то эти обновления внешнего TLabel изнутри него - как-то это неправильно.

----------
Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
Кекс. Антибиотики. Ламбада.

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 10:23 02-09-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man

Цитата:
Да, как говорится, стрижка только началась.
А не пора ли сделать из сабжа полноценный компонент ?  

Исходники все есть - берите и делайте Я компоненты никогда не писал и не собираюсь. Мне интересна только техническая сторона, а прилизывать и делать готовое решение - скучно

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:44 02-09-2009
Sampron

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня как в ХР так и в семерке отоброжается один баг, если прокрутить курсором за бегунок то внизу у мемо остается отпечаток строки.

Всего записей: 563 | Зарегистр. 06-01-2007 | Отправлено: 12:46 02-09-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sampron

Цитата:
У меня как в ХР так и в семерке отоброжается один баг, если прокрутить курсором за бегунок то внизу у мемо остается отпечаток строки.

Сделай скриншот и пометь что именно ты имеешь в виду. Просто сейчас у меня если нижня строка невмещается на экран то прорисовывается ее верхняя часть - это или не это ты имеешь ввиду? Поэтому лучше скриншот.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 14:34 02-09-2009
Sampron

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Всего записей: 563 | Зарегистр. 06-01-2007 | Отправлено: 16:13 02-09-2009
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
В принципе уже весьма неплохо, да и по сравнению с предыдущей версией код стал проще и уменьшился на 5 кб.
 

Цитата:
У меня как в ХР так и в семерке отображается один баг, если прокрутить курсором за бегунок то внизу у мемо остается отпечаток строки.

У меня аналогично на XP SP3.
При скролировании вверх и вниз средней кнопкой мыши или клавиатурой все нормально.
Но если потянуть мышкой вниз (а потом можно и вверх) вертикальный ползунок, то внизу мемки остается артефакт в виде части строки.
 
Еще одна ошибка, похоже этот момент вообще никак пока не обработан:
если у мемки включить и горизонтальный скроллбар, то можно увидеть, что горизонтальный скролинг (хоть мышью, хотя клавой) вообще не работает.

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 16:28 02-09-2009 | Исправлено: StalkerSoftware, 18:09 02-09-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware

Цитата:
При скролировании вверх и вниз средней кнопкой мыши или клавиатурой все нормально.
Но если потянуть мышкой вниз (а потом можно и вверх) вертикальный ползунок, то внизу мемки остается артефакт в виде части строки.  

Поправил, была такая бага.

Цитата:
если у мемки включить и горизонтальный скроллбар, то можно увидеть, что горизонтальный скролинг (хоть мышью, хотя клавой) вообще не работает.  

У меня и в мыслях не было, что может быть горизонтальный скролл я его не люблю.
Вот новый код
Подробнее...
Пофиксил баги, добавил новые
 
ЗЫ. Изменил, убрал блокировку отрисовки - теперь скролится плавно, ранее было рывками.

Код:
 
procedure TMemo.WMVScroll(var Message: TWMVScroll);
{var
    Locked      : boolean;}
begin
//   Locked:=LockWindowUpdate(Handle);
   inherited;
   RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_NOERASE);
//   if Locked then LockWindowUpdate(0);
end;
 

ЗЗЫ. Добавил обработчик для даблклика (а то мерцало родное выделение)

Код:
 
procedure TMemo.WMLButtonDblClk(var Message: TWMLButtonDblClk);
var
   Locked       :boolean;
begin
   Locked:=LockWindowUpdate(Handle);
   inherited;
   if Locked then LockWindowUpdate(0);
end;
 

полный код под тегом more

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 04:38 03-09-2009 | Исправлено: ShIvADeSt, 07:10 03-09-2009
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Теперь и на Win7+D2010 никаких багов со скроллированием !
Но цвета раскраски, ИМХО, раньше лучше были

----------
Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
Кекс. Антибиотики. Ламбада.

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 09:22 03-09-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man

Цитата:
Но цвета раскраски, ИМХО, раньше лучше были

А блин, я у себя сделал раскраску Мемо аля классик Паскаль (с синим фоном) поэтому цвета букв и прочего подгонял под него. Кому надо - добавите переменные для раскраски или просто существующие цвета поправите на свои В любом случае - работает.  
PROFIT!


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:29 03-09-2009
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
если у мемки включить и горизонтальный скроллбар, то можно увидеть, что горизонтальный скролинг (хоть мышью, хотя клавой) вообще не работает.  
 
У меня и в мыслях не было, что может быть горизонтальный скролл я его не люблю.

А кто его любит, но юзерам горизонтально скролить не запретишь
Ну и кроме того в TEdit только горизонтально скролинг и есть.
 
А если серьезно, то теперь вертикальный скролинг работает полностью нормально, как его не осуществляй.
 
А вот горизонтальный скролинг пока нормально не работает.
Ни клавишами курсора, ни Shift+End, ни мышкой.
 
Единственное как он пока работает, это если потянуть за горизонтальный ползунок.
Но и в этом случае, если в конце такой строки набирать текст, то скролинга не происходит пока не подергаешь горизонтальный ползунок.
 
 
 

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 15:01 03-09-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware

Цитата:
Единственное как он пока работает, это если потянуть за горизонтальный ползунок.  
Но и в этом случае, если в конце такой строки набирать текст, то скролинга не происходит пока не подергаешь горизонтальный ползунок.

Может быть Я проверял только при скролинге за бегунок. Набор текста не проверял.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 15:23 05-09-2009 | Исправлено: ShIvADeSt, 04:47 07-09-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как и обещал, теперь горизонтальный скролл работает всегда
 
Подробнее...

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 04:47 07-09-2009
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
 
Ну что, проверил на D7 и D2010 (XP SP2) вроде бы все работает без ошибок и артефактов.
 
Большое тебе спасибо, за помощь.
Буду теперь, сделанную тобой раскраску, приспосабливать для TEdit.

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 14:09 07-09-2009
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я нажимаю alt и после этого окно перестаёт переключать рамку.
 
Добавлено:
Делаю это даже не в обработчике клика (изменение рамки). Откладываю это на таймер. Но впечатление будь-то хендл окна вцл оказался с другим номером. Либо простое нажатие на алт без надобности считается способом перехода в другое измерение.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 21:07 08-09-2009
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover

Цитата:
Я нажимаю alt и после этого окно перестаёт переключать рамку

 
У меня тоже самое.
Если нажать один Alt, то курсор мыши меняет свою форму с курсора для набора текста, на курсор-стрелочку, а клавиатурный курсор набора текста (мигающая вертикальная палочка) либо исчезает, либо просто замирает (перестает мигать).
 
Похоже, что при нажатии Alt, memo просто теряет фокус ввода.

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 21:20 08-09-2009
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Delphi: Создание простого цветного TMemo или TEdit


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru