Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Интернет: Образование, Работа и Бизнес" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Программирование на Delphi (выпуск 83)
Программирование на DELPHI
Выпуск #83 (12 июня 2008 г.)
Если Вы хотите где-либо разместить материалы, представленные на www.delphi.int.ru или в данной рассылке, свяжитесь, пожалуйста, с их автором или ведущим рассылки.
Delphi.int.ru Expert Последние новости
Архив: вопросы и ответы В архив попадают вопросы, срок действия которых истёк. Каждый заданный вопрос действителен в течение одной недели, т.е. ответы на него принимаются именно в этот период. В сегодняшнем выпуске опубликованы вопросы # 406 - 420. Вопросы, на которые не было дано ни одного ответа, не публикуются. Статистика по выпуску: Кол-во вопросов: 15 Вопрос # 406 Как к Delphi прицепить С-ный lib-файл? Поясню: есть библиотека (в исходниках) откомпилированная CBuilder (т. е. obj-файлы доступны). Нужно её прицепить к проекту на Delphi, но dll использовать нельзя. Спасибо Вопрос задал: mvp (статус: 4-ый класс) 1. Отвечает эксперт: Вадим К Если она действительно в билдере скомпилирована, то некоторая надежда есть. Для этого надо знать точно сигнатуру функций. Ответ отправил: Вадим К (статус: Кандидат наук) 2. Отвечает эксперт: min@y™ В книге С. Тейксейра, К. Пачеко "Delphi 5. Руководство разработчика" есть такие разделы как: "Использование OBJ-файлов C/C++" и "Использование классов C++". Всё с примерами, естественно. Ответ отправил: min@y™ (статус: Студент) 3. Отвечает эксперт: Бубырь Александр Николаевич Лет 5 назад у меня была та же задача. Ответ отправил: Бубырь Александр Николаевич (статус: 10-ый класс) 4. Отвечает эксперт: Виталий Лещенко Здравствуйте, mvp! Ответ отправил: Виталий Лещенко (статус: 4-ый класс) 5. Отвечает эксперт: Матвеев Игорь Владимирович Здравствуйте, mvp! Ответ отправил: Матвеев Игорь Владимирович (статус: Студент) Вопрос # 407 Здрасте! Вопрос задал: Федянин Николай Петрович (статус: Посетитель) 1. Отвечает эксперт: Вадим К никак. Виндовс консоль отличается от консоли в дос. При запуске старых консольных приложений (16бит) это дело симулируется. А во врорых делфи 32 битный бинарник даёт, а турбопаскаль - 16 бит - не слинкуется. Проще на канве рисовать. Ответ отправил: Вадим К (статус: Кандидат наук) Вопрос # 408 Подскажите как можно эксопритровать данные из нескольких (например 2-ух) StringGrid в один файл Excel и HTML? Заранее Спасибо!!! Дима. Вопрос задал: Юрьев ДС (статус: Посетитель) 1. Отвечает эксперт: Вадим К А как с одного знаем? Приложение: Ответ отправил: Вадим К (статус: Кандидат наук) Вопрос # 410 есть ли готовые компоненты для работы с векторной графикой (бесплатные) или какие нибудь примеры Вопрос задал: San (статус: Посетитель) 1. Отвечает эксперт: Роман Здравствуйте, San!Небольшая библиотека для работы с векторной графикой есть тут: http://kladovka.net.ru/index.cgi?pid=list&rid=375 Исторически была создана для задания сигналов произвольной формы на ЦАПах с помощью кривых безье. Поддержка Undo. Ответ отправил: Роман (статус: 5-ый класс) Вопрос # 411 Как получить login пользователя под которым он входит в операционную систему,в сеть? Вопрос задала: Наташа (статус: Посетитель) 1. Отвечает эксперт: Роман Здравствуйте, Наташа!Значит так,имя текущего пользователя оси можно узнать к примеру так(1),или так(2).Получить список зарегистрированных под NT пользователей можно так(3). Приложение: Ответ отправил: Роман (статус: 5-ый класс) Вопрос # 412 Здравствуйте! Как определить имя пользователя и имя компьютера с которого было запущено приложение? Вопрос задала: Игракова Е.А. (статус: Посетитель) 1. Отвечает эксперт: Евгений Козаченко Здравствуйте, Игракова Е.А.! Ответ отправил: Евгений Козаченко (статус: 2-ой класс) Вопрос # 414 Здравствуйте. Я хотел бы задать вопрос на счёт формы. Вопрос задал: Толков Геннадий Викторович (статус: Посетитель) 1. Отвечает эксперт: Вадим К По первому вопросу вам поможет статья Ответ отправил: Вадим К (статус: Кандидат наук) 2. Отвечает эксперт: Бубырь Александр Николаевич http://expert.delphi.int.ru/question_370 Ответ отправил: Бубырь Александр Николаевич (статус: 10-ый класс) Вопрос # 415 Здравствуйте, уважаемые эксперты! Меня интересует следующий вопрос. Задумал я сделать что-то наподобие своей странички в локальной сети. Почитал книг, там очень подробно описывается о том, работать с Web-модулями. Но я толком не понял, как сделать свой Web-сервер с правами на запуск исполняемых EXE модулей, который будет принимать результат работы от Web-модуля и отправлять браузеру (про это там не описывалось). Была идея использовать стандартный Web-сервер от MicroSoft, который поставляется вместе с Windows: закинуть несколько страничек и модулей в папку C:\inetpub\wwwroot. Действительно, страницы открываются, но модули не запускаются, а СКАЧИВАЮТСЯ. Как установить права на запуск, я не нашел. Подскажите мне, как можно решить данный вопрос. Вопрос задал: Bingo (статус: Посетитель) 1. Отвечает эксперт: min@y™ Я никогда подобным не занимался, но дкмаю, что тебе поможет Apache web-server для Windows. Ответ отправил: min@y™ (статус: Студент) Вопрос # 417 Здравствуйте господа эксперты. Вопрос задал: Яковлев Николай Сергеевич (статус: Посетитель) 1. Отвечает эксперт: min@y™ Смотри хэлп по API-функциям RegisterHotkey() и UnregisterHotkey(). Ответ отправил: min@y™ (статус: Студент) 2. Отвечает эксперт: Вадим К А отобразить сами горячие клавиши можно с помощью компонента THotKey с стандартной поставки делфи. У него также есть свойство HotKey, которое при близком рассмотрении оказывается типа Word. Поэтому сохранять где нибудь в ини файл или свой текстовый файл не будет проблем. Ответ отправил: Вадим К (статус: Кандидат наук) Вопрос # 418 Доброго врямя суток уважаемые програмисты. Приложение: Вопрос задал: Наземнов Вячеслав (статус: Посетитель) 1. Отвечает эксперт: Вадим К Да, дожились. Мы в своё время ручками решали всё. Так надёжнее. Приложение: Ответ отправил: Вадим К (статус: Кандидат наук) Вопрос # 419 Здравствуйте! Как можно в AppConsole оформить меню, чтобы оно находилось в центре экрана, и как сделать очистку экрана Вопрос задал: Федянин Николай Петрович (статус: Посетитель) 1. Отвечает эксперт: Вадим К Вот здесь http://delphiworld.narod.ru/base/console_colored_text_out.html есть модуль, который вам поможет. Он очень подобен паскалевскому Crt. Ответ отправил: Вадим К (статус: Кандидат наук) Вопрос # 420 Здравствуйте уважаемые эксперты! Вопрос задал: Мясников Сергей Владимирович (статус: Посетитель) 1. Отвечает эксперт: Вадим К Вы хотябы название поля привели, можно было бы предложить что то внятное. А так предположу, что это поле типа BLOB. Как эго расшифровать? А это зависит, что там. Там может быть обычный текст или картинка, тогда киньте на форму TDBMemo (TDBRichEdit) или TDBImage. Подключите их к этому полю. А там увидите. Но может быть, что там действительно зашифрованые данные. Тогда нужно смотреть - не телепат я, не знаю что там, а единстенно верного ответа нет здесь Ответ отправил: Вадим К (статус: Кандидат наук) » Найти все предыдущие уроки можно на www.delphi.int.ru в разделе "Статьи". Последние 3 урока: Простые типы данных
ВведениеВ предыдущих уроках мы между делом знакомились с типами данных. Всё это время речь шла о простых типах. Сегодня мы обобщим пройденное ранее, а также познакомимся с новым материалом, который необходимо знать в рамках темы "Простые типы данных". Осмысленно подходить к выбору типов данных для используемых в программах переменных необходимо по разным причинам. Во-первых, имея под рукой многообразие доступных типов и умело ими распоряжаясь, можно сократить объём памяти, требуемый программе для работы. Экономию в 1-2 байта никто не заметит, но если речь идёт о больших объёмах данных, эти байты могут вылиться во вполне реальные мегабайты. Во-вторых, разумный выбор типов данных позволяет избежать некоторых ошибок, причём как со стороны программиста (на этапе создания программы), так со стороны пользователя (во время использования программы). Простые типы данных - общее представлениеПростые типы данных названы простыми, потому что они не содержат внутри себя никаких других типов. Кроме того, простые типы данных обеспечивают хранение в памяти только одного значения. К простым типам данных относят следующие:
Следует отметить, что все эти типы за исключением вещественного, упорядочены. Что это значит? А это значит, что в рамках данного типа значения расположены не в произвольном порядке, а в порядке возрастания. Зная об этом, в некоторых случаях можно исключить в своей программе лишний код. Поясню на примере, как именно упорядочены значения в этих типах данных: Целочисленный тип - содержит числовые значения, целые числа. Числа упорядочены по возрастанию: ..., -2, -1, 0, 1, 2, 3, ... Из того, что перечисленных типы данных упорядочены, следует, что все значения образуют конечную последовательность. Это соответствует нашим представлениям о типах данных - все они имеют свои ограничения. К примеру, нет числового типа данных, который позволил бы хранить сколь угодно большое число. "Большие" типы есть, но "число" "бесконечность" они хранить не могут. Функции и процедуры для порядковых типов данных Существует несколько полезных функций и процедур, без использования которых, порой, сложно оперировать порядковыми типами данных: Pred() - функция возвращает предыдущее значение для выражения, указанного в качестве единственного аргумента. Примеры: Pred(5) = 4, Pred('E') = 'D', Pred(True) = False. Succ() - функция, обратная для Pred() - возвращает следующее значение. Примеры: Succ(5) = 6, Succ('E') = 'F', Succ(False) = True. Ord() - возвращает порядковый номер значения в списке значений типа данных. С этой функцией мы уже встречались при работе со строками - с её помощью мы узнавали код символа. Примеры: Ord('A') = 65, Ord(True) = 1. Low() - возвращает минимальное значение указанного типа данных. Примеры: Low(Byte) = 0, Low(Boolean) = False, Low(Char) = #0 (символ с кодом 0). High() - возвращает максимальное значение указанного типа данных. Примеры: High(Byte) = 255, High(Boolean) = True, High(Char) = #255 (в русской локали это символ "я"). Ну и ещё две процедуры, с которыми мы уже знакомы: Dec() - уменьшает значение на единицу. Inc() - увеличивает значение на единицу. Не забывайте о втором необязательном параметре этих процедур. Пользовательские типы данных На основе порядковых типов данных программист может создать свои собственные типы - перечислимые и интервальные. Они будут рассмотрены ниже. Целочисленные типыКак следует из названия, целочисленные типы позволяют хранить целые числа. Среди них есть типы, которые хранят числа со знаком (т.е. положительные или отрицательные), а есть и такие, которые хранят только положительные. Чем большее количество значений может содержать тип, тем больше памяти он занимает. Рассмотрим целочисленные типы данных. Сначала рассмотрим беззнаковые типы, т.е. те, которые позволяют хранить только положительные числа и ноль: Byte - значения 0..255 - занимает в памяти 1 байт. Word - значения 0..65535 - 2 байта. LongWord - значения 0..4294967295 - 4 байта. Теперь типы со знаком (отрицательные числа записываются со знаком минус "-" впереди, неотрицательные могут записываться как со знаком "+", так и без него): ShortInt - значения -128..127 - 1 байт. SmallInt - значения -32768..32767 - 2 байта. LongInt - значения -2147483648..2147483647 - 4 байта. Int64 - значения -2^53..2^53-1 - 8 байт. Существуют также 2 общих типа, которые находят своё отражение в вышеперечисленных. Рекомендуется использовать именно эти типы, т.к. компилятор "заточен" под них и создаёт более быстрый и эффективный код: Integer - значения -2147483648..2147483647 - 4 байта. Cardinal - значения 0..4294967295 - 4 байта. Следует отметить, что целые числа могут быть представлены не только в десятичной, но и в шестнадцатеричной системе счисления, т.е. в виде $xxxxxxxx, где x - один из символов 0, 1, ..., 8, 9, A, B, ..., E, F. К примеру, все цвета (точнее, их коды) представляются именно в виде шестнадцатеричных чисел. Логические типыС логическими выражениями и с логическим типом данных мы уже знакомы - это тип Boolean, принимающий значения True и False. Помимо Boolean существуют следующие логические типы: ByteBool, WordBool и LongBool. Однако последние введены лишь для обспечения совместимости с другими языками и системами программирования. Использовать рекомендуется только тип Boolean. Логическое значение в памяти занимает 1 байт. На самом деле, конечно, достаточно и одного бита, но оперировать ячейками меньше байта, мы, к сожалению, не можем. Символьные типыСимвольные типы обеспечивают хранение отдельных символов. Основной тип данных - Char, который содержит символы с кодами 0..255. Существуют ещё типы AnsiChar и WideChar. Тип AnsiChar эквивалентен типу Char, т.е. по сути это один и тот же тип. Занимает в памяти 1 байт. Для кодирования символов используется код ANSI (American National Standards Institute). Тип WideChar кодируется международным кодом Unicode и занимает в памяти 2 байта. Таблица Unicode включает символы практически всех языков мира. Вещественные типыИз названия следует, что эти типы используются для хранения вещественных, т.е. действительных чисел. Отличаются они границами допустимых значений и точностью, т.е. числом цифр после запятой. Вот эти типы: Real (он же Double) - значения от 5.0x10^-324 до 1.7x10^308, точность - 15-16 цифр, занимает в памяти 8 байт. Real48 - значения от 2.9x10^-39 до 1.7x10^38, точность - 11-12 цифр, 6 байт памяти. Single - значения от 1.7x10^-45 до 3.4x10^38, точность - 7-8 цифр, 4 байта. Extended - от 3.6x10^-4951 до 1.1x10^4932, точность - 19-20 цифр, 10 байт памяти. Comp - от -2x10^63+1 до 2x10^63-1, точность - 19-20 цифр, 8 байт. Currency - от -922337203685477.5808 до 922337203685477.5807, точность - 19-20 цифр, в памяти занимает 8 байт. Как и в случае с целыми числами, перед вещественными числами может стоять знак "+" или "-". Существует 2 формы записи вещественных чисел - с фиксированной точкой и с плавающей. Запись с фиксированной точкой представляет собой обычную запись, в которой целая и дробная части отделены друг от друга точкой/запятой. Запись с плавающей точкой подразумевает запись порядка числа, который отделяется от самого числа буквой "E" (запись "e" тоже допустима). Например, запись 1.5e2 означает число 1.5 с порядком +2, т.е. это 1.5x10^2 = 150. Типы Comp и Currency были введены специально для произведения точных денежных расчётов. При этом, тип Comp, как видно из значений границ диапазона, хранит целые числа, поэтому при задании чисел с дробной частью они автоматически преобразуются в ближайшее целое число. Перечислимые типы данныхОт рассмотрения готовых типов данных перейдём к типам, которые могут быть созданы самим программистом. Один из вариантов, как было отмечено выше, - это перечислимый тип. Смысл перечислимого типа в том, что мы явным образом указываем (перечисляем) все возможные значения. Преимущества в том, что кроме заданных значений переменные этого типа не смогут принимать больше никаких значений. Кроме того, значения можно задавать вполне осмысленные - например слова. Это упростит понимание кода и написание программы. Значения типа данных перечисляются через запятую, а весь этот набор заключается в круглые скобки. Описание типа должно производиться в специальном разделе раздела описаний - разделе описания типов. Этот раздел предваряется ключевым словом type. Т.е. запись идёт приблизительно так же, как и описание переменных или констант, только вместо var и const пишется type. Сам тип описывается следующим образом: название типа, далее знак равенства и далее само значение. В случае с перечислимым типом это будет набор возможных значений. Примечание: практически все типы данных в Object Pascal принято называть с буквы "T" (сокращённо от "Type"). Это не закон языка - просто одно из правил хорошего тона. Зная, что "T***" - это тип, вы никогда не ошибётесь, в противном же случае название можно спутать, например, с названием переменной. Допустим, мы хотии задать тип данных, определяющий один из месяцев года. Мы можем описать его так: type TMonth = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec); var M: TMonth; {...} M:=Jun; Обратите внимание, что после описания перечислимого типа в программе не может быть переменных, название которых совпадает с названием значений объявленного типа. В нашем примере не может быть переменных "Jan", "Feb" и т.д. При попытке присвоения переменной перечислимого типа значение, не указанное в списке, компилятор выдаст ошибку, поэтому ошибиться не представляется возможным. Раздел type существует как в модуле всей формы (в этом разделе изначально описана сама форма: TForm1 = class(TForm) ... ), так и в любой подпрограмме. Область действия типа, соответственно, определяется местом в программе, в котором он описан. Интервальные типы данныхИнтервальные типы данных (также их называют ограниченными) получаются из имеющихся типов путём ограничения диапазона значений. Интервал задаётся двумя константами - начальной и конечной границей. При каждом присвоении значения переменной выполняется проверка соответствия нового значения указанному диапазону. Если значение не попадает в диапазон, выдаётся сообщение об ошибке. Во время выполнения программы задание недопустимого значения к ошибке не приводит, зато значение переменной может стать неверным. Например, мы хотим в программе работать с датами. Можно создать ограниченные типы данных для значений дня, месяца и года (диапазон для значения года следует задать в зависимости от контекста задачи): type TDay = 1..31; TMonth = 1..12; TYear = 1900..2100; Помните, что использование ограниченного типа данных не уменьшит объём занимаемой памяти. Это следует из того, что задание интервала - это всего лишь условное задание возможных значений из общего набора значений данного типа. ЗаключениеСегодня мы рассмотрели простые типы данных - целочисленные, вещественные, символьные и логические, а также научились создавать перечислимые и интервальные типы данных в своих программах. Как было отмечено в начале, все эти типы позволяют хранить только одно значение и не содержат внутри себя других типов. В дальнейшем мы перейдём к рассмотрению структурных типов данных, где дело обстоит иначе. Оцените данный урок (1 - плохо, ..., 5 - отлично):
-1- -2- -3- -4- -5-. Комментарии в тексте письма приветствуются.
Самые популярные статьи на сайте: ∙ Как можно из Delphi отслеживать все события Windows? Выравнивание компонентовАвтор: Вадим К ВступлениеОчень часто, когда поднимается вопрос о дизайне программы, программисты начинают изобретать решения, чтобы их программы нормально выглядели при разных размерах форм. Пишут тонны кода, которые не дают уменьшаться форме меньше положенного или вообще не дают изменять размер. Пишут код для того, чтобы при изменении размеров формы компоненты аккуратно заполняли её. Но оказывается, что многие задачи в Delphi уже решены, надо только уметь использовать их. Рассмотрим свойства компонентов, которые так или иначе связаны с позиционированием компонентов относительно друг друга, а потом и несколько примеров для реализации типичных интерфейсов программ. Свойства будут рассмотрены в алфавитном порядке, так что при чтении, возможно, придется "прыгать". Свойства Align (выравнивание) Свойство заставляет компонент менять некоторые из своих размеров и положение при изменении размеров компонента-родителя. Возможные значения: alNone – значение по умолчанию, положение компонента зависит только от Left, Top, Width, Height. alBottom – компонент "прижимается" к нижней части компонента-родителя. Занимает всю доступную ширину родителя. Работает только свойство Height. Если есть два компонента, один из которых имеет alBottom (или alTop), а второй alLeft (alRight), то первый компонент займёт максимальную высоту, а второй разместится в оставшейся части. alTop – компонент "прижимается" к верхней части компонента-родителя. Остальное – аналогично alBottom. alLeft - компонент "прижимается" к левой части компонента-родителя. Занимает всю доступную высоту родителя. Работает только свойство Width. alRight - компонент "прижимается" к правой части компонента-родителя. Аналогичен alLeft. alClient – компонент занимает всё доступное пространство компонента-родителя. Если есть компоненты с другими выравниваниями, то вначале выравниваются они. Нельзя разместить на одном родителе два компонента с этим типом выравнивания. AlignWithMargins (выравнивать с учетом отступов) Указывает на то, что при использовании свойства Align, нужно учитывать свойство Margins. О нём - ниже. Anchors С английского названия этого свойства переводиться как "якорь". Позволяет закрепить края компонента к краям родителя таким образом, чтобы при изменении размеров родителей расстояние между заданными краями оставалось постоянным. Свойство представляет собой множество (set). В инспекторе объектов редактируется как 4 вложенных свойства типа Boolean. По умолчанию выставлены только akTop и akLeft. Чтобы понять, как это свойство работает, сделайте такие два эксперимента. Поставьте на форму панель (можно кнопку), сделайте размеры такими, чтобы компонент занимал по площади где-то половину формы и был размещён в центре. Выставьте все четыре подсвойства в True. Запустите программу и изменяйте мышкой размеры формы, понаблюдайте эффект. Также попробуйте выставлять только некоторые подсвойства равными True. Это свойство появилось с 4, то ли c 5 версии Delphi. AutoSize (авторазмер) Если значение свойства - True, то компонент пытается занять минимальный размер, при котором на нём вмещаются все его дочерние компоненты без сдвига оных. В случае, если на компоненте нет ничего, то он может ужаться до нулевых размеров (так поступает панель). Не все компоненты имеют это свойство. Constraints (ограничивающее условие) Иногда бывает, что нежелательно, чтобы компонент увеличивал (или уменьшал) свои размеры больше какой-то величины. Поэтому его размеры можно и нужно ограничить. Это свойство имеет четыре подсвойста: MaxHeight, MaxWidth, MinHeight и MinWidth, названия которых сами говорят за себя. Если например, в свойство MaxHeight формы вписать число 400, то увеличить высоту формы больше 400 не получится. Число 0 означает игнорирование данного ограничения. Понятное дело, что MaxHeight >= MinHeight, и аналогично с шириной. Если попытаться нарушить условие, то Delphi поправит за вами, уравняв их. Кстати, при этом наблюдается интересный эффект. Если MaxHeight = MinHeight, то у компонента (формы) нельзя изменить высоту. А ширину – можно. Развернуть в полный экран тоже не получится. Рекомендую поэкспериментировать с этим свойством. Хотя его применение и достаточно ограничено. Height (высота) Указывает высоту компонента в пикселях. Игнорируется при некоторых установках свойств Align и Anchors. Left (слева) Указывает на расстояние в пикселях от левого края компонента до левого края компонента-родителя (обычно это форма). Игнорируется при некоторых установках свойств Align и Anchors. Margins (кромка, край; приграничная область) Это свойство начинает проявлять себя только если AlignWithMargins = True. В таком случае можно указать, на сколько меньше должен занимать компонент при выравнивании. Вокруг компонента как бы создаётся отступ. Посмотрите на рисунок, где для нижней панели все 4 подсвойства выставлены по 10 и сравните с предыдущим рисунком. Padding (заполнение) Это свойство чем-то подобно свойству Margins. Только действует для вложенных в данный родительский компонент дочерних компонент. То есть, выставив равным все 4 подсвойства по 10, а для вложенного компонента сделав Align = alClient, получим, что компонент не займёт всё пространство, а останется каемка в 10 пикселей. Смотрим на рисунок. Естественно, выставлять все 4 подсвойства одинаковыми не обязательно. И как всегда, чтобы увидеть всю прелесть этого свойства, меняем размеры формы мышкой и наблюдаем. Top (верх) Указывает на расстояние в пикселях от верхнего края компонента до верхнего края компонента родителя (обычно это форма). Игнорируется при некоторых установках свойств Align и Anchors. Width (ширина) Указывает на ширину компонента в пикселях. Игнорируется при некоторых установках свойств Align и Anchors. Примеры реальных приложенийПопробуем "сымитировать" интерфейс некоторых популярных приложений, чтобы расположение компонентов было одинаковым. Блокнот Да, да, тот Блокнот, который есть в Windows. Порядок действий:
Осталось только реализовать меню и приложение готово. Запустите и посмотрите, как при изменении размеров наше приложение ведёт себя аналогично Блокноту. The Bat! Теперь усложним задачку. Сымитируем интерфейс популярного почтовика. Кстати, он написан на Delphi.
Теперь у нас два меню, что ж, уберём лишнее – выделим форму и свойство Menu сделаем пустым.
Запускаем, наслаждаемся. У меня получилось так: Особенности – компоненты автоматически подгоняют размер при изменении размеров формы, границы между TreeView, ListView и просмотрщиком писем можно менять при запущенной программе. И самая главная особенность - достаточно профессиональный интерфейс мы получаем стандартными компонентами и без единой строчки кода! Интересные заметки1. Если один или несколько компонентов полностью заполняют своего родителя, то выделить мышкой самого родителя невозможно. И для многих это трагедия – они не знают, что делать. Можно, конечно, в инспекторе объектов в выпадающем списке поискать подходящий, но обычно и имени нужного компонента мы не помним... А всё просто. Выделяем любой компонент, который лежит на заданном компоненте, и жмём Esc. И, вуаля, выделен компонент-родитель! Ещё одно нажатие - и выделение уходит к родителю родителя. Это будет продолжаться до тех пор, пока выделение не перейдёт к форме. В примере почтовика, можно, нажав три раза Esc, гарантировано дойти до формы. 2. Если случайно компонент поставили не на того родителя, то перетянуть мышкой его уже нельзя. Удалять и ставить по-новому? НЕТ! На помощь приходит клавиатура. Выделяем нужный компонент (или несколько, просто зажав Shift). Потом жмём Ctrl+X (вырезать). Кликаем по нужному компоненту-родителю и жмём Ctrl+V (вставить). Более того, таким образом можно переносить компоненты между формами и даже проектами! А можно "вставить" не на форму, а в Блокнот. Присмотревшись, можно понять, как в виде текста представлен компонент, и даже подредактировать его. А потом и вставить на другую форму. 3. Если несколько компонентов находятся на форме, то их можно выделить, просто "охватив мышкой". То есть, провести по диагонали так, что бы в полученный прямоугольник попали нужные компоненты. А вот если компоненты находятся на панели, то так уже не получится – мы просто перемещаем панель. Решение простое. Просто нажмите Ctrl на клавиатуре и выделяйте как обычно. 4. Поставив много компонент на форму, обнаруживаем, что некоторые компоненты не хотят быть над другими или под ними. Решается просто – выделяем компонент, кликаем правой кнопкой мыши. В меню Control есть два пункта Send to Back (отправить вглубь) и Bring to front (ко мне). 5. В случае наличия на форме большого количества Edit'ов, многие пользователи любят переключаться между ними с помощью Tab. Но как только в своей программе попробуешь сделать это – курсор прыгает между ними, как ему вздумается. Кликаем правой кнопкой, в меню TabOrder выставляем стрелочками нужный порядок. Пусть пользователи радуются. ЗаключениеПомните, что красивый и удобный интерфейс вашей программы привлекает пользователя, и он может закрыть глаза на некоторые недоделки или отсутствующую функциональность. Но некоторые люди почему-то считают, что сделав форму разноцветной, с большими кнопками и дивными шрифтами, их программа – верх совершенства. Поверьте, половина пользователей удалит такую программу и соседу закажет. А если вы, исходя из каких-то внутренних убеждений, считаете, что без такой красоты обойтись нельзя, сделайте её хотя бы настраиваемой. Разделы: Статьи | Компоненты | Plug-in's | Документация | Исходники | Программы | Игры | Изображения Уважаемые читатели! Отправляйте полезные компоненты/модули, исходники, собственные программы/игры, документацию - книги, учебники и они будут размещены на сайте.
Ведущий раздела: Bruder Программа "Ёлочка" program Елочка; Источник: bayanov.net :)) Присылайте компьютерные анекдоты, рассказы и истории по этой ссылке и они будут опубликованы в ближайших выпусках рассылки. WWW: http://www.delphi.int.ru/ E-mail: admin@delphi.int.ru; support@delphi.int.ru
Архив рассылки: http://subscribe.ru/archive/comp.soft.prog.delphifaq Ведущий рассылки: Ерёмин Андрей
|
В избранное | ||