Форум: "KOL";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизМеню со стилем OfficeXP Найти похожие ветки
← →
shalex © (2005-10-07 14:19) [0]Я перевел на KOL компонент для отрисовки меню со стилем OfficeXP с возможностью изменять цвет, шрифт... может кому-нибудь тоже пригодится:
http://kol.lighthost.ru/files/XPMenus.rar
Это мой первый опыт создания KOL компонента, поэтому обо всех ошибках сообщите мне на мыло. Предложения тоже приветствуются :)
← →
ECM © (2005-10-07 15:17) [1]
> Предложения тоже приветствуются :)
На первый взгляд ..:) :
- Не помешало бы зеркало (МСК)... это не сложно - если не стремиться за точным соответствием в Design-time)
← →
Muxaspb (2005-10-08 16:11) [2]В Delphi 7 при закрытии программы вылетает Runtime error 216. Пробовал и в демо-примере, и в своих программах.
← →
shalex © (2005-10-08 23:11) [3]Появилась версия 1.01 с зеркалом со стандартной прорисовкой.
Ссылка та же.
2Muxaspb: Если в 7-м Delphi опять появляются ошибки, то напишите: поставлю себе и эту версию, чтобы разрешить проблему.
← →
shalex © (2005-10-09 12:03) [4]Почему-то работает только с заменой системных файлов... Может кто-нибудь подскажет почему?
← →
RA © (2005-10-10 16:39) [5]Очень хорошо! Но вот не ясно для чего сразу инитить BmpCheck? Т.к. вовсе не факт, что где-то в нашем меню будет использоваться Chek. Поэтому я предлогаю сделать примерно так:
1) в пр-ру InitBmp добавить строки
if BmpCheck<>nil then exit;
BmpCheck:= NewDIBBitmap(12,12,pf32bit);
(И передаваемый параметр не нужен)
2) секция initialization не нужна
3) finalization можно и не изменять, т.к. если даже BmpCheck не проинитился все равно BmpCheck.Free не вызовет ошибки. А можно и поменять на KOL.Free_and_nil(BmpCheck);
4) а в unit_X.inc уже добавлять InitBmp если где-то в меню используется chek.
← →
MTsv DN (2005-10-10 19:33) [6]С Delphi 7 не работает...
Ошибка при присвоении, в демке:Result.XPMainMenu1.ItemBitmap[ 1 ] := LoadBmp( hInstance, "FORM1_N3_BMP_BITMAP", Result.XPMainMenu1 );
А если убрать все картинки, то при присвоении Default"а:Result.XPMainMenu1.Items[ 9 ].DefaultItem := TRUE;
С Уважением MTsv DN
← →
shalex © (2005-10-10 20:49) [7]Вышла версия 1.03:
1) Теперь шрифт и цвета можно менять в Design mode.
2) Предложение RA реализовано.
2MTsv DN: Буду ставить себе 7-ю версию Delphi и разбираться в чем проблема.
← →
MTsv DN (2005-10-10 21:24) [8]2 shalex ©
Я протрейссил дальше...
При любом присвоении...ломается на функции TMenu.GetItems. Например: SetItemAccelerator вызывает TMenu.GetItems -> Result := nil. Ошибка!!!
С Уважением MTsv DN
← →
shalex © (2005-10-11 10:22) [9]2MTsv DN: В Delphi 7 работает, просто Вы забыли заменить системные файлы, читайте readme внимательно. Да и здесь я уже об этом писал...
← →
SPeller © (2005-10-11 14:05) [10]В ничего - вроде симпатично выглядит.
Баг (?) - при завершении программы, запущенной в Дельфи 6, прога вылетает в окошко CPU.
Пожелание - чтобы задизабленный итем не выделялся.
← →
SPeller © (2005-10-11 14:05) [11]SPeller © (11.10.05 14:05) [10]
В ничего - вроде симпатично выглядит
Ничего - вроде симпатично выглядит )
← →
SPeller © (2005-10-11 14:13) [12]Так же, хотелось бы иметь свойство вроде ItemHeight, по умолчанию равное нулю. Если оно = нолю, то высота итемов вычисляется автоматически, иначе - высота задается значением этого свойства.
← →
shalex © (2005-10-11 14:17) [13]
> Баг (?) - при завершении программы, запущенной в Дельфи
> 6, прога вылетает в окошко CPU.
Не знаю мой это баг или в KOL, но такие ошибки у меня пропадали, когда при компиляции я ставил параметр PAS_VERSION
← →
SPeller © (2005-10-11 14:25) [14]У меня тоже pas-version.
ещё виш:
http://personal.primorye.ru/speller/xpmenu.gif
Чтобы нижняя полоска рамки не закрывалась выпадающим меню.
← →
shalex © (2005-10-11 15:44) [15]
> Так же, хотелось бы иметь свойство вроде ItemHeight, по
> умолчанию равное нулю. Если оно = нолю, то высота итемов
> вычисляется автоматически, иначе - высота задается значением
> этого свойства.
Такое свойство уже есть: MinHeight, в будущей версии я его добавлю в MCK, сейчас же им можно пользовать в runtime.
← →
shalex © (2005-10-11 16:59) [16]Вышла версия 1.05:
[+] В MCK добавлены свойства ItemHeight и ItemWidth
[*] Свойства MinHeight и MinWidth переименованы, соответственно, в ItemHeight и ItemWidth
[*] "Задизабленный" итем не выделяется.
← →
ECM © (2005-10-11 17:15) [17]
> Почему-то работает только с заменой системных файлов...
> Может кто-нибудь подскажет почему?
> При любом присвоении...ломается на функции TMenu.GetItems.
> Например: SetItemAccelerator вызывает TMenu.GetItems ->
> Result := nil. Ошибка!!!
> Не знаю мой это баг или в KOL
Решил вот посмотреть...:)
Это баг (а может недостаточно глубокое понимание идеологии KOL?) Ваш... И достаточно сложно упрятанный...:(
Я думаю это будет интересно и другим...
Все дело в том что у Вас класс TXPMenu является наследником KOL.TMenu,
а у него нет виртуального конструктора (это один из "недостатков :=) " KOL, который тем не менее позволяет уменьшить размер). Поэтому нельзя получить настоящее наследование при помощи такого типа создания класса:
Result := PXPMenu(NewMenu( AParent,MaxCmdReserve,Template,aOnMenuItem ));
На самом деле здесь привязывается VMT (это нестрашно так как у Вас нет виртуальных методов) и выделяется память (и это главный подвох!) под поля данных только базового класса - TMenu! Т.е. при вызове New компилятор не догадывается что необходимо зарезервировать место и для полей
FFont, FGutterColor,...FIsPopup которые появились в наследнике.
При обращении к этим полям компилятор берет смещение соответсвующее полю и отсчитывает память от начала выделенного под объект куска памяти.
Но при этом получается мы обращаемся к памяти уже за пределами выделенной области - а там уже находятся данные других объектов распределенных поздее!!!
Так получилось что
Result.FMinHeight := SetMinHeight(20);
Записывает данные по адресу в котором на самом деле храниться буфер значений списка Items(TList.fItems)!!! (Поэтому и падения GetItems см. выше)
Как исправить?
Для классов наследуемых от TControl можно вынести все дополнительные поля в отдельный вспомогательный объект (см статью http://bonanzas.rinet.ru/r_docs.htm "Создание визуальных компонентов для библиотеки KOL."). Но здесь это не подходит... т.к. у TMenu нет резервных полей в которых можно хранить ссылку на такой объект (разве что Tag ... но вдруг кто-то захочет им воспользоваться по назначению?)
ИМХО: можно убрать вызов NewMenu из NewXPMenu - вместо этого перенести "тело" функции NewMenu прямо в NewXPMenu. После этого строка
New(Result,Create) будет правильно распределять память...
З.Ы. а эффект с заменой системных файлов - это просто повезло там память распределяется другим механизмом и эффект затирания не проявился ...:)
← →
ECM © (2005-10-11 17:21) [18]
> по адресу в котором на самом деле храниться буфер значений
> списка Items
Очепятка - на самом деле указатель на буфер...:)
← →
shalex © (2005-10-11 19:30) [19]
> Это баг (а может недостаточно глубокое понимание идеологии
> KOL?) Ваш... И достаточно сложно упрятанный...
Конечно, это из-за недостаточно глубокого понимания идеологии KOL, т.к. это был мой первый KOL компонент, да еще примерами для меня были Controlы, к которым меню не относится.
> можно убрать вызов NewMenu из NewXPMenu - вместо этого перенести
> "тело" функции NewMenu прямо в NewXPMenu
Большое спасибо за совет!
← →
MTsv DN (2005-10-11 19:41) [20]Так когда исправления увидим :)
С Уважением MTsv DN
← →
shalex © (2005-10-11 23:27) [21]Вышла версия 1.06 с исправленным багом.
Пришлось много кода перенести из KOL (вот если бы Владимир объявил функцию WndProcMenu публичной в KOL, то было бы меньше кода).
Это повлияло только на размер компонента, а на размер программы это не повлияет (если одновременно не использовать вместе со стандартным меню)
2ECM: Еще вопрос по распределению памяти: нужно ли освобождать fFont после завершения работы? или он автоматически освобождается?
← →
SPeller © (2005-10-12 04:42) [22]shalex © (11.10.05 23:27) [21]
вот если бы Владимир объявил функцию WndProcMenu публичной в KOL
Ой, я наверное, больше года назад впервые просил Владимира сделать несколько глобальных объявлений таких WndProc-ов. Но почему-то воз и ныне там.
← →
SPeller © (2005-10-12 04:43) [23]shalex © (11.10.05 23:27) [21]
нужно ли освобождать fFont после завершения работы?
Да. Как и любой объект, который на был добавлен в AutoFree другого.
← →
shalex © (2005-10-12 10:17) [24]
> ещё виш:
> http://personal.primorye.ru/speller/xpmenu.gif
При каких свойствах это получается?
← →
SPeller © (2005-10-12 12:21) [25]shalex © (12.10.05 10:17) [24]
При каких свойствах это получается?
При тех, что в скомпилированной демке :) Вин ХР, классическая тема оформления.
← →
shalex © (2005-10-12 13:04) [26]
> Чтобы нижняя полоска рамки не закрывалась выпадающим меню
Нижняя полоска не закрывается, она просто не рисуется, примерно также как в OfficeXP (Delphi 7).
Но... картинка выглядит у Вас как-то странно... вот у меня так:
http://kol.lighthost.ru/files/xpmenu.png
← →
SPeller © (2005-10-12 15:21) [27]А вас тема новая, а вы её отключите, поставьте классическую. и наверняка получите мой результат.
← →
SPeller © (2005-10-12 15:22) [28]SPeller © (12.10.05 15:21) [27]
А вас тема новая, а вы её отключите, поставьте классическую. и наверняка получите мой результат
У вас тема новая, вы её отключите, поставьте классическую, и наверняка получите мой результат.
Торопился, понаочепятался :)
← →
shalex © (2005-10-13 09:19) [29]Вышла версия 1.08:
[+] Добавлено свойство CheckColor.
[*] Немного оптимизирован код.
[-] Устранена утечка памяти из-за неуничтожения Font.
← →
shalex © (2005-10-22 20:12) [30]Вышла версия 1.09
[-] Убран лишний код в связи с выходом KOL v2.16 (спасибо Владимиру Кладову).
← →
SPeller © (2005-10-22 20:23) [31]Нижняя граница меню всё-ещё закрывается. Напомню - ХР, тема оформления - Классическая.
Кроме того, хотелось бы избавиться от мерщания задизабленного итема когда мышкой по нему водишь. В код не смотрел, но кажется мне, что ты сразу на канве менюхи рисуешь? Если да, то рисуй сначала на контексте в памяти, а потом одним битблитом выводи на контекст меню.
← →
mdw © (2005-10-24 12:33) [32]Сейчас скачал, посмотрел. У меня w2000 - наблюдается такая же фигня, как у SPeller"a с нижней границей меню и задизабленный итем мерцает.
← →
homm © (2005-10-24 13:09) [33]
> Чтобы нижняя полоска рамки не закрывалась выпадающим меню.
А ты меню в Офисе видел? Там она закрывается с любым оформлением.
> Кроме того, хотелось бы избавиться от мерщания задизабленного
> итема когда мышкой по нему водишь.
На счет этого ты прав. Он зачем-то перисовывается.
← →
SPeller © (2005-10-24 13:29) [34]homm © (24.10.05 13:09) [33]
А ты меню в Офисе видел? Там она закрывается с любым оформлением
Ну и что :) Красивее когда не закрывается.
← →
shalex © (2005-10-24 20:55) [35]Мерцание я уберу (думал, что только я это вижу...наивный...), хотя логически не сходится: черным не мерцало, а серым стало мерцать!?
По поводу оформления я еще посмотрю (вдруг где-то ошибся), но боюсь, что это Винда сама дорисовывает в зависимости от темы или версии Windows, ведь это не полностью нарисованный контрол как в Офисе, а перерисованное стандартное меню.
Но новая версия будет только на следующей неделе. Сейчас очень занят.
Если есть еще предложения, пишите...
← →
SPeller © (2005-10-25 04:16) [36]На счет границы - можно ведь просто нарисовать её чуть выше, на 1 пиксель, а снизу оставить полоску в 1 пиксель цветом фона, и проблема будет решена %)
← →
FINALSOFT (2006-01-21 13:36) [37]Установка компонента(1.09):
[Hint] mckXPMenus.pas(29): Overriding virtual method "TKOLXPMainMenu.SetupFirst" has lower visibility (protected) than base class "TKOLMainMenu" (public)
[Hint] mckXPMenus.pas(31): Overriding virtual method "TKOLXPMainMenu.TypeName" has lower visibility (protected) than base class "TKOLMainMenu" (public)
[Hint] mckXPMenus.pas(68): Overriding virtual method "TKOLXPPopupMenu.SetupFirst" has lower visibility (protected) than base class "TKOLPopupMenu" (public)
[Hint] mckXPMenus.pas(70): Overriding virtual method "TKOLXPPopupMenu.TypeName" has lower visibility (protected) than base class "TKOLPopupMenu" (public)
[Error] mckXPMenus.pas(170): Not enough actual parameters
[Error] mckXPMenus.pas(300): Not enough actual parameters
[Fatal Error] XPmenuD7.dpk(38): Could not compile used unit "mckXPMenus.pas"
Версия MCK и KOL 2.30
вот это вызывается из mirror:OnMenuItemMethodName( for_pcode: Boolean )
Что сюда передать?
← →
Vladimir Kladov (2006-01-22 09:15) [38]Попробуйте false, вам же обычный код надо чтбы делался.
← →
rainstuff (2006-02-12 06:14) [39]А не подскажите - компонента устанавливается нормально, но при компиляции спрашивает модуль "Types" не знаете где его можно взять?
Или на Delphi 5 он пахать не будет?
Спасибо.
← →
ECM © (2006-02-12 16:25) [40]<DelphiDir>\Source\Rtl\Sys\Types.pas - это стандартный модуль Delphi
учитесь пользоваться поиском по жесткому диску... :)
> Или на Delphi 5 он пахать не будет?
Будет ...
Страницы: 1 2 вся ветка
Форум: "KOL";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.051 c