Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

Меню со стилем 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 вся ветка

Текущий архив: 2006.12.10;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.033 c
15-1163758988
Jeer
2006-11-17 13:23
2006.12.10
"Интервью с богом"


1-1161788609
SkySpeed
2006-10-25 19:03
2006.12.10
Проблема с программным нажатием на кнопку ДА приСохраненииРисунка


2-1163927657
Ded
2006-11-19 12:14
2006.12.10
вопросик


2-1163881777
Ingwar
2006-11-18 23:29
2006.12.10
Автоскролинг в ListBox e


2-1164129979
flaxe
2006-11-21 20:26
2006.12.10
Вопрос по Линейке =))