Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1163881777
Ingwar
2006-11-18 23:29
2006.12.10
Автоскролинг в ListBox e


8-1146213177
xman
2006-04-28 12:32
2006.12.10
Canvas с тенью


15-1164033526
Beavercrazy
2006-11-20 17:38
2006.12.10
Живо ли еще разрешение 800*600?


2-1164115226
Mishenka
2006-11-21 16:20
2006.12.10
Как в Image загрузить PCX файл?


2-1163930968
Max.66RUS
2006-11-19 13:09
2006.12.10
Вопрос по буферу обмена...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский