Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на Delphi

  Все выпуски  

Программирование на Delphi (выпуск 85)


Программирование на DELPHI
Выпуск #85 (28 сентября 2008 г.)

Разделы сайта:

Delphi.int.ru

Новости сайта
Регистрация »
Файловый архив
Статьи
Компоненты
Plug-in's
Документация
Исходники
Изображения
Игры
Программы
Рассылки сайта
F.A.Q.

IRC-канал сайта:

Сервер: irc.dalnet.ru
Порт: 6667
Канал: #delphiintru

Ждём Вас на нашем канале!

Доброго времени суток, уважаемые читатели!

К сожалению, в жизни рассылки произошёл довольно длительный отпуск, но это никак не повлияло на качество предоставляемых материалов и развитие сайта за этот период.

Новости сайта:

20 сентября 2008 г.

Обновлён интерфейс личной зоны пользователей My Delphi.int.ru. Создан новый стиль - Windows Vista. Прежний стиль сохранён, и он имеет название Windows XP. Выбор стиля осуществляется с помощью списка, расположенного в строке заголовка виртуального окна. Участнику Блазер выражается благодарность за помощь в разработке нового стиля! Приятной работы с обновлённым интерфейсом!
http://my.delphi.int.ru/

27 сентября 2008 г.

Для удобства работы по просьбам участников создана страница "Активные вопросы". На этой странице можно просмотреть все вопросы, на которые в данное время принимаются ответы. Там же показано и число ответов, данных на каждый вопрос. Страница будет удобна экспертам, а в особенности тем, кто не получает вопросов по e-mail, а просматривает их непосредственно на сайте.

Если Вы новичок и совсем недавно подписались на рассылку, рекомендуем зарегистрироваться на сайте. Регистрация предоставит Вам полный доступ к возможностям сайта. К примеру, без регистрации Вы не сможете задавать на сайте вопросы, оставлять комментарии к файлам и участвовать в опросах.
Перейти к регистрации »
Задать вопрос »

В этом выпуске:

  • Обучение - урок 24: Записи (часть 1) - знакомство с записями - одним из сложных типов данных;
  • Статья: Pascal и Delphi - об истории языка программирования Pascal и среды Delphi;
  • Файловый архив - новые компоненты, исходники и программы;
  • Юмор - Кто есть кто (грабли).

» Предложение от дружественного сайта, также посвящённого Delphi:
Научись программировать на Delphi вместе с www.delphiexpert.ru. Не теряй время, подпишись на бесплатную рассылку прямо сейчас!

Статистика Delphi.int.ru Expert на 28.09.2008, 18:00 (предыдущий подсчёт - 18.07.2008, 18:00):

Количество экспертов: 65 (+8).
Участниками задано вопросов: 1944 (+169).
Экспертами дано ответов: 2599 (+176).
Количество сообщений на мини-форумах: 4735 (+1082).
Максимальное число разосланных в день писем (за всю историю): 809 (17.07.2007, +0).

До встречи в следующем выпуске!

Разделы рассылки:

» Авторское слово
» Обучение Delphi
» Delphi.int.ru Expert
» Статья по Delphi
» Файловый архив
» Юмор

Delphi.int.ru Expert
Сообщество программистов: общение, помощь, обмен опытом.

Количество читателей рассылки (28.09.2008, 18:00):
5616+2051+478= 8145 (-29)

Связь по e-mail:

admin@delphi.int.ru
support@delphi.int.ru


Если Вы хотите где-либо разместить материалы, представленные на www.delphi.int.ru или в данной рассылке, свяжитесь, пожалуйста, с их автором или ведущим рассылки.

Delphi.int.ru Expert
Сообщество программистов: общение, помощь, обмен опытом
(текущая версия системы: 2.50; последнее обновление: 20.09.2008)

Последние новости

20 сентября 2008 г.

В разделе Статистика страница "Вопросы и ответы" переименована в "Основная статистика". Помимо информации о вопросах и ответах добавлена информация по мини-форумам.
Также на сайте произведены технические оптимизационные работы и некоторые визуальные изменения на страницах.

27 сентября 2008 г.

Для удобства работы по просьбам участников создана страница "Активные вопросы". На этой странице можно просмотреть все вопросы, на которые в данное время принимаются ответы. Там же показано и число ответов, данных на каждый вопрос. Страница будет удобна экспертам, а в особенности тем, кто не получает вопросов по e-mail, а просматривает их непосредственно на сайте.
http://expert.delphi.int.ru/active-questions/

В начале каждого месяца проходит голосование за лучший ответ месяца и самый интересный вопрос. Победителям вручаются почётные медали.
За июль медали получили: Вадим К (лучший ответ) и Phoenix (лучший вопрос).
За август медали получили: Feniks (лучший ответ) и red_88 (лучший вопрос).

 

Последние достижения:

18 сентября 2008: Ученый стал экспертом и теперь имеет статус 1-ый класс (прежний статус: Посетитель).
8 сентября 2008: Блазер повысил свой уровень и теперь имеет статус 2-ой класс (прежний статус: 1-ый класс).
3 сентября 2008: Шичко Игорь повысил свой уровень и теперь имеет статус 5-ый класс (прежний статус: 4-ый класс).
21 августа 2008: Мережников Андрей повысил свой уровень и теперь имеет статус 4-ый класс (прежний статус: 3-ий класс).
14 августа 2008: Шичко Игорь повысил свой уровень и теперь имеет статус 4-ый класс (прежний статус: 3-ий класс).

 

Архив: вопросы и ответы

В архив попадают вопросы, срок действия которых истёк. Каждый заданный вопрос действителен в течение одной недели, т.е. ответы на него принимаются именно в этот период. В сегодняшнем выпуске опубликованы вопросы # 436 - 460. Вопросы, на которые не было дано ни одного ответа, не публикуются.
Так как темп поступления вопросов от пользователей намного выше темпа их публикации, в рассылке публикуются вопросы, заданные довольно давно. Тем не менее, вопросы публикуются по порядку, без пропусков. Просмотреть любые вопросы и ответы Вы всегда можете на сайте.

Статистика по выпуску:

Кол-во вопросов: 24
Кол-ответов: 40
Баллы за ответы: 140
 

Вопрос # 436

Добрый день,уважаемые эксперты! Подскажите, пожалуйста, чайнику где можно откопать пример (исходничек) или подробное описание механизма переноса остатков,например, товара на начало месяца. Т.е. проблема с входящим сальдо. Есть приход, расход за разный период, исходящие данные определить.Входящие данные за нужный период, причем по определенной позиции наити проблема. Заранее спасибо!

Вопрос задал: Нахушев Азамат Владимирович (статус: 1-ый класс)
Вопрос отправлен: 26 марта 2007, 16:59
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

 

Ответ #1. Отвечает эксперт: Вадим К

Это вопросы к бухгалтерам, а не программистам.
А вот когда у вас будут алгоритмы и намечен код (база данных) тогда уже можно думать.

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 26 марта 2007, 17:08


Вопрос # 437

Приветствую!!У меня такой вопрос.При работе с б.д. что лучше использовать свойства компонентов или SQL?

Вопрос задал: KilkaMS (статус: Посетитель)
Вопрос отправлен: 27 марта 2007, 00:42
Всего ответов: 2; сообщений в мини-форуме вопроса: 2

 

Ответ #1. Отвечает эксперт: Николай Рубан

Конечно SQL - потому что он ориентирован на операции с данными, представленными в виде логически взаимосвязанных совокупностей таблиц. Особенность предложений этого языка состоит в том, что они ориентированы в большей степени на конечный результат обработки данных, чем на процедуру этой обработки. SQL сам определяет, где находятся данные, какие индексы и даже наиболее эффективные последовательности операций следует использовать для их получения: не надо указывать эти детали в запросе к базе данных.

А при использовании свойств Вы вынуждены самостоятельно организовывать связи и поиск данных.

Ответ отправил: Николай Рубан (статус: 9-ый класс)
Ответ отправлен: 27 марта 2007, 00:58
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Вадим К

Советую учить и учить SQL, но и компоненты тоже, так как они облегчают заметно жизнь.
Плюси SQL:
- Полный доступ к различным извратным запростам. Главное что бы передать можно было.
- Корректная отдача назад - так как сервер получает то, что вы ему дали, а не то, что компоненты начудили
- Практически всегда можно выиграть на скорости, например на скорости добавления записей.
- Синтаксис многих SQL для многих серверов сходен. Есть даже стандарт
Недостатки:
- Надо учить его:)
- В некоторых случаях при больших запросах можно реально запутаться.

Работа через компоненты
Плюсы:
- Быстрая разработка.
- Хорошая переносимость - тоесть вы можете подменять серверы баз данных без существенных переделок.
Минусы:
- на сложных запросах компоненты тупят, так как могут сгенерировать слишком сложный запрос.
- Иногда возможности компонентов просто не хватает.
- Сервер никогда не работает эффективно - очень сложно спроектировать нагрузку. Часто просто ганяет лишние данные.

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 29 марта 2007, 18:02
Оценка за ответ: 5


Вопрос # 440

В программе использую много MDI-форм внешне схожих, поэтому наследую их от одной формы. При закрытии в родителе ставлю
Action := caFree;
Но мне нужно также на переменную-указатель "имя формы" при закрытии ставить nil. Сейчас я это делаю в наследниках при закрытии (одно и то же практически при разных именах форм). Как это можно делать в родительской форме? Self := nil не проходит.

Вопрос задал: Knjazev (статус: 3-ий класс)
Вопрос отправлен: 27 марта 2007, 19:40
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Вадим К

Задача осложняется тем, что на одну форму может быть не одна переменная-указатель. Что и есть в вашем случае. Self и FormXXX. И форма не сможет обнулить их всех. это даже в теории сложно звучит.
Что делать. Есть два варианта. Один, в формкрейте передавать ссылку на переменную, которую нужно обнулить по выходу. Второе решение заключается в том, (я его часто применяю) что когда форма пропадает, то она пропадает с глобального маасива Screen.Forms. Тоесть, когда создаёте новую форму, вам нужно проверить, а нет ли её ещё. И с помощю банального цикла
for i:=0 to Screen.FormCount-1 do
if TForm(Screen.Forms[i]).XXXXX = XXXXX
then {наша форма найдена!}
мы по какомуто критерию ищем нашу форму. Нашли - указатель на неё валиден. нет - звиняйте. Можно обнулять и создавать новую форму.

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 28 марта 2007, 11:31
Оценка за ответ: 5
Комментарий: Это идея, и можно вообще отказаться от nil


Вопрос # 441

Уважаемые эксперты!
Такая проблема - нужно распечатать pas-модуль, но при этом на бумаге должно сохраниться форматирование и цветовое оформление кода, как в редакторе кода Delphi. Стандартная функция печати не подходит - нужно распечатать из Word, т.е. помимо кода на странице есть другие надписи и объекты. Каким образом можно это сделать?
Заранее благодарю за ответ.

Вопрос задал: Sunshine (статус: Посетитель)
Вопрос отправлен: 27 марта 2007, 22:31
Всего ответов: 5; сообщений в мини-форуме вопроса: 2

 

Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Sunshine!
Нужно конвертировать. Например в Html. Думаю конверторы, если поискать, найдутся. Я недавно как раз написал подобный конвертор для сайта на PHP, см. прикреплённый файл, порт в консольное приложение.
Перетащите pas файл на файл программы и отпустите.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Ответ отправлен: 27 марта 2007, 23:14
Оценка за ответ: 5
Комментарий: Спасибо! Отличный конвертор. Жаль только, что настройки (цвета и стили) нужно править в php-файле, а не где-то отдельно. Но всё равно, получается отлично. Большое спасибо!

Ответ #2. Отвечает эксперт: Сергей Устинов

Здравствуйте, Sunshine!

Как вариант - можно сделать Print Screen - и вставить картинку из буфера обмена в Word (обрезав ненужные части). Если весь модуль не помещается в один экран - соединяйте несколько картинок.

Удачи!

Ответ отправил: Сергей Устинов (статус: 2-ой класс)
Ответ отправлен: 27 марта 2007, 23:28
Оценка за ответ: 4
Комментарий: Проблема в том, что в Word картинки почему-то искажаются - шрифт немного размазывается. Возможно, это только на экране так - печатать я не пробовал. Да и при больших модулях (в данном случае модуль страниц на 10) такой способ довольно трудоёмок. Но всё равно, спасибо за идею.

Ответ #3. Отвечает эксперт: Вадим К

Когда то я пользовался прогрммкой PubSource. Она с минимальными затратами позволяла всё делать. Но когда я поставил gExpert (www.gexperts.org) я забыл о ней - теперь в меню есть всё, что надо

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 28 марта 2007, 11:33
Оценка за ответ: 4
Комментарий: Спасибо. gExpert обязательно попробую. А PubSource не подскажете где можно скачать?

Ответ #4. Отвечает эксперт: Косолапов Дмитрий Юрьевич

Здравствуйте, Sunshine!
Попробуй мою поделку...
Только при открытии конвертированного файла в Word почему-то получается белый текст на белом фоне. Но поправить несложно, я думаю...

(см. прикреплённый файл)
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 7-ой класс)
Ответ отправлен: 28 марта 2007, 13:56
Оценка за ответ: 3
Комментарий: Хм. Ну это самый простой способ - взять готовый компонент-редактор и из него сделать экспорт. Но кроме стилей шрифта там ничего собственно и нет, а хотелось бы цветовую схему из Delphi. А баг с белым цветом - существенный. Я ведь в вопросе упоминал, что цвет имеет важное значение. А с таким багом весь цвет потеряется, если изменить цвет текста с белого на чёрный. Так что увы, работает это на самом примитивном уровне.

Ответ #5. Отвечает эксперт: min@y™

Моя старая прога SourceViewer, развитие которой давно остановлено, умеет экспортировать текст с подсветкой в Word (формат RTF) или в буфер обмена.

http://sourceviewer.narod.ru

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 28 марта 2007, 16:33
Оценка за ответ: 5
Комментарий: Отличный редактор!


Вопрос # 442

Приветствую!!У компонента ListBox можно задать несколько колонок. А как к ним обращаться?

Вопрос задал: KilkaMS (статус: Посетитель)
Вопрос отправлен: 28 марта 2007, 02:54
Всего ответов: 3

 

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, KilkaMS!
Проведя простой эксперимент я понял, что никакого смысла эти колонки не имеют и свойств/методов для работы с ними нет (ну разве что само свойство Columns для количества колонок). Строки автоматически разбиваются на колонки, когда вся информация не помещается по высоте в ListBox. Т.е. если в ListBox по высоте помещаются 10 строк, а в Items их 15, то оставшиеся 5 просто отобразятся второй колонкой. А работать нужно обычным способом - со списком Items. Желаю удачи!

Ответ отправил: Dron (статус: Студент)
Ответ отправлен: 28 марта 2007, 08:28
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Вадим К

Соглашаюсь с предыдущим экспертом. Так оно и есть.
Если менять размеры ListBox'a то количество элементов в колонках также меняется.

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 28 марта 2007, 11:35

Ответ #3. Отвечает эксперт: Косолапов Дмитрий Юрьевич

Воспользуйтесь компонентом TListView.

Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 7-ой класс)
Ответ отправлен: 28 марта 2007, 14:32
Оценка за ответ: 5


Вопрос # 443

Здравствуйте, будет ли хорошо работать Delphi7 с Microsoft SQL 2005, или все же лучше будет работать с 2000 ником, и как там делать отчеты на печать.

Вопрос задал: Сагынов Байсак Найсабекович (статус: Посетитель)
Вопрос отправлен: 28 марта 2007, 08:50
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Косолапов Дмитрий Юрьевич

Скорее всего, при использовании компонентов с закладки ADO никаких проблем не возникнет.
Для формирования отчетов можно воспользоваться генераторами отчетов: QuickReport и Rave (включены в Дельфи), или сторонними (Fast report и т.п.)

Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 7-ой класс)
Ответ отправлен: 28 марта 2007, 14:34


Вопрос # 444

Здравствуйте, господа Эксперты! помогите разобраться, пожалуйста, со следующей ситуацией: использую Delphi6+FireBird1.5
Когда на форму помещаю компонент IBQuery, то запрос обрабатывается без проблем. Если пытаюсь использовать IBDataSet, то ругается на этот же запрос. Что за глюк? В книге "Мир Interbase" рекомендуют использовать IBDataSet, а у меня лучше работает IBQuery?

Вопрос задал: Мережников Андрей (статус: 4-ый класс)
Вопрос отправлен: 29 марта 2007, 21:41
Всего ответов: 2; сообщений в мини-форуме вопроса: 3

 

Ответ #1. Отвечает эксперт: Бубырь Александр Николаевич

Добрый день.
Я за годы работы никогда не использовал IBDataSet, IBQuery всегда хватало. По вашему вопросу: приведите текст запроса который вы используете и напишите подробнее что за ошибка выскакивает, иначе Вам врядли кто сможет помочь.

Ответ отправил: Бубырь Александр Николаевич (статус: Абитуриент)
Ответ отправлен: 30 марта 2007, 08:51

Ответ #2. Отвечает эксперт: Вадим К

Скорее всего вы пытаетесь сделать "живой запрос". а с одним IBDataSet это невозможно. "Живой запрос" - это запрос, который можно редактировать, к примеру в DBGrid'e

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 30 марта 2007, 11:08


Вопрос # 445

Здравствуйте. Хочу задать вопрос, почему у меня не получается компилировать ресурс при помощи brcc32.exe. Может он не работает
(Когда я компилирую ресурс, он моргнет и всё, а файла res не появляется).
Этот файл(brcc32.exe) отдельно скачать можно, и если можно подскажите где.
И ещё вопрос? Как мне сделать запись в ini файле, что бы форма обращаясь к нему,
загружаясь, использовала эти параметры([Project1]
Width=500
Height=300
Left=30
Top=20).
Что мне надо ещё дописать, или я написал не правильно.

Вопрос задал: Толков Геннадий Викторович (статус: Посетитель)
Вопрос отправлен: 31 марта 2007, 01:05
Всего ответов: 2; сообщений в мини-форуме вопроса: 1

 

Ответ #1. Отвечает эксперт: Николай Рубан

В приложении две процедуры, который создают INI. Одна вносит данные в файл, другая читает (также необходимо прописать uses Inifiles;).

А по поводу компилятора ресурса попробуйте также brc32.exe.

Приложение:

Ответ отправил: Николай Рубан (статус: 9-ый класс)
Ответ отправлен: 31 марта 2007, 10:20
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Вадим К

Не компилировать ресурс может по многим причинам. Самая простая - у вас ошибка в файле rc.
В таких случаях откройте консоль (пуск - выполнить = "cmd") перейдите в каталог с вашей программой и наберите brcc32 <имя ресурсфайла>
теперь в кнсоли вы увидите сообщение о том, что же именно ему не понравилось

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 2 апреля 2007, 10:50
Оценка за ответ: 5


Вопрос # 446

Доброе время суток уважаемые эксперты, вопрос собственно в чем, есть у меня работающее приложение , которое каджый день получает с видеокамеры наблюдения видео и сохраняет его на компьютер, каждый час создается на диске папочка с именеи типа "02-04-07 02" где первые две цифры это (День, затем Месяц, год и тот час во время которого происходила запись) (те дд-мм-гг чч)
Собственно мне необходимо удалять все файлы и папки, созданны раннее чем за 15 дней до текущей даты и что бы она это делала постоянно и каждый день...

Вопрос задал: Шуваев Алексей Сергеевич - 869 (статус: Посетитель)
Вопрос отправлен: 02 апреля 2007, 01:36
Всего ответов: 3; сообщений в мини-форуме вопроса: 2

 

Ответ #1. Отвечает эксперт: min@y™

В старой версии пакета модулей Delphi Works в файле FileWorks.pas есть все необходимые тебе функции? а именно:

function GetFileDateTimeStamp(const Filename: String; var FileDateTimeStamp: TFileDateTimeStamp): Boolean;

function ListFilesRecursive(Path, Mask: string; ShowPath: Boolean): TStringList;

function DeleteDirectory(Directory: String; CanUndo, DeleteNotEmpty, GUI: Boolean): Boolean;

function DeleteFilesRecursive(Path, Mask: string): Boolean;

Могу выслать весь пакет, если не найдёшь в инете.

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 2 апреля 2007, 08:30
Оценка за ответ: 5
Комментарий: Можно мне выслать на мыло этот пакет??? адрес alex@xtec3.dvgk.ru

Ответ #2. Отвечает эксперт: Бубырь Александр Николаевич

Проще будет при помощи FindFirst/FindNext найти нужные папки, при помощи них же сделать свою версию DeleteDirectory - это строчек 15, повесить все это на таймер и выполнять раз в полчаса-час.
Можно еще проще. Если сервер работает круглосуточно, то можно просто каждый час запускать на выполнение команду DelTree с нужным именем папки (я делал себе подобную программу для упаковки архивов ISA сервера, нюанс только в том, что ISA сервер сам удаляет свои логи старше недели или двух, а у Вас при остановках сервера видеонаблюдения могут оставаться неудаленные папки, хотя и это можно решить).

Ответ отправил: Бубырь Александр Николаевич (статус: Абитуриент)
Ответ отправлен: 2 апреля 2007, 08:58
Оценка за ответ: 5

Ответ #3. Отвечает эксперт: Вадим К

Я бы переводил дату напрямую с названия каталога. Так как нет гарантии, что дата создания каталога будет та, что надо (её случайно не обновлят. Хоть как это и странно выглядит, но это возможно. Каталоги банально могли на новый винт закопипастить).
Первым шагом через FindFirst|FindNext ищем каталог очередной. Потом с помощью copy() с названия вытягиваем месяц, год, число. Потом пользуемся функцией EdncodeDateTime (модуль DateUtils)которой в качестве параметров и передаём их. там ещё минуты и секунды надо, но мы туда пишем 0. Результат функции на самом деле - вещественное число. находим разность между ним и функцией Now(). Если больше 15 - кандидат на удаление

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 2 апреля 2007, 10:47
Оценка за ответ: 5
Комментарий: А можно поподробней пожалуйста???


Вопрос # 447

Кака прелбразовать файл в формате XML в формат Excel но при этом на машине не будет установлен MS Office?

Вопрос задал: Беклешов (статус: Посетитель)
Вопрос отправлен: 02 апреля 2007, 10:32
Всего ответов: 2

 

Ответ #1. Отвечает эксперт: Вадим К

Есть два пути. Так как вы не сказали, какой именно формат вам надо
Первый - преобразовать в cvs - Excel считает его своим. формат файла прост. значения в строке разделены запятыми. можете сохранить пару документов и убедиться сами.
И есть ещё один вариант. Где то видел библиотеку для создания Excel документов без Excel. Поищите на www.delphiplus.org.
Есть и третий вариант. Взять исходники OpenOffice и смотреть как они сделали

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 2 апреля 2007, 10:54

Ответ #2. Отвечает эксперт: Бубырь Александр Николаевич

Есть еще вариант. Можно открыть в OpenOffice Calc и сохранить в XLS. OpenOffice бесплатный и им можно управлять из Делфи.

Ответ отправил: Бубырь Александр Николаевич (статус: Абитуриент)
Ответ отправлен: 2 апреля 2007, 13:32


Вопрос # 448

Добрый день! Хочу сделать оболочку для assembler'а. Для этого нужен текстовый редактор с подсветкаой синтаксиса, и втроенные функции вызова ассемблера для компиляции и просмотра результата. Все писать некогда да и лениво. Просьба, если не затруднит поделитесь своими соображениями и может ссылками на подобные редакторы. Еще один момент: как заставить пограмму запускать асемблер и готовый проект в одном консольном окне (по очереди), не вызывая новое? Заранее благодарен!

Вопрос задал: Scayn (статус: Посетитель)
Вопрос отправлен: 03 апреля 2007, 12:25
Всего ответов: 3; сообщений в мини-форуме вопроса: 5

 

Ответ #1. Отвечает эксперт: Вадим К

>>Все писать некогда да и лениво.
Ну и не пишите. За вас никто не напишет, если только не заплотите или кто то на добровольно-принудительных основах.
>>Просьба, если не затруднит поделитесь своими соображениями и может ссылками на подобные редакторы.
Programmer's Notepad, UltraEdit, EmEditor
Первый можно настроить что бы он подхватывал батник и выплёвывал вывод консоли в специальное окошко. Парсит номера строк и при клике по них забрачывает на нужную строку.
>>как заставить пограмму запускать асемблер и готовый проект в одном консольном окне (по очереди), не вызывая новое?
Есть два решения
-батник
-make файл
гуглите. он направит на путь праведный. Почему сам ничего конкретней не написал? я же даже не знаю, какой у вас ассемблер. А им я только с десяток знаю (названий:))

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 3 апреля 2007, 12:38
Оценка за ответ: 4

Ответ #2. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Scayn!
Ничего лучше WinAsm Studio www.winasm.net не напишите. Но если все-таки начнете - текстовый редактор - synedit, если посикать в сети, можно найти для него добавку, организующую фолдинг кода. Встроенных функций быть не может - просто берете ассемблер, анпример FASM, изучаете его ключи и пишите вызов (ShellExecute).

Из подобных программ могу отметить еще только мою AsmEdit - www.asmedit.h14.net. Кстати я над ней сейчас практически не работаю, поэтому, если Вы убедите меня в серьезности своих намерений, могу передать исходные коды для дальнейшего развития.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Ответ отправлен: 3 апреля 2007, 23:22
Оценка за ответ: 5

Ответ #3. Отвечает эксперт: min@y™

[quote]
Хочу сделать оболочку для assembler'а.
[/quote]

TSynEdit + TSynAsmSyn однозначно!

З.Ы. Давно ещё я делал почти интегрированную среду программирования на ассемблере для микроконтроллеров 51-й серии, типа Intel AT8051FA. Там, правда, не было вывода консоли в отдельное окно, компилятор и линкер запускались с флагом SW_HIDE, а потом прога анализировала файл листинга *.LST на наличие ошибок и т.д.

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 4 апреля 2007, 08:23
Оценка за ответ: 5


Вопрос # 449

Доброе время суток! Помогите разобраться, пожалуйста. На форму помещен TDBLookupComboBox. В некоторых случаях список для выбора раскрывается как положено (показывается определнное для показа количество строк), а в некоторых весь список выбора помеещается в одной строке, расположенной под самим компонентом. Речь идет об одном и том же компоненте - никакие свойства вручную не меняются. Что за фокус? Причем свойства меняются во время выполнения программы сами по себе. Кол-во строк для выбора в таблице -источнике больше одной.

Вопрос задал: Мережников Андрей (статус: 4-ый класс)
Вопрос отправлен: 03 апреля 2007, 17:10
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Помфюк Владимир Степанович

Здравствуйте, Мережников Андрей!
Такие глюки происходят от того что Delphi кеширует записи по мере их вывода. В первый раз - ни одна запист не выводилась, кеш пустой и программа Вам предлагает одну строчку (об остальных она еще не знает). После того как Вы скроллером промотаете к нужной Вам записи в кеше появится информация о других записях и, соответственно, увеличится combobox.
Выход - дергать DataSet Combobox'a (вызывать Last потом возвращать на First или несколько раз Next).

Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент)
Ответ отправлен: 3 апреля 2007, 17:22
Оценка за ответ: 5
Комментарий: Спасибо за совет. примерно к такому же выводу я пришел, когда продолжил разбирательство


Вопрос # 450

Приветствую! Где мне можно найти статейки обучающие работе в сети. Имеется ввиду создание приложений работающих по принципу "Клиент-сервер", адресации протоколов, и главное как это все обеспечить в Delphi. А есче лучше с прямым уклоном на создание БД.
Уж очень хочу научиться!!!
Заранее спасибо!

Вопрос задал: BLOOD_OMEN (статус: Посетитель)
Вопрос отправлен: 03 апреля 2007, 22:58
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

 

Ответ #1. Отвечает эксперт: min@y™

Ну, если уж замуж невтерпёж, то сюда:
http://www.delphikingdom.com/asp/section.asp?id=1
http://www.delphikingdom.com/asp/section.asp?id=2
http://www.delphikingdom.com/table

Если не поможет, то сюда: http://google.ru :))

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 4 апреля 2007, 08:29


Вопрос # 452

Доброго времени суток.
Помогите решить проблему:
Есть БД на Access (RemKlient), подклучена через ADO:
ID_RemKlient-счетчик
Data-дата
Rem-техт
Sum-цена.
Мне необходимо сложить Sum(100,200....) определеного Rem(Замена масла, замена подшипников......), отнять от этой суммы 20% и оставшееся вывести в поле Edit(......).
Заранее спасибо за ответ.

Вопрос задал: Илья Бабаков (статус: Посетитель)
Вопрос отправлен: 04 апреля 2007, 21:47
Всего ответов: 2

 

Ответ #1. Отвечает эксперт: Косолапов Дмитрий Юрьевич

Скорее всего, надо делать запрос с группировкой... Только необходимо переименовать поле с ценой, иначе будет конфликт имени поля с агрегирующей функцией (в приложении - Cost).

В тексте запроса (см. приложение) используется параметр CurRem, перед открытием запроса его необходимо проинициализировать...

Приложение:

Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 7-ой класс)
Ответ отправлен: 4 апреля 2007, 22:05
Оценка за ответ: 3

Ответ #2. Отвечает эксперт: Вадим К

вначале делаем сиквел запрос вида
select sum([Sum])*0.8 from RemKlient where Rem = 'что то'
квадратные скобки нужны для того, что бы решить проблему с неудачным именем sum.
назад вам будет возвращена запись с одним полем.

to Косолапов Дмитрий Юрьевич
Запрос то человек хочет по конкретному полю

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 4 апреля 2007, 22:15
Оценка за ответ: 4


Вопрос # 454

Люди помогите пожалуста розобратса что собой в паскале представляет спрайт, и как им пользоватса!

Вопрос задал: Шарайчук Сергій Олександрович (статус: 1-ый класс)
Вопрос отправлен: 05 апреля 2007, 12:49
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Вадим К

В паскале нет спрайтов. Скорее всего это понятие с кокой-то чужой библиотеки.

Подозреваю, учитывая предыдущий вопрос, что это относиться к графике, тогда вот определение
"двухмерное графическое изображение, используемое в 3D-графике для снижения нагрузки на процессор видеокарты."

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 5 апреля 2007, 13:15
Оценка за ответ: 5


Вопрос # 455

Доброго времени суток, уважаемые! Подскажите пожалуйста, есть ли какой то редактор кода для Делфи, где можна сворачивать процедуры и разные вложения и т.д.? Я вроде когда то слышал что то такое, но не видел. ТОлько меня интересует не отдельный редактор, а что бы он встраивлся в IDE Delphi. Заранее. большое спасибо!

Вопрос задал: sv_sergik (статус: Посетитель)
Вопрос отправлен: 05 апреля 2007, 23:42
Всего ответов: 3; сообщений в мини-форуме вопроса: 1

 

Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович

Таких редакторов сделано довольно много, правда большинство из них коммерческие. Большое растространение получил бесплатный SynEdit. Это целый набор компонент. В стандартном пакете реализованы подсветка для большинства языков (можно реализовать и свою), подсказки, выплывающие списки, печать, предпросмотр и даже экспорт с сохранением форматирования.

Что косается фолдинга (сворачивание), здесь не все так очевидно, во-первых данныя процедура сильно завязана на язык и должна работать на анализаторе текста. Кроме того может быть фолдинг как в Dreamweaver 8. Наверное из-за этих сложностей в оригинальном SynEdit нет фолдинга.

Однако есть несколько пакетов, добавляющих фолдинг к возможностям SynEdit, например MyStix, только эти разработки достаточно сыры и используя их нужно следить за разработкой, оперативно исправляя ошибки.

ТОлько меня интересует не отдельный редактор, а что бы он встраивлся в IDE Delphi. Заранее. большое спасибо!
Насколько я понял, эти Вы хотели сказать, что ищите компонент, а не программу.., так вот, SynEdit - это компонент.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Ответ отправлен: 6 апреля 2007, 08:08
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: min@y™

Фолдинг реализован в IDE Delphi начиная с версии 8.0.

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 6 апреля 2007, 08:31
Оценка за ответ: 3

Ответ #3. Отвечает эксперт: Новаковский Юрий Аврамович

Здравствуйте, sv_sergik!
Egale CodeRush Professional v7.04c for Delphi7
Расширение для Delphi 7. Позволит вам так изменить среду разработки, что вы ее можете не
узнать.
Всем, кто юзает Делфи 7, попробуйте не пожалеете!
Удачи!
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс)
Ответ отправлен: 6 апреля 2007, 10:33
Оценка за ответ: 5


Вопрос # 456

Спрашивает начинающий программист. Как добавить новые данные из Edit в БД?

Вопрос задал: Usmonov Farrukh Faiziddinovich (статус: Посетитель)
Вопрос отправлен: 06 апреля 2007, 07:51
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Дима Гусаков

Здравствуйте, Usmonov Farrukh Faiziddinovich!
Для добавления новой записи в БД используются методы:
- Insert переводит набор данных в режим вставки и добавляет пустую запись в позицию, на которой находится указатель текущей записи. После вызова данного метода необходимо заполнить поля новой записи. Это осуществляется методом SetFields(const Values: array of const). Для сохранения используется метод Post.
- InsertRecord(const Values: array of const) вставляет новую запись в текущую позицию курсора и одновременно задает значения всех или некоторых полей.
- методы Append и AppendRecord анологичны методам Insert и InsertRecord, только они добавляют новую запись в конец набора данных

Приложение:

Ответ отправил: Дима Гусаков (статус: 2-ой класс)
Ответ отправлен: 6 апреля 2007, 09:41
Оценка за ответ: 5
Комментарий: Спасибо Вам Дима Гусаков!


Вопрос # 458

Здравствуйте. У меня к вам такой вопрос?
Есть две формы Form1 и Form2.
Form1.Width :=500;
Form1.Height := 300;
Form1.Left := 30;
Form1.Top := 30;
Form1.Visible := true;
Form2.Width :=500;
Form2.Height := 300;
Form2.Left := 0;
Form2.Top := 0;
Form2.Visible := true;
Разница только в параметрах Left и Top.
У меня вопрос, можно сделать так, чтобы
перетаскивая Form1 мышкой, Form2 перемещалась
вместе с ней, как будто они приклеенные.
Заранее благодарен.

Вопрос задал: Толков Геннадий Викторович (статус: Посетитель)
Вопрос отправлен: 07 апреля 2007, 00:14
Всего ответов: 2

 

Ответ #1. Отвечает эксперт: Вадим К

Можно, нужно для первой формы обрабатывать сообщение WM_MOVE. Это сообщение посылается форме, когда она пересовывается. Новые координаты второй формы всегда можно расчитать, зная координаты первой формы.
обработчик доделываем так.
В private разделе формы добавляем строку
procedure MyFormMove(var msgTMessage);message WM_MOVE;
и нажимаем Ctrl+Shift+C. Делфи сгенерит обработчик, в котором можно писать код

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 7 апреля 2007, 01:01
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Дима Гусаков

Здравствуйте, Толков Геннадий Викторович!

Код действует при нажатии мыши на поле формы

Приложение:

Ответ отправил: Дима Гусаков (статус: 2-ой класс)
Ответ отправлен: 7 апреля 2007, 15:26
Оценка за ответ: 5


Вопрос # 459

Всем Привет!
Мне надо с Edit1.Text, это мой выбраный путь
Получить общий размер диска и свободное место на диске.
Вот код:

Приложение:

Вопрос задал: Vit2 (статус: Посетитель)
Вопрос отправлен: 07 апреля 2007, 14:41
Всего ответов: 2; сообщений в мини-форуме вопроса: 1

 

Ответ #1. Отвечает эксперт: Роман

Здравствуйте, Vit2!Тупо открываем delphiworld.narod.ru/base/disk_size_free.html и ctrl-c - имеем(см код).Результатом будет значение в байтах

Приложение:

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 7 апреля 2007, 16:02

Ответ #2. Отвечает эксперт: min@y™

Скачай Delphi Works. Проблем знать не будешь.
Сцыла вот: http://delphiworks.sourceforge.net/index.htm

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 9 апреля 2007, 09:02


Вопрос # 460

такой вопрос: как можно выводить wav-файл по частям в 10-50кб? пробовал mmsystem (функции waveOut***) - щелчки при смене буфера. пробовал через DirectX - нашел только 1 работающий пример((. не знаю как отлавливать окончание проиграывания буфера. пробовал создавать один буфер большого размера (20Мб) - получил тормоза. Кто что посоветует?

Вопрос задал: Сергей Мельников (статус: Посетитель)
Вопрос отправлен: 07 апреля 2007, 19:28
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

 

Ответ #1. Отвечает эксперт: Роман

Здравствуйте, Сергей Мельников!Посмотрите пример на delphiworld.narod.ru/base/get_signal_from_microphone.html там о работе с буфером.Я думаю всё прояснится.
Также для воспроизведения аудио наилучшими будут bass.dll либо libsndfile,поищите в inete;bass.dll :
воспроизведение звуковых образцов (сэмплов) в формате WAV/AIFF/MP3/MP2/MP1/OGG;
потоковое воспроизведение звуковых файлов в формате MP3/MP2/MP1/OGG/WAV/AIFF;
потоковое воспроизведение звука из интернет (по протоколам http и ftp, с поддержкой серверов Shoutcast, Icecast & Icecast2);
воспроизведение файлов музыкальных форматов (XM, IT, S3M, MOD, MTM, UMX), а также формата MO3 (mod музыка, сжатая MP3/OGG);
запись звука;
поддержка эффектов обработки звуков и эффектов DirectX 8 (только для Win32): Chorus / compressor / distortion / echo / flanger / gargle / parametric eq / reverb и т.д.;
поддержка многоканального (а не только стерео) звука, в том числе и многоканальных OGG/WAV/AIFF файлов;
поддержка многопотоковых звуковых карт;
поддержка позиционируемого 3D звука и EAX;
поддержка расширений (плагинов);
и многое другое.
libsndfile посмотрите тут:www.mega-nerd.com/libsndfile/;она больше подходит для аудиоанализа.

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 7 апреля 2007, 20:44
Оценка за ответ: 5
Комментарий: по поводу bass.dll: работал с аналогом (fmod.dll). но мне нужно воспраизводить аудио из сети, тоесть когда файл получен частично. а вот за вторую мысль спасибо.


Обучение Delphi

» Найти все предыдущие уроки можно на www.delphi.int.ru в разделе "Статьи". Последние 3 урока:

21. Подпрограммы (часть 3)
22. Простые типы данных
23. Множества

Записи (часть 1)

Автор:
© Ерёмин А.А., 2008
Дневник - по-дневная запись тех поступков и мыслей, о которых записывающий может вспомнить не краснея.
Номер урока:
24

Введение

В прошлом уроке мы познакомились со множествами - более сложной структурой данных нежели хранение значения одной переменной. Сегодня речь пойдёт о записях.

Запись (англ. record) - это сложный тип данных, позволяющие объединить данные разных типов. Запись можно назвать наиболее общим сложным типом данных. Название "запись" появилось из тех соображений, что данные разного типа можно встретить в таблицах: в каждой строке записаны сразу несколько разных значений. Таким образом, одна запись соответствует одной строке данных: она имеет несколько полей, каждое из которых хранит своё значение.

Пример

Допустим, мы хотим хранить информацию о людях, заполнивших анкету на поступление на работу. Нас интересуют: ФИО человека, возраст, образование (среднее/высшее), владение компьютером, владение иностранными языками. Все эти данные мы можем объединить в запись. Дальнейшее повествование будет основываться на этом примере.

Описание записи

Чтобы работать в программе с записями, нужно сначала описать соответствующий тип данных. Запись описывается следующим образом:

type
  имя_типа_записи = record
    {поля записи}
  end;

В блоке полей описание идёт точно так же, как описание переменных: указывается имя поля, далее через двоеточие тип данных этого поля. Сами поля разделяются точкой с запятой.

Подходите ответственно к выбору типов данных для полей записи. Если при описании переменной она хранится в единственном экземпляре, то записи, как правило, используются для хранения некоторого набора данных (таблицы с несколькими строками, образно говоря). Это значит, что каждое из полей будет храниться в памяти столько раз, сколько строк данных у вас будет. Если в таблице 1000 строк, то объём занимаемой памяти будет немалым, да и скорость работы с данными может заметно уменьшиться из-за выбора избыточных типов данных.

Для нашего примера:

type
  TPerson = record
    Name: String;
    Age: Byte;
    Education,PC: Boolean;
    Foreign: set of TForeignLanguages;    
  end;

Разберём поля по порядку. Для ФИО вполне подходит текстовая строка типа String. 255 символов нам хватит сполна. Для хранения возраста целесообразно выбрать тип данных Byte (число от 0 до 255). Не думаю, что на работу будут устраиваться люди, возраст которых превышает 255 :-) Использовать тип Integer в данном случае нецелесообразно - мало того, что у него максимальное значение превышает 32.000, да ещё и отрицательные числа поддерживаются. Для поля "образование" выбран логический тип данных. Условимся, что True - это высшее образование, False - высшего нет (т.е. среднее). PC - владение компьютером, здесь всё понятно. Для хранения иностранных языков здесь используется множество. Ведь человек может знать несколько языков, не так ли? Описание типа данных, на основе которого построено множество, следующее:

type
  TForeignLanguages = (flEnglish, flGerman, flFrench);

Как видно, это перечислимый тип данных с тремя возможными значениями. Если вам мало английского, немецкого и французского, можете добавить в список и другие. Так как свойство Foreign нашей записи - множество, то мы сможем легко хранить информацию, например, о том, что человек знает и английский, и немецкий. Удобно, не правда ли? Если человек не знает никаких иностранных языков, множество будет пустое. Конечно, можно было бы добавить в список что-то вроде flNone для указания отсутствия иностранных языков, но зачем усложнять себе жизнь?

Итак, наша запись готова. Чтобы работать с ней в программе, разместить её следует в глобальном разделе type.

Примеры других записей

Существует множество готовых записей в Delphi, которые позволяют хранить некоторые часто встречающиеся данные.

TPoint - запись с двумя полями - X и Y - служит для хранения координат точки. Описана эта запись следующим образом:

TPoint = record
  X: Longint;
  Y: Longint;
end;

TRect - позволяет хранить данные о прямоугольной области. Свойства Left, Top, Right и Bottom отвечают за координаты сторон прямоугольника, а координаты TopLeft и BottomRight типа TPoint - указывают на левую верхнюю и правую нижнюю вершины соответственно (эти вершины позволяют однозначно определить прямоугольник на плоскости, стороны которого параллельны осям координат). Однако в один момент времени используется только один набор из этих свойств - либо 4 координаты, либо 2 точки. О том, как это делается, мы поговорим позже.

Ещё один пример - хранение даты. Дату можно разбить на число, месяц и год, и хранить каждое значение отдельно:

TDate = record
  Day: 1..31;
  Month: 1..12;
  Year: 1900..2100;
end;

Работа с записями

Чтобы обратиться к конкретному полю записи, применяется стандартная конструкция, с которой вы давно знакомы:

имя_переменной.название_поля

Т.е. имя переменной или объекта и его поле разделяются точкой.

Чтобы работать с записью, нужно определить переменную, тип которой - наша запись. До этого мы всего лишь описали нашу запись, но на самом деле никаких значений ещё нигде нет. Описание происходит стандартным образом:

var Person: TPerson;

Имя переменной вы, естественно, можете дать любое, просто логично называть всё своими именами.

Вводим анкеты - интерфейс

Для начала давайте создадим небольшой интерфейс, который позволит нам вводить информацию из анкет:

  • ФИО - TEdit (Edit1)
  • Возраст - TEdit (Edit2)
  • Высшее образование - TCheckBox (CheckBox1)
  • Владение компьютером - TCheckBox (CheckBox2)
  • Владение иностранными языками - TCheckListBox (CheckListBox1)

Компонент TCheckListBox расположен на странице Additional. Это список, аналогичный TListBox, но в каждой строке есть TCheckBox, т.е. строка либо отмечена, либо нет. В свойство Items сразу занесите наши 3 языка, вводя каждый на отдельной строке.
Чтобы было удобно вводить возраст, сделаем вот что. На странице Win32 есть компонент TUpDown - это две кнопки ("вверх-вниз" или "влево-вправо"). Если в свойстве Associate выбрать наше поле ввода Edit2, то кнопки автоматически разместятся рядом с полем и нажатие на них будет автоматически изменять число в поле. В само поле лучше изначально вписать какой-нибудь "реальный" возраст, чтобы не пришлось долго щёлкать, добираясь до нужного значения. Например, можно вписать 25.
В поле Edit1 никакого текста быть не должно. Все галочки в остальных компонентах убраны. Таково изначальное состояние нашего интерфейса.

Осталось добавить кнопку, которая будет выполнять все действия.

Общий вид формы у меня получился таким:

Окно добавления анкет

Теперь перейдём к программной части.

Вводим анкеты - программирование

Итак, перейдём к программированию нашей кнопки "Добавить".

Чтобы использовать нашу запись, создадим переменную соответствующего типа:

var Person: TPerson;

Теперь у нас есть один экземпляр нашей записи и в него можно смело записывать данные. Никаких трудностей возникнуть не должно:

procedure TForm1.Button1Click(Sender: TObject);
var Person: TPerson;
begin
  Person.Name:=Edit1.Text;
  Person.Age:=UpDown1.Position;
  Person.Education:=CheckBox1.Checked;
  Person.PC:=CheckBox2.Checked;
  Person.Foreign:=[];
  if CheckListBox1.Checked[0] then
    Person.Foreign:=Person.Foreign + [flEnglish];
  if CheckListBox1.Checked[1] then
    Person.Foreign:=Person.Foreign + [flGerman];
  if CheckListBox1.Checked[2] then
    Person.Foreign:=Person.Foreign + [flFrench];
end;

Ну и конечно комментарии.
Возраст в данном случае лучше взять из этих самых "кнопок-стрелочек" - там есть соответствующее свойство Position. А почему не из Edit2, спросите вы? А вот почему. Во-первых, если брать значение из Edit, нужно преобразовывать его в число функцией StrToInt(). Но это не самое страшное. А вот второе, что придётся делать - контролировать это значение. В Edit запросто можно ввести отрицательное число, да или вообще буквы. Тогда нужно ещё и введёную строку проверять - а число ли это вообще? Зато, имея TUpDown, этих проблем нет. Даже если ввести в Edit буквы, UpDown сохранит своё текущее значение и никаких проблем не будет. Кстати, у UpDown1 можно задать свойство Max - максимальное значение. Изначально там стоит 100. Если не хотите принимать на работу, скажем, людей старше 60, впишите туда 60.
Теперь что касается иностранных языков. Для начала множество лучше сделать пустым, мало ли что? А дальше проверяются строки из списка. Узнать, выбрана строка или нет, можно с помощью свойства Checked, указав в квадратных скобках номер (индекс) строки, которые начинаются с нуля. Если строка выбрана, добавляем во множество соответствующий элемент. Если ни одна строка не выбрана, множество останется пустым.

Оптимизация

Вроде у нас всё хорошо, да вот об оптимизации не стоит забывать. В данном случае получится скорее не оптимизация, а сокращение кода. Помните про оператор with? Да-да, тот самый, что позволяет вынести имя объекта за скобку? Вот его и применим, вынеся Person вперёд:

procedure TForm1.Button1Click(Sender: TObject);
var Person: TPerson;
begin
  with Person do
  begin
    Name:=Edit1.Text;
    Age:=UpDown1.Position;
    Education:=CheckBox1.Checked;
    PC:=CheckBox2.Checked;
    Foreign:=[];
    if CheckListBox1.Checked[0] then
      Foreign:=Foreign + [flEnglish];
    if CheckListBox1.Checked[1] then
      Foreign:=Foreign + [flGerman];
    if CheckListBox1.Checked[2] then
      Foreign:=Foreign + [flFrench];
  end;
end;

Уже лучше, согласитесь? Но всё равно не идеально. В частности, строки проверки иностранных языков выглядят как-то нелепо - они мало отличаются друг от друга. К тому же, что делать, если в списке будет 100 языков? 100 раз писать одно и то же? Нет, конечно. Единственная загвоздка в данном случае может возникнуть только в том, как преобразовать номер строки (0, 1, 2) в значение типа данных (flEnglish, flGerman, flFrench)? Эти значения ведь нельзя указать в виде строки... А решение простое. Если вспомним, что перечислимые типы данных упорядочены, а каждому "текстовому" значению просто ставится в соответствие число, начиная с нуля, проблема мигом решится. Итак, нам нужно просто привести типы данных, а именно - число к типу TForeignLanguages. Дальше элементарно - заводим цикл по строкам и "на лету" формируем требуемое множество. Итак, окончательный вариант:

procedure TForm1.Button1Click(Sender: TObject);
var Person: TPerson; I: Byte;
begin
  with Person do
  begin
    Name:=Edit1.Text;
    Age:=UpDown1.Position;
    Education:=CheckBox1.Checked;
    PC:=CheckBox2.Checked;
    Foreign:=[];
    for I := 0 to CheckListBox1.Items.Count-1 do
      if CheckListBox1.Checked[I] then
        Foreign:=Foreign + [TForeignLanguages(I)];
  end;
end;

Красивый и при этом самый короткий код.

Заключение

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


Оцените данный урок (1 - плохо, ..., 5 - отлично): -1- -2- -3- -4- -5-. Комментарии в тексте письма приветствуются.
 

Статьи

Самые популярные статьи на сайте:

Как можно из Delphi отслеживать все события Windows?
Создание непрямоугольных форм в Delphi
Работа с приложениями Microsoft Office. Excel
Работа с реестром и INI-файлами в Delphi
Как прочитать ID3-Tag'и из MP3-файла?
Конвертирование графических форматов
Работа с приложениями Microsoft Office. Word
Написание инсталлятора на Delphi
Работа со строковыми типами данных
Работа с HTML-справкой в программах

Pascal и Delphi

Источник: HelloWorld.ru

Pascal

Трудно рассказать что-то новое о том, что хорошо известно всем. Действительно, вряд ли найдется в нашей стране программист или просто выпускник средней школы, который не знал бы (или не слышал) об этом языке программирования. Основные концепции языка были разработаны в 1967-1968 г. профессором Николаусом Виртом (Niklaus Wirth) (Биографию Вирта можно прочитать на http://cc.kzoo.edu/~k98ja01/wirth.html) и опубликованы в 1971 году (The Programming Language Pascal Acta Informatica, 1 (Jun 1971), 35-63). Стандарт языка был разработан им в 1974 г. (PASCAL — User Manual and Report, ISO Pascal Standard Kathleen Jensen and Niklaus Wirth) совместно с Кетлин Йенсен (Kathleen Jensen). Паскаль достаточно быстро превратился из средства, предназначенного для обучения студентов программированию, в инструмент, который стали использовать для создания больших программных проектов. Заметим, что ни один из последующих языков, разработанных автором (а Вирт явл яется создателем Модулы и Оберона), не получил такого распространения. Трудно сказать, с чем это связано. Возможно, с тем, что язык удачно сочетает простоту с выразительностью и силой. Возможно, что просто он оказался в нужный момент на нужном месте, поскольку на момент создания языка, получившего свое имя в честь великого французского математика, в распоряжении программистов было весьма и весьма немного языков высокого уровня. И что самое главное, все они были разработаны для решения конкретных прикладных задач и во многом являлись продуктом «творческого акта», а не результатом серьезного научного труда. Фортран, названный одним из пионеров программирования Дейкстрой (Edsger Dijkstra) инфантильным дезорганизатором, предназначался только для математических расчетов и не выдерживал никакой критики с точки зрения ограничения доступа к данным и отсутствия поддержки структурного программирования. Об интерпретаторе Бейсик (тогда еще без приставки Visual) нельзя было говорить без слез. Кобол был ориентирован на реш ение экономических задач, a PL/I — чрезмерно сложен и принадлежал скорее к области проблем, чем к области решений. И вот тут появляется язык, на порядок отличающийся от них своим качеством. Основное, что привлекало к нему, — логичность, поддержка концепций структурного и процедурного программирования, работа с динамической памятью, возможность создания своих типов данных. Все это стало теперь настолько привычным, что трудно представить, как можно программировать без использования этих жизненно необходимых возможностей.

Строгая типизация позволила сразу же на порядок снизить количество ошибок, появляющихся вследствие невнимательности или банальных опечаток. Кстати, для желающих использовать в своих программах прямой доступ к данным без всяких ограничений язык предоставил возможность создания записей с вариантами, которые можно трактовать в соответствии со своими потребностями. Но при этом программист должен всегда явно указывать, с каким типом данных в конкретной переменной он желает работать. Единственным недостатком языка, существовавшим в то время, было отсутствие поддержки модульности. Программист должен был компилировать весь проект целиком, со всеми входящими в него процедурами и функциями (правда, возможность поддержки вызовов подпрограмм из заранее скомпилированных и скомпонованных библиотек присутствовала с самого начала). Но, впрочем, это не удивительно — напомню, что язык-то был предназначен для обучения.

Еще одной причиной, которая позволила языку перейти в категорию бестселлеров, стала поддержка разработчиков коммерческого ПО. И тут мы не можем пройти мимо фирмы Borland (ныне Inprise). Разработанный ею Turbo Pascal во всех его модификациях является в России одним из самых популярных продуктов. Интегрированная оболочка, которая включает в себя редактор, компилятор, компоновщик и отладчик, вместе с интерактивной справочной системой сделали разработку программ на Паскале делом простым и понятным практически любому человеку. Но так было не всегда. Например, в начале восьмидесятых автору довелось поработать с одним из первых компиляторов Паскаля на платформах DEC. В нем сначала нужно было в редакторе создавать программу, затем однопроходный компилятор выдавал код на ассемблере, далее приходилось транслировать его в объектный код, компоновать с системными библиотеками и только после этого запускать программу. Поиск ошибок (без встроенного отладчика, который сейчас просто показывает вам строку, где произошла оши бка) был делом, требующим терпения, и, самое главное, процессом весьма длительным.

Кроме создания интегрированной оболочки, Borland ввел в Pascal поддержку модульного программирования, а начиная с версии 5, и поддержку объектно-ориентированного программирования.

В настоящее время действуют три стандарта языка. Первый из них — нерасширенный Паскаль (unextended Pascal) был разработан в 1983 году (Смотрите стандарты ANSI/IEEE 770Х3 97-1993 и ISO 7185:1983. Стандарты ISO доступны по адресу http://www.iso.ch/welcome.html) и практически полностью совпадает с описанием языка в нотации Йенсен-Вирта. Второй — Extended Pascal — содержит расширения, касающиеся модульного программирования (раздельная компиляция модулей, импорт-экспорт подпрограмм, интерфейсная часть и реализация), и дополнен рядом процедур и функций (прямой доступ к файлам, работа со строками и т д.) (Смотрите стандарты ANSI/IEEE 770Х3.160-1989 и ISO/IEC 10206:1991). Последний — объектный Паскаль (Object-Oriented Extensions to Pascal), в отличие от первых двух, формально не утвержден, но оформлен в виде отчета (ANSI Technical Report) в 1993 г. (Смотрите ANSI/X3-TR-13-1994) Объектный Паскаль поддерживает классы, обладающие свойствами и методами, насл едование классов, переопределение методов у потомков (полиморфизм) и ряд других атрибутов объектно-ориентированного программирования.

Delphi

В России Borland Delphi появляется в конце 1993 г. и сразу же завоевывает широкую популярность. Новые версии выходят практически каждый год. В них реализуются все новые мастера, компоненты и технологии программирования.

Действительно, процесс разработки в Delphi предельно упрощен. В первую очередь это относится к созданию интерфейса, на который уходит 80% времени разработки программы. Вы просто помещаете нужные компоненты на поверхность Windows-окна (в Delphi оно называется формой) и настраиваете их свойства с помощью специального инструмента (Object Inspector). С его помощью можно связать события этих компонентов (нажатие на кнопку, выбор мышью элемента в списке и т.д.) с кодом его обработки — и вот простое приложение готово. Причем разработчик получает в свое распоряжение мощные средства отладки (вплоть до пошагового выполнения команд процессора), удобную контекстную справочную систему (в том числе и по Microsoft API), средства коллективной работы над проектом, всего просто не перечислить. Вы можете создавать компоненты ActiveX без использования Microsoft IDL, расширять возможности web-сервера (скрипты на стороне сервера), практически ничего не зная об HTML, XML или ASP. Можно создавать распределенные приложения на базе СОМ и CORBA, Интернет- и intranet-приложения, используя для доступа к данным Borland DataBase Engine, ODBC-драйверы или Microsoft ADO. Появившаяся, начиная с Delphi 3, поддержка многозвенной технологии (multi-tiered) доступа к данным позволяет создавать масштабируемые приложения (относительно слабо зависящие от сервера БД) за счет перенесения методов обработки информации (бизнес-правил) на среднее звено.

Как уже говорилось ранее, в Delphi используется язык Object Pascal, который постоянно расширяется и дополняется Borland. Язык в полной мере поддерживает все требования, предъявляемые к объектно-ориентированному языку программирования. Как и положено строго типизированному языку, классы поддерживают только простое наследование, но зато интерфейсы могут иметь сразу несколько предков. К числу особенностей языка следует отнести поддержку обработки исключительных ситуаций (exceptions), а также перегрузку методов и подпрограмм (overload) в стиле C++. К числу удачных, на взгляд автора, относится также поддержка длинных строк в формате WideChar и AnsiChar. Последний тип (AnsiStrmg) позволяет использовать все прелести динамического размещения информации в памяти без всяких забот о ее выделении и сборке мусора Delphi делает это автоматически. Для поклонников свободного стиля программирования имеются открытые массивы, варианты и вариантные массивы, позволяющие размещать в памяти все, что душе угодно и смешивать типы данных.

Вы можете создавать свои собственные компоненты, импортировать ОСХ-компоненты, создавать «шаблоны» проектов и «мастеров», создающих «заготовки» проектов. Мало того, Delphi предоставляет разработчику интерфейс для связи ваших приложений (или внешних программ) с интегрированной оболочкой Delphi (IDE).

Таким образом, вы можете использовать Delphi для создания как самых простых приложений, на разработку которых требуется 2-3 часа, так и серьезных корпоративных проектов, предназначенных для работы десятков и сотен пользователей. Причем для этого можно использовать самые последние веяния в мире компьютерных технологий с минимальными затратами времени и сил.

Ну, и одна из самых последних новостей от Inprise обещает, что в ближайшем будущем вы сможете переносить приложения, разработанные в Delphi, на платформу Linux. Более подробную информацию о Delphi можно получить на сайтах www.inprise.com и www.inprise.ru. Существует большое количество сайтов, посвященных Delphi, например «Королевство Delphi» — delphi.vitpc.com, Torry's Delphi Pages — www.torry.ru. Последний содержит большое число ссылок на ресурсы, связанные с Delphi. Ну а если вы уже давно знакомы с этим продуктом, то на сайте www.brainbench.com можно бесплатно протестироваться в качестве программиста Delphi 3 и получить по почте сертификат.

Александр Александровский

Статья из журнала BYTE/Россия, Март 2000

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

Листинг. Object Раsсаl

Program BYTE_Example;               // Oject Pascal, Delphi 5
{$APPTYPE CONSOLE}                  // Прагма, делающая приложение консольным
 
uses SysUtils, Classes;             // Используемые внешне модули
 
type
  ТМуArray = class (TObject)        // Класс - динамический массив
  private
    FArray : array of integer;      // Поле для хранения данных
    FPos : integer;                 // Счетчик введенных элементов
  public
    function GetLastNumber:integer;               // номер последнего элемента
    function GetElement(Poz:integer):integer;     // Элемент по номеру
    procedure AddElement(Value:integer);          // Добавление в конец массива
    constructor create;                           // Конструктор
    destructor Destroy; override;                 // Деструктор
  end;
 
const delta=100;                     // Приращение динамического массива
 
procedure TMyArray.AddElenient(Value: integer);
begin
  if FPos>High(FArray) then                       // Нужно увеличить массив?
    SetLength(FArray,Length(FArray)+delta);       // Увеличим на Delta
  FArray[FPos]:=Value;                            // Добавляем элемент
  Inc(FPos);
end;
 
constructor ТМуArray.create;        // Конструктор динамического массива
begin
  inherited,                        // Вызываем конструктор предка
  SetLength(FArray,delta);          // Создали массив из delta-элементов
  FPos:=0;                          // Счетчик элементов массива
end;
 
destructor ТМуАrrау.Destroy;        // Деструктор динамического массива
begin                               // Уничтожаем объект
  FArray:=nil;                      // Удаляем массив 
  inherited;                        // Вызываем деструктор предка
end;
 
function ТМуАrrау.GetElement(Poz: integer): integer;
begin result := FArray[Poz] end;    // Читаем элемент по номеру
 
function ТМуАrrау.GetLastNumber: integer;
begin result :=FPos-1; end;         // Получаем количество элементов массива
 
procedure ReadElementsFromFile;     // Читаем из файла и выводим нечетные на экран 
 
var
  F: file of Integer;               // Файл с целыми числами
  МуАrrау: ТМуАrrау;                // Объект для хранения чисел
  i: integer;                       // Переменная цикла
begin
  МуArray := ТМуArray.create;      // Создали объект-массив
  AssignFile(F, 'TestFile.dat');    // Открываем файл
  reset(F);
  while not eof (F) do
  begin
    read(F,I);                                    // Читаем элемент
    МуArray.AddElement(I);                        // Добавляем элемент в массив
  end;
  closeFile(F);                                   // Закрываем файл
  for i := МуArray.GetLastNumber downto 0 do      // Выводим в обратном порядке
    if МуArray.GetElement(i) mod 2 <> 0 then      // Выводим только нечетные
      writeln( intTostr(MyArray.GetElement(i)));  // элементы в колонку 
  МуArray.Free;                                   // Уничтожаем массив
end;
 
begin                                             // Главный модуль
  ReadElementsFromFile
end.

Файловый архив

Разделы: Статьи | Компоненты | Plug-in's | Документация | Исходники | Программы | Игры | Изображения

Уважаемые читатели! Отправляйте полезные компоненты/модули, исходники, собственные программы/игры, документацию - книги, учебники и они будут размещены на сайте.

Название
Описание
Раздел
Объём
Ссылки
WebBrowser
Простенький веб-браузер, написанный в Delphi 7. Присутствуют базовые функции браузера.
507 Кб
VTS writing pad
VTS writing pad — это текстовый редактор, используемый для создания простых документов. Наиболее часто программа «Vita writing pad» используется для просмотра и редактирования текстовых (TXT) файлов, но многие пользователи применяют программу «Блокнот» в качестве простого инструмента для создания веб-страниц. Программа «VTS writing pad» поддерживает только основное форматирование, поэтому случайное сохранение специального форматирования в документах, в которых должен остаться чистый текст, исключено. Это особенно полезно при создании HTML-документов для веб-страниц, так как особые знаки или другое форматирование могут не отображаться на опубликованных веб-страницах и даже могут приводить к возникновению ошибок.
328 Кб
Brilliant Code

Brilliant Code предназначена для более простого и удобного редактирования кода в среде программирования Delphi. Устанавливается для Delphi 7.

1.59 Мб

Atomik Buttons
Две усовершенствованные кнопки: atomikButton и atomikSpeedButton в качестве замены стандартных Button и SpeedButton.

26 Кб

E-Mail Label
Label для создания ссылок e-mail. Аналог email-ссылок на веб-страницах. При наведении и отведении мыши умеет менять цвет.

2 Кб

 
Всего новых файлов: 5  
2.45 Мб
 
 

Юмор

Ведущий раздела: Bruder

Кто есть кто (грабли)

Юзер - человек, наступающий на грабли

Чайник - ничинающий юзер, ни разу не наступавший на грабли и потому уверенный, что граблей не существует

Ламер - юзер, регулярно наступающий на грабли, но по-прежнему уверенный что граблей не существует.

Узкий специалист - юзер, в совершенстве владеющий наступанием на одни и те же грабли

Широкий специалист - юзер, имеющий на лбу более двух шишек.

Программер - тот, для кого в наступании на грабли важнее всего результат. Устав наступать на чужие грабли, изготавливает свои собственные.

Продвинутый программер - программер, наступающий на каждые грабли не более двух раз.

Копирайт - концепция, ограничивающая количество доступных для наступания граблей финансовыми возможностями юзера.

Геймер - тот, для кого в наступании на грабли важнее всего процесс. Обычно не способен изготовить собственные грабли.

Читер - разновидность геймера; наступает только на грабли с поролоновыми насадками на ручке и обычно не больше одного раза.

Хакер - тот, кто способен наступить на грабли, даже если они спрятаны в сарай и заперты на замок.

Хакер-идеалист - благородный борец за право каждого наступать на неограниченное количество граблей.

Microsoft - корпорация, всемирный лидер по производству граблей

Билл Гейтс - мифическое существо из программерского фольклора; злой дух - покровитель граблей.

Апгрейд - процесс перманентной траты денег на покупку все новых граблей, каждые из которых бьют больнее предыдущих.

Бета-версия - версия, в которой грабли видны невооруженным глазом.

Релиз - версия, в которой грабли присыпаны листьями.

Совместимость версий - принцип, позволяющий новым граблям попадать точно по шишке от предыдущих.

Ассемблер - язык программирования, позволяющий наступать на грабли несколько миллионов раз в секунду.

Локальная сеть - технология, позволяющая получить по лбу, даже когда на грабли наступает кто-то другой.

Интернет - технология, позволяющая наступить на грабли, находящиеся на другой стороне земного шара.

Сетевая конференция - технология, позволяющая каждому наступить не только на свои, но и на чужие грабли.

Русские кодировки - подарочный набор набор граблей для пользователей интернета.

Дружественный интерфейс - резиновая накладка на ручку граблей.

Гибкий (настраиваемый) интерфейс - накладка на ручку граблей, которую можно двигать, подгоняя под высоту своего лба

Графический интерфейс - грабли, позволяющие регулировать цвет и интенсивность искр после удара по лбу.

Ненадежная система - грабли, которые бьют вас даже тогда когда вы на них не наступаете.

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

Многозадачность - концепция, позволяющая наступать на несколько граблей одновременно.

Объектно-ориентированное программирование - метод изготовления граблей по принципу матрешки.

Мануал - книга, описывающая различные способы наступания на грабли. Никогда не используется ламерами и хакерами. Продвинутые программеры используют ее после того, как наступят на те же грабли во второй раз.

Техподдержка - служба, дающая советы, что делать после наступания на грабли. Обычно первый ее совет - наступить на грабли еще раз и сравнить ощущения.

Источник: bayanov.net

:))

Присылайте компьютерные анекдоты, рассказы и истории по этой ссылке и они будут опубликованы в ближайших выпусках рассылки.




Ведущий рассылки: Ерёмин Андрей


В избранное