Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2010, 07:07   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Динамическое меню

Вотъ какую машинен сделать хочу: в файле хранится структура, в которой описано дерево типа:

Код:

FOLDER
 |
 +-FILE 1
 |
 +-FOLDER 3
      | 
      +-FILE 2
По этому дереву я хочу сделать менюшку (типа той, которая в "пуске" рисуется). Причем имею, так сказать, только следующие виды напильников:

Процедура НАРИСОВАТЬ(X,Y, ФОНПУНКТАМЕНЮ)
Я так же знаю координаты мыши при её перемещении и клике

Никак не пойму, с какой стороны этот машинен начать собирать.

Думаю начать с проработки расчетов координат, но упираюсь в непроработанность структуры для хранения.

P.S. Для простоты будем считать, что размеры ФОНПУНКТАМЕНЮ = 32 х 64
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 21.04.2010 в 07:09.
Alex Cones вне форума Ответить с цитированием
Старый 21.04.2010, 08:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ниче что-то я не понял... Что значит нарисовать?
Чем стандартное меню не устраивает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.04.2010, 09:20   #3
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Хм, вопрос настолько пространный что я и не знаю что советовать
В принципе ты перечислил все необходимое, в простейшем случае ничего больше и не надо.
Цитата:
но упираюсь в непроработанность структуры для хранения.
Можно поконкретнее?

Не знаю что там у тебя не проработано, скажу на всякий случай, я бы хранил в дереве объекты с исчерпывающим описанием, с кучей нужных и ненужных данных (позиция, состояние и т.д. и т.п.), тогда вероятность что потом окажется, что что-то сделать невозможно из-за непродуманности структуры, уменьшается. А ели даже и чего-то не будет хватать, то всегда можно изменить только сам класс пункта меню не трогая остальной код.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 21.04.2010, 09:31   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Не знаю что там у тебя не проработано, скажу на всякий случай, я бы хранил в дереве объекты с исчерпывающим описанием, с кучей нужных и ненужных данных (позиция, состояние и т.д. и т.п.), тогда вероятность что потом окажется, что что-то сделать невозможно из-за непродуманности структуры, уменьшается. А ели даже и чего-то не будет хватать, то всегда можно изменить только сам класс пункта меню не трогая остальной код.
Хм... Хороший совет, постараюсь еще и зарезервировать пару переменных.
Цитата:
Можно поконкретнее?
Пожалуйста: пишу программу на апи, поэтому визуально менюшки готовой нету, тем паче, что стандартный Popup выглядит уныло. Хотелось бы покрасивше с возможностью менять фоновый рисунок.
В идеале хочу построить нечто такое:
Изображения
Тип файла: gif Windows and OS2 Bitmaps.GIF (1.6 Кб, 46 просмотров)
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 21.04.2010, 09:37   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Да это я понял, я имею представление что такое меню, я имел ввиду поконкретнее о том, что не получается или что непонятно

Цитата:
Хм... Хороший совет, постараюсь еще и зарезервировать пару переменных.
Немного разовью мысль. В принципе в файле достаточно хранить (если их вообще нужно хранить конечно) только сами имена листьев и узлов, а уже при загрузке строить дерево объектов, ты ведь красивое хочешь, вот вся эта красота и будет в объектах описана. А резервировать в этом случае нет нужды, всегда можно пару полей в класс дописать.

Позиции пунктов высчитать не сложно,
глубина узла * ширину пункта = позиция X,
номер листа в узле * высоту пункта + позиция Y родительского пункта = позиция Y.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 21.04.2010 в 09:42.
mutabor вне форума Ответить с цитированием
Старый 21.04.2010, 09:45   #6
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Позиции пунктов высчитать не сложно,
Но тут встает сложность, заводить ли отдельные переменные, чтобы знать, открыто ли подменю, чтобы обрабатывать нажатие на элемент подменю подменю подменю подменю и т.д.
Цитата:
если их вообще нужно хранить конечно
Думаю, что все-таки надо, т.к. дольше будет идти сканирование папок и файлов, чем чтение из памяти.

Необходимые, на мой взгляд вещи в структуре:

ФлагПапка\Не(Если не = файл)
Иконка (опять таки из памяти быстрее достать)
Имя
...
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 21.04.2010 в 09:47.
Alex Cones вне форума Ответить с цитированием
Старый 21.04.2010, 10:03   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я что-то недопонял, а чем TreeView не устраивает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.04.2010, 10:12   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

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

Нек-рые моменты реализации можешь позаимствовать в TTreeView, там есть и флаги открыт или нет, и события, и все остальное. просто внешний вид у тебя другой будет. Можешь даже унаследоваться от него и только отрисовку заменить на свою.

Цитата:
Думаю, что все-таки надо, т.к. дольше будет идти сканирование папок и файлов, чем чтение из памяти.
Ага, понятно для чего тебе. Не согласен, а если юзер изменить файловую структуру пока твое приложение не работало?
Иконки да, лучше хранить свои, чтобы можно было свои использовать и разные их наборы подгружать.

Цитата:
ФлагПапка\Не(Если не = файл)
Иконка (опять таки из памяти быстрее достать)
Имя
Ну в принципе да. И еще техническое поле - указатель на след узел (offset от начала файла), ты ведь дерево будешь хранить, т.е. непоследовательное считывание.
Указатель на иконку можно в этом файле и не хранить, ты ведь не будешь абсолютно для каждого файла свои иконки назначать? В простейшем случае иконки две - файл и папка. В более сложном их может быть больше, по типам файлов например, для картинок своя, для видео своя и т.п. Но в любом случае не на каждый файл своя. Думаю ты мысль понял.

Цитата:
Я что-то недопонял, а чем TreeView не устраивает?
Он просто хочет свою менюшку сделать, своими руками, интересно ему. Сам люблю GUI строить, тоже можно сказать - "а чем тебе системный GUI не устраивает?". Ты ведь выводишь отчеты в HTML, тоже можно спросить а зачем ты так делаешь, а не выводишь стандартными средствами с помощью генераторов
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось Stilet; 21.04.2010 в 11:50.
mutabor вне форума Ответить с цитированием
Старый 21.04.2010, 10:22   #9
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Ну вот смотри, процедура отрисовки всего меню: проходим по дереву начиная с корня, если пункт = узел и он открыт, то рисуем все его дочерние элементы, затем такая же проверка для дочерних и т.д.
Рекурсивно? Ясно.
Цитата:
Ага, понятно для чего тебе. Не согласен, а если юзер изменить файловую структуру пока твое приложение не работало?
Ну вообще количество папок в "пуске" не такое большое, в случае изменений можно пересканировать.
Цитата:
ты ведь не будешь абсолютно для каждого файла свои иконки назначать?
А почему, собственно нет? Я могу в меню пуска на каждую папку поставить свою иконку. Или можно "библиотеку иконок" сделать - загрузить в память по одному экземпляру каждой иконки и скакать с указателем на нужный экземпляр.
Цитата:
указатель на след узел
Предлагаете односвязным списком идти? Иначе никак? Хотя список тоже неплох...
Цитата:
интересно ему


P.S. Вообще, я конечно, понимаю, что размахнулся, но хочу написать замену explorer.exe Он убог.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 21.04.2010 в 10:24.
Alex Cones вне форума Ответить с цитированием
Старый 21.04.2010, 10:35   #10
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Предлагаете односвязным списком идти? Иначе никак? Хотя список тоже неплох...
Это мне как то пришлось в одной структуре файловой ковыряться. Там именно так хранилась файловая система, это сделано для скорости. Файл в таком случае находится несколькими переходами по узлам (папкам), а не просматривается весь огромный файл.
Но тебе по ходу это не нужно, зачем тебе всю файловую систему хранить, тем более если ты только Пуск заменить хочешь.

Цитата:
Я могу в меню пуска на каждую папку поставить свою иконку.
А, ну если для Пуска, то да.

Цитата:
хочу написать замену explorer.exe
Ты не первый. Уже есть несколько проектов, один из известных это LiteStep (кажется так называется). Есть любопытный проект на Дельфи с открытыми исходниками http://www.sharpe-shell.org
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое создание PopUp меню ArcaN0id Помощь студентам 2 25.03.2010 19:28
Динамическое создание "суб-меню" из файлов в заданном каталоге Abhorrer Общие вопросы Delphi 5 14.03.2009 21:47
Меню с Items в виде набора Bitmap (как меню редактирования в Word'е) chandrasecar Мультимедиа в Delphi 7 14.01.2009 09:20
Динамическое меню с помощью CSS LeoN HTML и CSS 4 21.05.2008 12:46
Динамическое меню? Ice_Juice Microsoft Office Excel 12 03.03.2008 11:24