среда, 19 октября 2011 г.

Урок 22. Компонент навигатор


На предыдущем уроке мы начали наполнять главную форму программы "Расходы" контейнерами и элементами управления. На этом я предлагаю временно оставить наш проект. Я постараюсь объяснить почему. Какое основное действие будет производить оператор, запустив программу, как Вы думаете? Чаще всего он будет вводить новые данные. Что ему нужно для этого? Следуя логике, заложенной в структуре базы данных, следуя фазам луны :-) и правилам бухгалтерского учета, учетные записи лучше группировать. Группировка в журнально-ордерной системе (это я сейчас не ругнулся, поверьте) имеет одни принципы. Эта система была создана до появления вычислительных машин. С появлением же компьютеров, надобность в группировке как таковой отпала вовсе: в базу данных можно валить все навалом, потом разберемся, когда будем из нее данные извлекать. И все же, во многих программах присутствует вид группировки записей в мемориальные ордера (опять не ругнулся). Под этим каждый волен понимать все, что хочет,  а я предлагаю не мучиться (все же не большую систему пишем) и принять один уровень группировки равным одному календарному месяцу. В крупных системах мемориальные ордера группируют по дебетовому или кредитовому принципу, а мы сопоставим мемориальному ордеру месяц. Вряд ли в нашем учете накопится огромное количество записей среди которых потребуется отыскать ошибку - это основная причина настоящего упрощения. Хотя и в этой программе пользователь может применить иные принципы. Наше дело - написать такой софт, который его в его творчестве не будет сдерживать и ограничивать.
Поэтому, первое, что должна наша программа спросить пользователя - это: в какой мемориальный ордер желаете запись добавить?
Как программа может это сделать? Соответствующую форму на экран вывести.
Что в той форме будет видеть пользователь? Пользователь в той форме должен увидеть список всех заведенных им мемориальных ордеров - МО (с учетом нашего упрощения - месяцев).
- А что, если наступил новый месяц, спросят меня любознательные? Как быть пользователю?
Справедливый вопрос. Стало быть, в форме, позволяющей просматривать список МО, и выбирать нужный из этого списка, должна быть предусмотрена возможность добавления новой записи. Ох, чувствуете, куда нас занесло?
А занесло нас в область управления (добавления, редактирования и удаления - AED от Add, Edit, Delete) записями в таблице базы данных.
Вообще-то, для этого существует стандартный компонент, поставляемый с средой разработки. Но...
Однажды шеф сказал: "Хочу, чтобы на кнопках были надписи вместо непонятных пиктограмм!"
И действительно, домашнюю хозяйку, решившую с помощью программы "Расходы" поучитывать слегка свои затраты на губную помаду, лучше не пугать пиктограммами и, не дай Бог, иностранными словами.
Увы, такого компонента в стандартной поставке нет, только TDBNavigator.
Пришлось яндекс погуглить :-)
После долгих мытарств отыскал, наконец, на Delphi World 6 статью NavigationBotton. Отдельное спасибо автору!
Потом были долгие поиски контейнера для набора кнопок. Суть проблемы, с которой сталкивались многие до меня, но никто не поделился результатом ее решения, заключается в том, что при изменении размера контейнера компонента хотелось, чтобы пропорционально (в конструкторе) менялись бы и размеры кнопок.
Для любознательных скажу пару слов: на основе добытой NavigationBotton и стандартного контейнера TPanel, я сделал собственный компонент, поменяв надписи на кириллические, исключив кнопки перехода по записям, добавив свойство источника данных DataSource и написав подпрограмму пересчета размеров. Исходный код, который, признаюсь, далек от идеала, каждый любознательный может скачать вот здесь. Ну, а для тех, кто не захочет заморачиваться и разбираться в чужих писульках - добро пожаловать на страничку с библиотекой компонентов Pro-Delphi (кстати, для успешной дальнейшей работы она должна уже быть установлена в Вашей среде разработки).

Что же дальше? Попробуем организовать работу с одной из таблиц базы данных. Пора уже, не правда ли?

Комментариев нет:

Отправить комментарий