Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Интернет: Образование, Работа и Бизнес" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Программирование на Delphi (выпуск 80)
Программирование на DELPHI
Выпуск #80 (15 марта 2008 г.)
Если Вы хотите где-либо разместить материалы, представленные на www.delphi.int.ru или в данной рассылке, свяжитесь, пожалуйста, с их автором или ведущим рассылки.
Delphi.int.ru Expert Последние новости
Архив: вопросы и ответы В архив попадают вопросы, срок действия которых истёк. Каждый заданный вопрос действителен в течение одной недели, т.е. ответы на него принимаются именно в этот период. В сегодняшнем выпуске опубликованы вопросы # 356 - 370. Вопросы, на которые не было дано ни одного ответа, не публикуются. Статистика по выпуску: Кол-во вопросов: 15 Вопрос # 356 Здравствуйте господа эксперты. Вопрос задал: Яковлев Николай Сергеевич (статус: Посетитель) 1. Отвечает эксперт: Роман Здравствуйте, Яковлев Николай Сергеевич!Вот адрес: http://delphiworld.narod.ru/base/loading_processor.html.И тутже http://delphiworld.narod.ru/_os_.html ещё много ответов на разные вопросы. Ответ отправил: Роман (статус: 5-ый класс) 2. Отвечает эксперт: Федоров Роман Сергеевич Для NT, 2000, XP Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс) Вопрос # 357 Здравствуйте уважаемые эксперты! Вопрос задал: NickStNew (статус: Посетитель) 1. Отвечает эксперт: Вадим К Единственный способ, который я знаю - это сделать отрисовку вручну. Тогда в OnDrawIten вам будет приходить сообщение о необходимости перерисовать себя вы смотрите, у данного итема состояние не выделеное случайно. Ответ отправил: Вадим К (статус: Кандидат наук) 2. Отвечает эксперт: Новаковский Юрий Аврамович Здравствуйте, NickStNew! Приложение:
Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс) 3. Отвечает эксперт: Шарайчук Сергій Олександрович Здравствуйте, NickStNew! Ответ отправил: Шарайчук Сергій Олександрович (статус: 1-ый класс) Вопрос # 358 У меня проблема, хочу зделать програму, которая реагируєт на копирование, тойсть например если её скопировали 1 раз она делает одно, 2 раза - другое, 3 раза совсем иное. Одним словом потавить счотчик на копирование! ПОМОГИТЕ ПОЖАЛУСТА!!!! Вопрос задал: Шарайчук Сергій Олександрович (статус: 1-ый класс) 1. Отвечает эксперт: Роман Здравствуйте, Шарайчук Сергій Олександрович!Странная какая-то идея...Попробуйте поискать чего-нибудь на http://www.delphikingdom.com/ там есть материаль о защите программ от копирования и взлома.Только не ясно, а где хранить информацию о кол-ве копирований,если во внешнем файле то какой в этом смысл...Да и откуда прога копироваться будет(?) с CD? Незнаю,разве что защищать её по ключевой дискете и запретить ей копироваться без неё и всё это дело шифровать...или электронным ключём на МК...Всёравно ломанут,да и стоит ли оно того...а цена...Вобщем:http://www.delphikingdom.com/ ...И кстати зачем всё это,смысл то в чём??? Ответ отправил: Роман (статус: 5-ый класс) 2. Отвечает эксперт: Вадим К Спешу вас разочаровать, но такое практически невозможно. Если программа не запускается, то она не сможет выполнить никакого кода. В своё время группа программистов разработала большой проект по защите музыкальных дисков от копирования. Были вложены немеряные деньги. И перед окончательным выходом в свет защиту ломанули. Причём банально. Защита полагалась на то, что у пользователя включен автозапуск компакта. Стартовала маленькая прога, которая потом препятствовала копированию музыки. Но скажите,
чем отличается копирование музыки на другой носитель от её воспроизведения с программной точки зрения? ничем! В любом случае её нужно вначале считать. А как вы могли догадаться, ломанули её зажатым Shift'ом. Мальчика назвали немеряным хакером и долго охотились за ним. Ответ отправил: Вадим К (статус: Кандидат наук) 3. Отвечает эксперт: Федоров Роман Сергеевич Здравствуйте, Шарайчук Сергій Олександрович! Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс) Вопрос # 359 Имеет место быть следующая задача: необходимо разработать программный продукт для нужд логистики, возможно связь КПК, компьютеров, в двух городах России в режиме on-line. Вопрос задал: Knjazev (статус: 3-ий класс) 1. Отвечает эксперт: Вадим К Написать можно. Ваша формулировка насколько расплывачаста, что я даже не могу сказать, что же конкретно вы хотите сделать. Поэтому никаких точных указаний как/почём немогу. А написать можно всё, главное желание. Ответ отправил: Вадим К (статус: Кандидат наук) Вопрос # 360 Kak sdelat 4toby info v BD Acces mojno bylo videt tolko 4erez mou progu. sdelan 4/z ADO Вопрос задал: Сагынов Байсак Найсабекович (статус: Посетитель) 1. Отвечает эксперт: Помфюк Владимир Степанович Здравствуйте, Сагынов Байсак Найсабекович! Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент) 2. Отвечает эксперт: Косолапов Дмитрий Юрьевич Пожалуй, наилучший способ - это организация защиты БД на уровне пользователей; при этом программа подключается к базе, используя специальное имя пользователя и пароль, которые хранятся в зашифрованном виде в программе. Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 6-ой класс) 3. Отвечает эксперт: Alex Van Glukhman Здравствуйте, Сагынов Байсак Найсабекович! Ответ отправил: Alex Van Glukhman (статус: 7-ой класс) 4. Отвечает эксперт: Федоров Роман Сергеевич Здравствуйте, Сагынов Байсак Найсабекович! Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс) Вопрос # 363 Как сделать, чтобы галочки ставились в CheckListBox не только при нажатии на область пометки, но и при нажатии на название элемента? Приложение: Вопрос задал: RedMask (статус: Посетитель) 1. Отвечает эксперт: Иусов Сергей Ник. Здравствуйте, RedMask! Приложение: Ответ отправил: Иусов Сергей Ник. (статус: 3-ий класс) 2. Отвечает эксперт: Роман Здравствуйте, RedMask!Вот работающий код.Нужно для проверки использовать State которое имеет 3 состояния:cbUnchecked-выключен,cbChecked-включен,cbGray-серое состояние. Приложение: Ответ отправил: Роман (статус: 5-ый класс) 3. Отвечает эксперт: Николай Рубан Единственное что могу еще дополнительно порекомендовать, так это просто пропишите в оба обработчика (Click и ClickCheck) одинаковые действия... Приложение: Ответ отправил: Николай Рубан (статус: 8-ой класс) 4. Отвечает эксперт: Федоров Роман Сергеевич Здравствуйте, RedMask! Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс) Вопрос # 364 У меня появилась таая проблема: есть текст неважно где, в Memo, StringGrid, label, или Edit, мне нужно вывести ево на печать, как ето сделать? Пробовал через PrintDialog так же как и OpenDialog или SaveDialog, диалог принтера роботает, а што делать незнаю, ПОМОГИТЕ ПОЖАЛУСТА! Если знаете помогите розпичатать и диаграму из компонента Cart!!! Вопрос задал: Шарайчук Сергій Олександрович
(статус: 1-ый класс) 1. Отвечает эксперт: Федоров Роман Сергеевич Здравствуйте, Шарайчук Сергій Олександрович! Приложение: Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс) 2. Отвечает эксперт: Роман Здравствуйте, Шарайчук Сергій Олександрович!Посмотрите тут:http://delphiworld.narod.ru/_os_.html,должно помочь. Ответ отправил: Роман (статус: 5-ый класс) 3. Отвечает эксперт: Новаковский Юрий Аврамович Здравствуйте, Шарайчук Сергій Олександрович! Приложение: Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс) Вопрос # 365 Я очень много слішал о книге "Delphi глазами хакера" неподскажете где её можно скачать бесплатно! Вопрос задал: Шарайчук Сергій Олександрович (статус: 1-ый класс) 1. Отвечает эксперт: Игорь Данилевич Здравствуйте, Шарайчук Сергій Олександрович! Ответ отправил: Игорь Данилевич (статус: 3-ий класс) 2. Отвечает эксперт: mvp Здравствуйте, Шарайчук Сергій Олександрович! Ответ отправил: mvp (статус: 4-ый класс) 3. Отвечает эксперт: Николай Рубан Вот рекомендую Вам такую ссылочку: Ответ отправил: Николай Рубан (статус: 8-ой класс) 4. Отвечает эксперт: Федоров Роман Сергеевич Здравствуйте, Шарайчук Сергій Олександрович! Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс) Вопрос # 366 Здрасте, уважаемые эксперты!!! Подскажите, возможно-ли на Delhi, а если возможно, то как, сделать обработчик прерывания от LPT и COM портов. Заранее спасибо!!! Вопрос задал: Цопа Владимир Милузиевич (статус: Посетитель) 1. Отвечает эксперт: Вадим К Вы же не в досе, где всё можно. Под виндовсом единственно правильный способ сделать это - драйвер. Но это не стихия делфи. А зачем вам обработчик прерывания от порта? Экономить ресурсы собрались? Опрашивайте в потоке и всё. Ответ отправил: Вадим К (статус: Кандидат наук) 2. Отвечает эксперт: Роман Здравствуйте, Цопа Владимир Милузиевич!Как извесно в NT лавочка с прямым доступом к портам была прикрыта,и для работы с COM есть функции winapi,но как мне помнится обслуживание прерываний там не предусмотрено,НО есть реализация в компоненте TBComPort.Там мониторинг состояния линий порта выведен в отдельный поток с генерацией событий;для LPT есть такая штука LptWdmIo - драйвер LPTWDMIO.sys предоставляет пользовательским приложениям возможность управлять параллельными портами ПК.Он поддерживает два вида операций -- чтение из порта и записи в порт.Прерываний там нет,но при необходилости их можно реализовать опять-же отдельным потоком. Приложение: Ответ отправил: Роман (статус: 5-ый класс) Вопрос # 367 Здравствуйте. Я так и не понял насчет MediaPlayer1. Вопрос задал: Толков Геннадий Викторович (статус: Посетитель) 1. Отвечает эксперт: Федоров Роман Сергеевич Здравствуйте, Толков Геннадий Викторович! Ответ отправил: Федоров Роман Сергеевич (статус: 2-ой класс) 2. Отвечает эксперт: Роман Здравствуйте, Толков Геннадий Викторович!Вот вам два примера.Первый выводит в ListBox все файлы каталога.Второй - Функция предоставляет Вам каждый раз новое имя файла,а если список файлов исчерпан, начинает перебор снова.Может пригодиться для последовательного воспроизведения файлов. Приложение: Ответ отправил: Роман (статус: 5-ый класс) 3. Отвечает эксперт: Дима Гусаков Здравствуйте, Толков Геннадий Викторович! Приложение: Ответ отправил: Дима Гусаков (статус: 2-ой класс) Вопрос # 368 Приветствую!!!У меня MainMenu.На событие формы OnShow такой текст(работает). Нужно добавить строчек,чтоб при клике по соотв.элементу, форме передавался фокус. Приложение: Вопрос задал: KilkaMS (статус: Посетитель) 1. Отвечает эксперт: min@y™ В объявлении формы надо прописать обработчик события OnClick() для свежесозданных пунктов MainMenu. В реализации этого обработчика надо передать фокус форме. При создании нового пункта меню, его свойству OnClick надо присовоить сделанный обработчик. Приложение: Ответ отправил: min@y™ (статус: Студент) Вопрос # 369 Здравствуйте эксперты. Назовите, пожалуйста, свойство компонента TChart, которое позволит очистить поле для вывода нового изображения, Series1.Clear мне не подходит, т.к. это стирает линию. И ещё, задали вопрос, который я честно говоря даже не понял: Какими свойствами можно сделать методы компонента TChart активными и видимыми? Думаю, что вы знаете ответ на этот вопрос. Вопрос задал: Полушин Сергей Анатольевич
(статус: Посетитель) 1. Отвечает эксперт: Шарайчук Сергій Олександрович Всмысле стирает линию, формиру вопросы чотче. Очистить поле опроуй так: Chart1.SeriesList.Series[0].Clear; Ответ отправил: Шарайчук Сергій Олександрович (статус: 1-ый класс) 2. Отвечает эксперт: Вадим К По поводу второго вопроса телепаты мне подсказали, что это наверное свойства Visible, которое определяет видим/невидим и Enbled - активный/неактивный. Оба свойства буленовские, тоесть пользуемся типа так Ответ отправил: Вадим К (статус: Кандидат наук) 3. Отвечает эксперт: Новаковский Юрий Аврамович Здравствуйте, Полушин Сергей Анатольевич! Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс) Вопрос # 370 Есть форма, на которой TImage с иконкой 32bpp. Если фон формы сделать прозрачным, то 32-битная тень исчезнет. Как сделать, чтобы форма не отображалась, а изображение (с альфа каналом), которое на ней находится, было видно. Вопрос задал: Иван-488 (статус: Посетитель) 1. Отвечает эксперт: Бубырь Александр Николаевич Этот пример делает овальную форму, дальше думаю можно будет разобраться. Приложение: Ответ отправил: Бубырь Александр Николаевич (статус: 6-ой класс) 2. Отвечает эксперт: Роман Здравствуйте, Иван!Вот вам примерчик.MaskBmp-альфаканал,белый цвет будет прозрачным,и соотверственно в этих местах форма будет прозрачной. Приложение: Ответ отправил: Роман (статус: 5-ый класс) » Найти все предыдущие уроки можно на www.delphi.int.ru в разделе "Статьи". Последние 3 урока: Подпрограммы (часть 1)
ВведениеПредставьте, что у Вас в программе одна и та же последовательность действий повторяется и прописана в разных местах (например, в обработчиках нажатий разных кнопок, выбора пунктов меню и т.п.) Если в программе что-то дублируется, то написана она неверно. Точнее, сам программист не знает о возможностях, которые предоставляет ему язык программирования и/или не знаком с методами оптимизации. Чем плохо дублирование? Вы скажете, код становится более громоздким? Да, в том числе и это, но это не главное. Дело в том, что прямое копирование фрагментов кода сковывает руки и не даёт возможности в дальнейшем делать исправления. Нет, конечно, их можно делать, но если в программе в 100 различных местах написано одно и то же и это "одно и то же" нужно подправить, уйдёт не одна минута на работу, которая, в общем-то, бесполезна. Если речь идёт о каких-то визуальных изменениях программы - это ещё куда ни шло... Представьте другую ситуацию: программа рассчитывает какие-либо данные по заданной формуле. Помимо расчёт ов программа строит графики, сохраняет информацию в базе данных и т.п. В общем, многофункциональная программа. И в один прекрасный момент выясняется, что формулу расчёта нужно изменить. А у нас она по всей программе задана в явном виде. Придётся исправлять везде. А если где-то забудем исправить, ещё и проблемы возникнут - половина расчётов станут неверными, не те данные попадут в базу данных и т.д. Логично было бы задать формулу расчёта один раз и каким-либо образом её вызывать. Но как? Задать переменную-формулу нельзя... Вот здесь на помощь и приходят подпрограммы. ПодпрограммыПодпрограмма представляет собой набор операторов, команд, оформленных специальным образом. Подпрограмму можно вызывать из основной программы, причём неограниченное число раз. Вынося какой-то код в подпрограмму, мы исключаем дублирование этого кода в различных местах программы и, естественно, уменьшаем общий объём кода программы. Использование подпрограмм придаёт приложению более структурированную форму. В какой-то степени подпрограммы и упрощают чтение кода для других пользователей.
Более того, использование подпрограмм позволяет организовать разделение труда при работе над большим проектом каждый работает над своей задачей, а все результаты быстро и просто подключаются к основной программе. Типы подпрограммВсе подпрограммы делятся на процедуры и функции. В предыдущих уроках эти термины уже использовались. Сейчас Вы узнаете, в чём разница. А различий на самом деле немного. Функция - это подпрограмма, результатом работы которой является какое-либо значение (одно единственное). Это позволяет использовать функции как обычные переменные, т.е. как операнды в выражениях. Просто значения будут вычисляться "на лету". Процедуры - это подпрограммы, которые не возвращают никакого значения в результате своей работы. Тем не менее, процедуры могут использоваться для передачи в основную программу каких-либо данных, причём передаваться может не одно значение, а несколько. Но в общем и целом процедуру следует понимать просто как ярлычок на выполнение указанных действий. Управление подпрограммамиВкратце об управлении. Как уже было сказано выше, подпрограммы вызываются по именам. Если подпрограмма требует входные параметры, то они указываются в скобках и разделяются запятыми. С этим мы уже неоднократно встречались, вызывая готовые подпрограммы. Поскольку вызов подпрограммы является отдельной командой, в конце необходим символ ";" (точка с запятой). Если подпрограмма-функция используется как операнд в выражении, точка с запятой, естественно, не нужны - следует воспринимает имя подпрограммы как переменную. Если подпрограмма не требует входных параметров, скобки можно опустить, оставив только имя самой подпрограммы. А можно скобки и написать, просто между ними не будет ничего. Помните, однажды мы учились работать с генератором случаных числе (урок №12)? Там мы вызывали процедуру Randomize для инициализации генератора... Вот у этой процедуры входных параметров нет, поэтому её можно вызвать как Randomize;, так и Randomize(); Лично мне больше нравится писать со скобам и - так код становится красивее, да и сразу понятно, что это подпрограмма, а не переменная. Но, повторюсь, писать скобки или нет - дело Ваше. Наконец, можно в любой момент завершить выполнение подпрограммы. Делается это командой Exit (англ. "выход"). Выполнение прерывается в том месте, где находится эта команда. Однако важно помнить, что если Exit находится в функции, то нужно предусмотреть значение, возвращаемое функцией. Завершение выполнения функции совсем не означает, что она не вернёт никакого значения - всё с точностью до наоборот. Помните, что значение любой переменной (а значит и результата работы функции) изначально не определено! Если результатом является число, не думайте, что там записан ноль! Там может быть всё, что угодно. ЗаключениеСегодняшний урок носит в основном теоретический характер. Мы не рассматривали никаких конкретных примеров и пока что не учились создавать свои подпрограммы. Этим мы займёмся в следующий раз. Сейчас важно понять назначение подпрограмм и усвоить основную терминологию, которая используется при работе с ними. Далее, когда перейдём к практике, всё станет более понятным. Домашнее заданиеОпределить, какие входные параметры было бы логично задать для следующих подпрограмм:
Оцените данный урок (1 - плохо, ..., 5 - отлично):
-1- -2- -3- -4- -5-. Комментарии в тексте письма приветствуются.
Самые популярные статьи на сайте: ∙ Работа с приложениями Microsoft Office. Excel О формахАвтор: Вадим К ВступлениеКак известно, в приложениях, написанных на Делфи, если два типа форм – создаваемые автоматически (AutoCreate form) и создаваемые вручную. По умолчанию, если, конечно, вы не лазили в настройки, создаются формы первого типа. Рассмотрим преимущества форм первого типа и второго. Пример использования смотрите в прилагаемом архиве в каталоге Project. АвтоформыДля форм этого типа Делфи вставляет в файл проекта строки вида: Application.CreateForm(TForm1, Form1); Этот метод выполняет создание формы, плюс небольшой код, который проверяет, является ли данная форма главной (в таком случае он её отображает) или нет. Такие формы удобны тем, что к моменту запуска программы все заданные формы созданы и к ним можно смело обращаться. Для начинающих это достаточно удобно. Но! За этим удобством скрывается множество подводных камней. Во-первых, эти формы должны создаться. А это порой отнимает очень много времени – ведь должны отработать конструкторы для каждой формы. А сюда многие "запихивают" и подключение к базе, и поиск файлов на диске... При сотнях форм это начинает раздражать – программа открывается с большой задержкой (иногда счёт идёт на минуты). А главная форма отобразится только тогда, когда будут созданы все формы. И начинается перенос кода в OnShow (Это событие возникает, когда форма отображается на экране), но так как форма может скрываться и отображаться снова, то вводятся дополнительные переменные флаги. В целом код стаёт просто неподъёмным. И проект "загибается". Во-вторых, никогда не полагайтесь на то, что формы будут созданы в нужном вам порядке. Этого никто не гарантирует. К тому же, в OnCreate любой из форм нельзя надеяться, что какая то другая форма уже создана. Особенно это хорошо проявляется, когда в программе есть DataModule, хранящий компоненты для подключения к базе, а вы в OnCreate главной формы пытаетесь обратиться к базе. Формы, создаваемые вручнуюПротивники Делфи ликуют – вот оно, для маленьких проектов может Делфи и подходит, но для серьезных – нет. А решение проблемы-то простое. Для начала нужно ответить на вопрос: "Зачем создавать форму, которая возможно не будет отображена?". Например, форма "О программе". Я более, чем уверен, что в каждом сеансе работы с программой пользователи её не открывают. А туда многие любят ставить красивые большие картинки, разные спецэффекты. Давайте напишем более оптимальный код для окон типа "О программе". AboutПервым делом, сделаем форму свободной (это перевод делфийского Available form). Это можно сделать двумя способами. Можно просто открыть окно настроек проекта на вкладке Forms (меню Project – Options). Там увидите два списка. Правый скорее всего будет пуст – именно тут находятся свободные формы. А слева находятся автоматически создаваемые. Кликнем дважды мышкой по имени нашей формы, которое скорее всего будет называться AboutForm (У вас она имеет вид Form23 или что то в этом виде? Срочно переименовывайте, так жить нельзя, ведь в школе к ученикам не обращаются "ученик 3", "ученик 15"?). Она переместится в список справа. Второй способ заключается в ручной правке файла проекта – нужно просто удалить строку в которой эта самая форма создаётся. Но я не рекомендую так делать. Если раньше это было безопасно, то начиная с 2005 делфи иногда возникают осложнения – Делфи вовремя не обновляет другие файлы. Следующим этапом будет добавление метода класса для нашей формы. Методы класса – это такие методы, которые можно вызвать у класса, а не объекта. То есть не нужно создавать объект. В частности, конструктор класса является таким методом – а иначе создавать объекты было бы невозможно. Итак, делаем. 1. Добавим в public-часть формы метод, вот такого вида: class procedure MyShowForm; 2. Нажав Ctrl+Shift+C получаем заготовку обработчика. 3. В этой процедуре пишем следующее: with Create(Application) do try ShowModal; finally Free; end; Всё. Готово. Этот код делает следующее. Вначале создаст форму, потом отобразит как модальную и после закрытия формы (например методом Close) уничтожит её. То есть форма просуществует ровно столько, сколько нам она нужна. Осталось разобраться с тем, как её вызывать. А это очень просто. Вначале добавим в список uses вызывающей формы наш юнит с формой "О программе". А в обработчике соответствующего пункта меню напишем так: TAboutBox.MyShowForm;
Стоит заметить одно маленько "но". В юните с формой "О программе" осталась переменная для формы (у меня она называется AboutBox: TAboutBox). К этой переменной обращаться нельзя – она не указывает ни на какую форму! Можно даже удалить это объявление, чтобы не мешалось перед глазами. Эту методологию можно применять и для других форм подобного вида – тех, которые нужно показать и закрыть. Это могут быть формы-справочники или информационные формы. Попутные замечанияВ нашем случае на форме нужна кнопка «Ок», но писать для неё обработчик с одной строкой Close как-то некрасиво. Но есть красивое решение – устанавливаем в кнопки свойство ModalResult равным mrOk. Теперь модальная форма будет закрываться сама. Давайте чуть расширим нашу форму "О программе". Добавим возможность изменения надписи на этой форме (у меня это будет Label, содержащий имя продукта). Для этого к нашему методу дописываем параметр. Суммарно это будет выглядеть где-то так: public { Public declarations } class procedure MyShowForm(AProductName: string); ... class procedure TAboutBox.MyShowForm(AProductName: string); begin with Create(Application) do try ProductName.Caption := AProductName; ShowModal; finally Free; end; end; и соответственно вызов: TAboutBox.MyShowForm('My program'); Вся прелесть этого способа в том, что если вы вздумаете отображать имя продукта не в Label, а на навороченном компоненте, только что скачанном, вам не придется перелопачивать весь проект в поисках всех вызовов формы. И если вы работаете в команде, то для ваших коллег не нужно будет составлять объяснительные "писульки", как, где и что нужно поправлять. Ленивые формыЭто, на первый взгляд, шуточное название хорошо отображает третий вид форм, о которых мало где почитаешь. Это формы, которое создаются только тогда, когда к ним обращаются. И могут удаляться, когда их закрывают. Во многих случаях такие формы являются хорошим заменителем для автоматически создаваемых форм. Сделать такую форму bp обычной просто. Вначале делаем её свободной. Это мы уже проходили чуть выше. Следующим делом переписываем строку вида: var
LazyForm: TLazyForm;
на следующую: function LazyForm: TLazyForm;
Под строкой {$R *.dfm} добавим такое: var privateForm:TLazyForm; function LazyForm: TLazyForm; begin if not Assigned (privateForm) then privateForm := TLazyForm.Create(Application); Result := privateForm; end; В этим строках мы проверяем, если форма уже создана, то возвращаем ссылку на неё. Если нет – создаем. Самое чудесное, что остальной код переделывать не надо. То есть, можно свободно написать LazyForm.Show; и не бояться, что она не появится, а вместо неё будет окно с сообщением об ошибке. Такую форму можно закрывать, открывать снова. Можно делать модальной. Но у этой формы тоже есть один недостаток. Если где-то будет вызван деструктор, то последствия будут плачевны, если вы снова захотите увидеть форму. Но чтобы исправить это, достаточно добавить в событие OnDestroy всего одну строку - privateForm := nil; Также эту форму можно научить автоматически вызывать деструктор, когда вы её закрываете. Для этого в событии OnClose вставим строку Action := caFree; Можно заменить caFree на caHide – это обычное поведение формы – просто скрыться. Есть также caMinimize – форма будет сворачиваться, но не скрываться. И последний вариант – caNone. Он как раз заставляет "ничего не делать". Этот вариант очень удобен, когда у вас на форме введены данные и перед закрытием формы вы хотите их проверить. Проверяете в этом событии, и если что то не нравится – просто выставляете это значение и форма не закрывается. Но советую не переусердствовать, а то форму нельзя будет закрыть вообще. Правильный код будет выглядеть где-то так: If ModalResult <> mrOk then Close; If not (условие проверки правильности) then Action := caNone; Групповые действияИногда, когда открыто множество форм, хочется "попросить" каждую форму выполнить какое-то действие. На первый взгляд кажется, что нужно хранить где-то массив открытых форм. Но чтобы всё это работало стабильно, придется много постараться. Но Делфи предоставляет нам удобный инструмент. Она ведёт самостоятельно список всех открытых форм. Доступ к этому массиву получить легко. Количество открытых форм – Screen.FormCount. Обратиться к конкретной форме – Screen.Forms[индекс]. Рассмотрим на конкретном примере – закрыть все формы приложения, кроме главной. procedure TMainForm.btnCloseFormsClick(Sender: TObject); var i: Integer; begin for i := Screen.FormCount - 1 downto 0 do if Screen.Forms[i]<>Application.MainForm then Screen.Forms[i].Close; end; Если присмотреться, то ничего необычного в этом коде нет. Чуточку переделав этот код, можно к примеру поменять заголовки всех форм. Пойдём чуть дальше. Хочется обращаться к конкретным методам формы. Оказывается, это можно делать, даже не зная типа формы, нужно знать только имя метода и количество параметров. В приложении вы найдёте пример (каталог AllForm), как у всех форм выполнить метод по имени. Сам код вынесен в отдельный юнит и может применяться в любых приложениях. Есть только два ограничения: - метод должен быть обявлен в published разделе (без этого никак); Вместо окончанияИногда, когда кажется, что добавление новой функциональности в работающий проект приводит к переработке половины кода, долгой отладке кода, который никак не относится к добавленному коду, если верить здравой логике, значит приложение плохо спроектировано. Всегда стоит соблюдать простое правило - "Мухи отдельно, котлеты отдельно". То есть, разный по назначению код не должен находиться в одном месте. Разделы: Статьи | Компоненты | Plug-in's | Документация | Исходники | Программы | Игры | Изображения Уважаемые читатели! Отправляйте полезные компоненты/модули, исходники, собственные программы/игры, документацию - книги, учебники и они будут размещены на сайте.
Ведущий раздела: Bruder Вначале Бог создал бит и байт... 1. Вначале Бог создал бит и байт. И из них он создал слово. 2. И было в слове два байта, и ничего больше не было. И отделил Бог единицу от нуля, и увидел он, что это хорошо. 3. И сказал Бог: - «Да будут данные». И стали данные. И сказал Бог: - «Да займут данные отведенные им места». И создал он гибкие диски, жесткие диски и компакт-диски. 4. И сказал Бог: - «Да будут компьютеры, чтобы было куда поместить гибкие диски, жесткие диски и компакт-диски». И создал Бог компьютеры, и назвал их оборудованием. 5. И не было еще программного обеспечения, но создал Бог программы большие и малые, и сказал им: - «Идите, плодитесь, и размножайтесь, и заполните собой всю память». 6. И сказал Бог: - «И создам я программиста. И будет программист писать новые программы и управлять компьютерами, программами и данными». 7. И создал Бог программиста, и поместил его в вычислительный центр. И показал Бог программисту древо каталогов и сказал [ему]: - «Ты можешь использовать все тома и каталоги, ТОЛЬКО HЕ ИСПОЛЬЗУЙ WINDOWS». 8. И сказал Бог, что нехорошо программисту быть одному, и вынул из него ребро и создал из ребра другое существо, которое было похоже на программиста, и восхищалось программистом, и любило программы, которые писал программист. И назвал Бог [это] существо пользователем. 9. И работали программист и пользователь под голой ДОС, и было это хорошо. 10. Hо Билл был хитрее остальных созданий божьих. И сказал Билл пользователю: - «Разве Бог велел тебе не запускать никаких программ?» 11. И сказал пользователь Биллу: - «Бог разрешил нам использовать любую программу и любые данные, только не разрешил нам запускать Windows, или мы умрем». 12. И сказал Билл пользователю: - «Как ты можешь рассуждать о том, чего даже не пробовал? Когда ты запустишь Windows, ты станешь равным Богу. И сможешь делать что угодно простым щелчком мыши». 13. И увидел пользователь, что плоды Windows приятнее и легче в использовании. И увидел пользователь, что любое знание стало бесполезным, ибо Windows легко его заменяла. 14. Поэтому пользователь установил Windows на свой компьютер и сказал программисту, что это хорошо. 15. И программист сразу же начал искать новые драйверы. И спросил его Бог: - «Что ты ищешь?» И ответил программист: - «Я ищу новые драйверы, потому что не смог найти их в ДОС». И вопросил Бог: - «Кто сказал, что тебе нужны драйверы? Ты запускал Windows?» И ответил программист: - «Билл сказал это». 16. И сказал Бог Биллу: - «За то, что ты сделал, будешь ненавидим всеми созданиями. И пользователь будет всегда недоволен тобой. И будешь ты всегда продавать окна». 17. И сказал Бог пользователю: - «За то, что ты сделал, Windows будет разочаровывать тебя и станет пожирать все твои ресурсы, и будешь ты использовать отвратительные программы, и всегда зависеть от помощи программиста». 18. И сказал Бог программисту: - «За то, что ты послушался пользователя, будешь несчастлив. Во всех твоих программах будут ошибки и станешь ты исправлять и исправлять их до скончания века». 19. И выгнал их Бог из вычислительного центра, и запер дверь, и защитил ее паролем. 20. ПРОГРАММА ВЫЗВАЛА ОБЩУЮ ОШИБКУ ЗАЩИТЫ. 21. Теперь, избавившись от посторонних глаз, Бог достал UNIX и взялся за работу. :)) Присылайте компьютерные анекдоты, рассказы и истории по этой ссылке и они будут опубликованы в ближайших выпусках рассылки. WWW: http://www.delphi.int.ru/ E-mail: admin@delphi.int.ru; support@delphi.int.ru
Архив рассылки: http://subscribe.ru/archive/comp.soft.prog.delphifaq Ведущий рассылки: Ерёмин Андрей
|
В избранное | ||