Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#16: 2016-06-06 12:16:01 ЛС | профиль | цитата
nesco, показалось мне, что текстовый парсинг HilightStrings по любому WM_PAINT -- НЕСПРАВЕДЛИВО ЭТО

Попробовал улучшить ситуацию... Посмотри пожалуйста.
[offtop]свои изменения пометил комментариями со своим логином - для упрощения поиска[/offtop]
карма: 9

0
Разработчик
Ответов: 26300
Рейтинг: 2146
#17: 2016-06-07 01:50:53 ЛС | профиль | цитата
Глянул. Замутил интересно, конечно. Более подробно вечером дома проверю.
------------ Дoбавленo в 01.50:
Единственное что не очень понравилось, то это перестали сохраняться псевдонимы цвета, только их числовые значения
карма: 22

0
Ответов: 9906
Рейтинг: 351
#18: 2016-06-07 08:59:16 ЛС | профиль | цитата
Фу-ты, какой привередливый

Впрочем, любые пляски с бубном в _work_doSaveHiLight - не противоречат идеи экономии временных ресурсов в HiLight ...

Ну предположим, добавим "для синонимов" еще пару десятков "почти одинаковых" строк:
procedure THIHiLightMemo._work_doSaveHiLight;
var i:integer; TS:PStrList; _C:TColor;
str,fn: string;
begin
if not _prop_Hilight then exit;
fn := ReadString(_Data, _data_FileNameHiLight, _prop_FileNameHiLight);
//added by Galkov
TS := NewStrlist;
for i := 0 to HS.Count-1 do begin
str := HS.Items[i];
if TypeArr[i]<0 then str := '{' + str + '}';
str := str + '=';
_C := AttrArr[i].fontcolor;
if _C <> -1 then begin
if _C = clBlack then str := str + 'Black' else //+
if _C = clMaroon then str := str + 'Maroon' else //+
if _C = clGreen then str := str + 'Green' else //+
if _C = clOlive then str := str + 'Olive' else //+
if _C = clNavy then str := str + 'Navy' else //+
if _C = clPurple then str := str + 'Purple' else //+
if _C = clTeal then str := str + 'Teal' else //+
if _C = clGray then str := str + 'Gray' else //+
if _C = clSilver then str := str + 'Silver' else //+
if _C = clRed then str := str + 'Red' else //+
if _C = clLime then str := str + 'Lime' else //+
if _C = clYellow then str := str + 'Yellow' else //+
if _C = clBlue then str := str + 'Blue' else //+
if _C = clFuchsia then str := str + 'Fuchsia' else //+
if _C = clAqua then str := str + 'Aqua' else //+
if _C = clWhite then str := str + 'White' else //+
str := str + int2str(_C);
end;
if fsUnderline in AttrArr[i].fontstyle then str := str + '=U';
if fsBold in AttrArr[i].fontstyle then str := str + '=B';
if fsItalic in AttrArr[i].fontstyle then str := str + '=I';
if fsStrikeOut in AttrArr[i].fontstyle then str := str + '=S';
TS.Add(str);
end;
// end of adding
TS.SaveToFile(fn); TS.free;
Focused_CaretToView;
end;
------------ Дoбавленo в 08.59:
Между прочим, в Kol определены еще 6 синонимов:
  clLtGray     = TColor($C0C0C0);
clDkGray = TColor($808080);
clMoneyGreen = TColor($C0DCC0);
clSkyBlue = TColor($F0CAA6);
clCream = TColor($F0FBFF);
clMedGray = TColor($A4A0A0);

И вот, недосмотрел.... Логичнее мне было было использовать clNone, а не -1
карма: 9

0
Разработчик
Ответов: 26300
Рейтинг: 2146
#19: 2016-06-07 10:15:48 ЛС | профиль | цитата
Galkov писал(а):
Логичнее мне было было использовать clNone, а не -1

Может тогда доисправишь все то, что предложил?
карма: 22

0
Ответов: 9906
Рейтинг: 351
#20: 2016-06-07 10:28:59 ЛС | профиль | цитата
Легко
карма: 9

0
файлы: 1hihilightmemo.rar [21.9KB] [366]
Разработчик
Ответов: 26300
Рейтинг: 2146
#21: 2016-06-07 10:52:20 ЛС | профиль | цитата
Galkov писал(а):
Легко

Отлично. Вечером буду тестировать
карма: 22

0
Ответов: 4662
Рейтинг: 767
#22: 2016-06-07 11:02:05 ЛС | профиль | цитата
Может сделать вот так?


#pas
const

StdColors: array [0..15] of TColor =
(
clBlack,
clMaroon,
clGreen,
clOlive,
clNavy,
clPurple,
clTeal,
clGray,
clSilver,
clRed,
clLime,
clYellow,
clBlue,
clFuchsia,
clAqua,
clWhite
);

StdColorNames: array [0..15] of string =
(
'BLACK',
'MAROON',
'GREEN',
'OLIVE',
'NAVY',
'PURPLE',
'TEAL',
'GRAY',
'SILVER',
'RED',
'LIME',
'YELLOW',
'BLUE',
'FUCHSIA',
'AQUA',
'WHITE'
);

function ColorName(Color: TColor): string;
function ColorByName(ColorName: string): TColor;


implementation

function ColorName(Color: TColor): string;
var
I: Integer;
begin
Result := '';
for I := 0 to High(StdColors) do
begin
if StdColors[I] = Color then
begin
Result := StdColorNames[I];
Exit;
end;
end;
end;

function ColorByName(ColorName: string): TColor;
var
I: Integer;
begin
Result := clNone;
ColorName := UpperCase(ColorName);
for I := 0 to High(StdColorNames) do
begin
if StdColorNames[I] = ColorName then
begin
Result := StdColors[I];
Exit;
end;
end;
end;
Чтобы и другие компоненты могли пользоваться (можно в каком-нибудь другом общем модуле)
карма: 26

0
Разработчик
Ответов: 26300
Рейтинг: 2146
#23: 2016-06-07 11:06:00 ЛС | профиль | цитата
Netspirit писал(а):
Может сделать вот так?

Почему бы и нет. И еще туда 6 цветов добавить, которых не было раньше
карма: 22

0
Ответов: 4662
Рейтинг: 767
#24: 2016-06-07 11:13:22 ЛС | профиль | цитата
В принципе, можно бы и такую табличку заделать: http://www.w3schools.com/colors/colors_names.asp
карма: 26

0
Ответов: 9906
Рейтинг: 351
#25: 2016-06-07 12:30:31 ЛС | профиль | цитата
Ну да, когда этот поиск отделили от WM_PAINT - да хоть 1000 именованных цветов (если не забудем байты местами поменять).
Но, чем больше их, тем меньше в них смысла, как мне кажется.
Ну 16-20 -- в голове еще отложатся. А вот на сотню -- лично мне, даже напрягаться неохота


Netspirit писал(а):
Чтобы и другие компоненты могли пользоваться

Вообще-то, такому место в Share.pas. И тут по делу StrListEx. С его методами IndexOf и IndexOfObj.
А уже потом адаптировать "другие компоненты" под эти возможности.
Кстати говоря, а сколько их
карма: 9

0
Ответов: 4662
Рейтинг: 767
#26: 2016-06-07 12:57:18 ЛС | профиль | цитата
Galkov писал(а):
Кстати говоря, а сколько их?

Да я так, на всякий случай. Типа, соломки постелить.
карма: 26

0
Разработчик
Ответов: 26300
Рейтинг: 2146
#27: 2016-06-08 23:05:42 ЛС | профиль | цитата
Многоуважаемые кроты... И че затухли? Кучу всего предложили, а результат где?
карма: 22

0
Ответов: 9906
Рейтинг: 351
#28: 2016-06-09 06:38:34 ЛС | профиль | цитата
Это ты об чем

Если о расширении таблицы цветов, то чтобы сделать чего-то, нужна точная определенность:
  
  • Сколько их. Ну, скажем добавим еще 6, определенных в KOL. А можно добавить и синонимы системных цветов: в KOL определены 25 таковых, а в Windows.pas - уже 31. Web-цвета - чего-то настроения нет - слишком легко ошибиться, если писать "много буков", не понимая их смысла, меняя местами байты при этом.  
  • Где их писать. Если есть польза для других элементов - это одно дело (мне кажется, что в share). Если ее нет, то в HilightMemo.   
  • Понятно, что при малом количестве синонимов - цепочка IF-ов достаточно эффективна. При большом - да, как и сказал Netspirit, цикл поиска и константный массив(ы). Наш сегодняшний вариант (=16) -- промежуточный, как мне представляется (т.е., что оптимальнее - непонятно).
    В общем, ясность есть. Нет определенности (вплоть до волевого решения)
  • карма: 9

    0
    Разработчик
    Ответов: 26300
    Рейтинг: 2146
    #29: 2016-06-09 10:15:31 ЛС | профиль | цитата
    Galkov писал(а):
    Сколько их

    Остановимся на тех, что в KOL. Использовать системные, которые можно изменить темой, КМК, не стоит. А вот подумать, чтобы ввести возможность использовать помимо псевдонимов числовые значения, вот это было бы крайне интересно.
    Galkov писал(а):
    Где их писать

    КМК, надо оставить все методы в HilightMemo, если что, на него всегда можно сослаться в случае необходимости.
    Galkov писал(а):
    что оптимальнее - непонятно

    КМК, надо сделать по предложению NetSpirit-a, те вывести в отдельные методы, но оставить можно и цепочку IF, тк цветов будет немного.
    карма: 22

    0
    Ответов: 4662
    Рейтинг: 767
    #30: 2016-06-09 10:53:45 ЛС | профиль | цитата
    Поддерживаю
    - оставить в HilightMemo
    - использовать только имена из KOL/Windows. Само собой, без специальных констант типа clWindowText.
    Не поддерживаю
    - оставить также цепочку IF (если никто не предоставит убедительный тест быстродействия)
    карма: 26

    0
    Сообщение
    ...
    Прикрепленные файлы
    (файлы не залиты)