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

  Все выпуски  

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


Программирование на DELPHI
Рассылка сайта www.delphi.int.ru
Выпуск #86 (22 февраля 2009 г.)

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

Delphi.int.ru

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

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

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

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

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

Рассылки не было давно, даже очень давно... Ещё не забыли, что такая существует? :-) Увы, учёба, работа и прочие дела - всё это затрудняет поддержку и развитие проекта, и в особенности тормозит рассылку. Так или иначе, всё живо, и в мир иной уходить не собирается. Собираем силы в кулак, и вперёд!

Из новостей сайта следует отметить:

  • Появилась гостевая книга, где каждый из посетителей может оставить свои мнения, пожелания и предложения. Помнится, когда-то давно, году в 2005-2006 на сайте была гостевая, но потом было принято решение её убрать из-за большого количества спама. Однако, как показала практика, гостевая на сайте не помешает. Что ж - пожалуйста. Обратите внимание, что книга разделена на несколько частей, каждая из которых соответствует части сайта - основной его части (www.delphi.int.ru), Системе "Эксперт" (expert.delphi.int.ru) и интерфейсу пользователя (my.delphi.int.ru). Таким образом, можно оставить мнения отдельно для каждого из уголков сайта.
  • Решены проблемы с добавлением комментариев и оценкой статей. Теперь функции работают полноценно, но доступны только зарегистрированным пользователям. Старые комментарии, которые сохранились, восстановлены.
  • Создана возможность переголосовать в любом из опросов на сайте. Со временем мнение меняется, поэтому данная функция может оказаться полезной. Если у кого-то есть идеи, какие ещё опросы можно провести, пишите - добавим их на сайт, и узнаем мнение людей.
  • Существенно модернизирован IRC-канал: установлен полноценный бот, который сообщает свежую информацию с сайта, ну и имеет несколько других функций. Канал стал более активным. Заходите, общайтесь, делитесь опытом. Куда подключаться - написано в левом блоке (<<).

Мужскую половину аудитории - с Днём Защитника Отечества!

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

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

  • Обучение - урок 25: Работа с файлами и каталогами (часть 1);
  • Статья: Использование хранилища объектов Delphi;
  • Файловый архив - новые исходники, программы и компоненты;
  • Юмор - Расшифровка смайликов.

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

Количество экспертов: 74 (+9).
Участниками задано вопросов: 2443 (+499).
Экспертами дано ответов: 3002 (+403).
Количество сообщений на мини-форумах: 7248 (+2513).
Максимальное число разосланных в день писем, не считая новостей (за всю историю): 809 (17.07.2007, +0).

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

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

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

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

Количество читателей рассылки (22.02.2009, 20:00):
5439+1986+482= 7907

Связь по e-mail:

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


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

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

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

12 октября 2008 г.

Внесены изменения в функциональные возможности, доступные участникам в зависимости от их статусов:
1. Использование HTML-разметки теперь доступно всем экспертам со статусом 3-ий класс и выше.
2. Управление собственными сообщениями на мини-форумах вопросов (редактирование и удаление) отныне доступно всем без исключения участникам (т.е. и посетителям).

12 октября 2008 г.

Внесены существенные изменения и дополнения в функцию репутации.
∙ возможность изменить репутацию не только на 1, но и на 2, на 3;
∙ динамические ограничения на изменение репутации (нельзя оставить подряд несколько отзывов одному и тому же участнику);
∙ новый режим изменения репутации: не за сообщения, оставленные на сайте, а по какой-либо другой (своей) причине.

2 ноября 2008 г.

Добавлена возможность предварительного просмотра сообщений перед отправкой (публикацией на сайте). Просмотр осуществляется соответствующей кнопкой рядом с полем ввода сообщения. Пользоваться предварительным просмотром рекомендуется всем, чтобы заранее видеть, как будет выглядеть сообщение. А особенно тем участникам, которым доступно использование HTML-разметки и которые её используют.

6 января 2009 г.

Добавлена возможность просмотра всех отзывов для каждого конкретного сообщения (вопроса, ответа, сообщения в мини-форуме). Для просмотра следует воспользоваться ссылками, расположенными рядом с этими сообщениями.

6 января 2009 г.

Появилась функция оценки ответов по пятибалльной шкале, доступная всем пользователям (аналогчино оценке вопросов, которая была введена ранее).

8 января 2009 г.

В разделе Поиск информации созданы два новых тематических подраздела: Программы с исходным кодом и Поиск в интернете. Все вопросы, заданные ранее в раздел "Поиск информации", перемещены в раздел "Поиск в интернете".

22 января 2009 г.

Созданы два новых тематических раздела:

Ассемблер: Программирование на языке Ассемблер (Assembler) и его различных версиях: Macro Assembler, Turbo Assembler и др.

Basic: Basic (Бейсик), включая все его разновидности (QuickBasic, GWBasic, Visual Basic, VBA): вопросы установки, настройки, программирования и отладки программ.

26 января 2009 г.

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

Ежемесячное голосование за лучший вопрос и лучший ответ было остановлено в сентябре, а в феврале снова было открыто, но принцип выбора победителей изменился - теперь они выбираются на основе тех оценок, которые давали посетители сайта за вопросы и за ответы.
За январь медали получили: Amidamaru (лучший ответ) и Arriba (лучший вопрос).

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

19 февраля 2009: Ученый повысил свой уровень и теперь имеет статус 5-ый класс (прежний статус: 4-ый класс).

18 февраля 2009: Пупкин В В стал экспертом и теперь имеет статус 1-ый класс (прежний статус: Посетитель).

16 февраля 2009: Николай Рубан повысил свой уровень и теперь имеет статус 10-ый класс (прежний статус: 9-ый класс).

15 февраля 2009: Виталий стал экспертом и теперь имеет статус 1-ый класс (прежний статус: Посетитель).

6 февраля 2009: Amidamaru повысил свой уровень и теперь имеет статус 2-ой класс (прежний статус: 1-ый класс).

 

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

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

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

Кол-во вопросов: 29
Кол-ответов: 39
Баллов за ответы: 97
 

Вопрос # 461

Не устанавливается среда на WinSP2. Ни Delphi6, ни Delphi 2005.
Пробовал сразу после установления системы с драйверами - результат отрицательный.
Нет желания возвращаться к WinSP1.
КАК УСТАНОВИТЬ СРЕДУ DELPHI6 НА WINSP2?

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

 

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

Советую ставить либо Delphi7 или 2006. Те, версии, которые вы указали, менее стабильны. 6 на второй сервис пак не ставил, а вот 2005 стаёт отлично.
Как именно не ставиться:
- инсталятор не запускается
- ошибки сыплятся.
- ставиться ли с этого диска на другом компютере?

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 7 апреля 2007, 21:23
Оценка за ответ: 4
Комментарий: Поясню. Не запускается инсталятор. Хотя раньше на SP1 он становился. Такая же ситуация с Delphi2005

Ответ #2. Отвечает эксперт: Виталий Лещенко

Здравствуйте, Артюхов Александр Иванович!

Я так понимаю WinSP2 это WinXP SP2?


1. Проверьте инсталлятор на валидность... мало ли, может повредился.
2. Попробуйте отключить антивирус... если он установлен.
3. Попробуйте переустаность WinXP. Может что-то криво стало.

Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Ответ отправлен: 7 апреля 2007, 23:40
Оценка за ответ: 4
Комментарий: Для усановки среды я специально посталил заново систему WinXP SP2, драйвера на устройства и начал сразу устанавливать среду (пытался с винчестера и потом с компакта) Delphi6 и 2005. Не запускается сама установка... АВП не ставил

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

Имею опыт по переносу Delphi (и даже 1С-бухгалтерии) с одного компа на другой. Без установки. Со всеми установленными левыми компонентами. Могу научить. :) Но лучше попробуй сам.

Так что ставь ну другой комп и перетаскивай на флешке. Не забудь экспортировать из реестра все настройки. Все библы компонентов *.bpl лежат в C:\windows\system32. Ещё надо перетащить дебаггер и прочие вещи. Это папка C:\Program Files\Common Files\Borland Shared\.

Удачи в нелёгком деле.

Ответ отправил: min@y™ (статус: Бакалавр)
Ответ отправлен: 9 апреля 2007, 09:12
Оценка за ответ: 5


Вопрос # 462

Уважаемые эксперты!
У меня к вам огромная просьба, пожалуйста опубликуйте свойства, методы и краткие описания компонетов с панели IndyMisc, или подскажите где можно их найти.
Заранее благодарна.

Вопрос задала: ануфриева антонина (статус: Посетитель)
Вопрос отправлен: 07 апреля 2007, 22:20
Всего ответов: 2

 

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

Здравствуйте, ануфриева антонина!Посмотрите книгу IndyInDepth( Глубины Indy ).Есть тут http://podgoretsky.com/cgi-bin/dlcounter/npscnt?file=http://podgoretsky.com/ftp/Docs/Internet/IntroIndy/IndyInDepth.doc&file_id=IndyInDepth.

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 7 апреля 2007, 22:31
Оценка за ответ: 5
Комментарий: Огоромное вам Роман спасибо! Очень долго искала и никак не могла найти,а благодаря вам у меня теперь есть целая книга по данной тематике!

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

Help?
Также с их сайта можно скачать руководства (nevrona.com). Но они на английском:(

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


Вопрос # 464

Уважаемые эксперты!
Подскажите, пожалуйста:
1) как сделать так, чтобы при наборе пароля появлялись не звёздочки *, а большие чёрные точки(пули)?
2) Как лучше организовать вывод на печать содержимого Label1.Caption? Строк там много, количество заранее неизвестно, а печать формы желаемых результатов не даёт (печатается только та часть текста, которая видна на экране).
Заранее большое спасибо.

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

 

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

1) Насчет больших черных точек не знаю (просто код не помню), а вот знак копирайта для примера вполне сойдет.
Просто измените свойство PasswordChar:=#169; (я надеюсь что Вы MaskEdit - используете).

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

RichEdit1.Text:=Label1.Caption;
RichEdit1.Print('My Text');



Good Luck!!

Ответ отправил: Николай Рубан (статус: 10-ый класс)
Ответ отправлен: 8 апреля 2007, 02:17
Оценка за ответ: 4

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

Чёрные точки: PasswordChar:= #149.
Есть же в Windows примочка - Таблица символов.
Печать любого текста в Delphi - дофига статей можно найти, погуглив, или на http://www.delphikingdom.com

Ответ отправил: min@y™ (статус: Бакалавр)
Ответ отправлен: 9 апреля 2007, 09:21
Оценка за ответ: 3


Вопрос # 466

Как програмно свернуть окно программы?
Только не так:
WindowState:=wsMinimized;
ибо в этом случае окошко свертывается в нижний левый угол раб. стола, а не в панель задач...

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

 

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

Я так понял что просто Ваш проект состоит из нескольких форм, вот потому у Вас и возникает такая проблема.
Чтобы ее избежать Вам достаточно в этой форме написать такой обработчик:
procedure TFormХХ.FormCreate(Sender: TObject);
begin
ParentWindow:=GetDesktopWindow;
end;


И тогда форма будет сворачиваться в панель задач.
Good Luck!!!

Ответ отправил: Николай Рубан (статус: 10-ый класс)
Ответ отправлен: 8 апреля 2007, 21:05
Оценка за ответ: 1

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

Как на счёт Application.Minimize()?

Ответ отправил: min@y™ (статус: Бакалавр)
Ответ отправлен: 9 апреля 2007, 09:24
Оценка за ответ: 5
Комментарий: То что надо... :D


Вопрос # 468

Доброго времени суток.
У меня есть такой вопрос. Как можно использовать файлы .dwg, .iges, .m3d или что-то подобное.

Вопрос задал: Крюков Артем Викторович (статус: Посетитель)
Вопрос отправлен: 09 апреля 2007, 04:31
Всего ответов: 1; сообщений в мини-форуме вопроса: 2

 

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

Как использовать? дивный вопрос. Хотя попытаюсь догадаться. Например, конвертировать в другой формат (если мы умеем конвертировать в bmp или wmf, то автоматом решается проблема печати и отображения на экране).
О первом формате могу расказать подробнее. Хотя сам формат закрыт, но есть много компонентов, которые более-менее с ним работают. Как искать?
Идём на torry.net и в поиске набираем dwg. Там возле каждого есть буковки, по которым понятно что за лицензия на компонент. Самая миролюбивая - FWS = бесплатно и с исходниками. Какой лучше? пробуйте, тестируйте. Для каждой цели свой лучше. С остальными форматами разбираемся также. Узнаём какой проге принадлежат, и ишем компонент. m3d - кажеться 3d max принадлежит

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


Вопрос # 469

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

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

 

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

Надеюсь форму вы сделали. Дальше поступаем так, заводим базу данных с такими полями: имя, хеш пароля и код уровня доступа. В качестве хеша юзаем например md5 или SHA256. Почему хеш? Что бы если шпион откроет базу, то не мог узнать пароль, зачем он ему:)
А с кодом доступа - это я в качестве примера, я так просто когда то делал. Записан 255 - полный доступ, записан 0 никуда нет доступа. Записан 192 (в двоичной системе 11000000) доступ открыт только к первым двом функциям (я предполагаю, что у нас 8 пунктов доступа, типа "печать", "добавления пользователей", "экспорт", и так далее, вам виднее.) целое число вам даст 32 бита, чего обычно предостаточно. Что бы враг и тут не догадался, число можно зашифровать.
Теперь о других деталях. Как проверить пароль, если у нас только хеш? такие алгоритмы, как md5 односторонние, тоесть в одну сторону быстро, а обратно - обычно только полный перебор. Мы же в проге делаем так. Пользователь ввел пароль, мы берём хеш и сравниваем с записаным в базе. Потом взяв от паролья какой нибудь другой хеш, можно расшифровать конфиденциальные настройки. Только не переусердствуйте - потом может быть мучительно больно, когда потеряете данные.

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


Вопрос # 470

Народ помогите, понять как работать с сотовым телефоном из Delphi.
Для работы с Com портом использую TComm
пример приложен.
На эту команду тел должен отреагировать, а он молчит. Запускал команде в HyperTerminal все работает.
Спасибо за помощь.

Приложение:

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

 

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

Много причин может быть.
- Данная конфигурация порта не поддерживается телефоном.
- телефон не обязан реагировать на все комманды. У вас нет кода чтения ответа. Добавтье его - должно проясниться.
Я работал в своё время с телефонами. Некоторые компонентны не очень хорошо работают. Больше всего мне понравилась библиотека synapse (http://www.ararat.cz/synapse/). Это не компонент, но работает очень чётко.
там даже есть специальный метод ATCommand

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

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

Здравствуйте, Щербаков!Для работы с тылефонами есть такая штука Bluetooth Framework VCL,она правда кажется платная но и без рагистрации работает без ограничений только при запуске инф.окно появляется.Так вот Bluetooth Framework поддерживает все возможные интерефесы связи с мобильными устройствами. А именно: Bluetooth, последовательные порты и IrDA.Эта библиотека использует в своей работе Windows API и API производителей соответствующих драйверов. Таким образом, вам не нужны никакие дополнительные программы и библиотеки.
http://softsearch.ru/programs/253-324-bluetooth-framework-vcl-download.shtml

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


Вопрос # 471

Доброе время суток! Уважаемые эксперты, подскажите пожалуйста, как из Delphi управлять OpenOffice.org? Может ссылка какая есть на информацию?

Вопрос задал: Мережников Андрей (статус: 6-ой класс)
Вопрос отправлен: 11 апреля 2007, 05:12
Всего ответов: 1

 

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

Умение работать с GOOGLE должно сильно сократить поток подобных вопросов. Без обид, ничего личного. Итак, я набрал в поисковике: "работа из delphi с openoffice". Первая же ссылка - статья по сабжу, вот она:
http://www.delphimaster.ru/articles/openoffice/index.html
Вторая ссылка - это, как ни странно, вторая статья:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1302

Для начала хватит?

Ответ отправил: min@y™ (статус: Бакалавр)
Ответ отправлен: 11 апреля 2007, 08:20
Оценка за ответ: 5
Комментарий: Спасибо


Вопрос # 472

Дорогие эксперты
Помогите пожалуйста
Мне нужно отследить сворачивание/разворачивание окна когда пользователь нажимает на кнопку приложения в панеле задач Windows!!!

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

 

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

Здравствуйте, Сидаровский Георгий!
Отследить нажатие именно этой кнопки не получится - Windows не даёт никакие событий, привязанных к этой кнопке. Однако есть то, что поможет. Поместите компонент TApplicationEvents со вкладки Additional на форму. У него есть события OnMinimize и OnRestore. Они происходят соответственно при сворачивании приложения и при его разворачивании. Это практически то же самое. Следует отметить, что это события именно всего приложения, а не какой-либо формы. Думаю, это как раз то, что вам нужно. Желаю удачи!

Ответ отправил: Dron (статус: Студент)
Ответ отправлен: 11 апреля 2007, 14:53
Оценка за ответ: 5
Комментарий: и есчо +5 лучшего ответа есчо неслышал


Вопрос # 473

Как во время исполнения программы загрузить изображения в ImageList?

Вопрос задал: Иван-488 (статус: Посетитель)
Вопрос отправлен: 11 апреля 2007, 19:41
Всего ответов: 3

 

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

add(картинка, маска)

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

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

Например так:

var ico: TIcon;
i:integer;
begin
ico := TIcon.Create;
for i:=1 to 3 do
begin
ico.LoadFromFile(ExtractFilePath(Application.ExeName)+format('ico\%d.ico',[I]));
Imagelist2.AddIcon(ico);
end;
ico.Free;
PageControl1.Images:=ImageList2;

TabSheet1.ImageIndex:=0;
TabSheet2.ImageIndex:=1;
TabSheet3.ImageIndex:=2;
end;

Загоняем в ImageList2 - три иконки (который лежат в том же каталоге что и проект только в подкаталоге \ico), например - и потом привязываем эти иконки к существующим закладкам PageControl1.

GoodLuck!!

Ответ отправил: Николай Рубан (статус: 10-ый класс)
Ответ отправлен: 11 апреля 2007, 20:42

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

Здравствуйте, Иван!Значит так:
1).Add(image,mask:TBitmap):integer -добавляет в список мзображение и маску,возвращает номер изобр. в списке.
2). AddIcon(image:TIcon):integer - добавить *.ico,рисуются прозрачными.
3). AddMasked(image:TBitmap;MaskColor:TColor):integer - аналогичен add но вместо маски задаётся прозрачный цвет
4). FileLoad(ResType:TResType;Name:string;MaskColor:TColor):Boolean - загрузка из файла ресурсов с именем name ,В ResType указывается тип ресурса,MaskColor - прозрачный цвет
5). AddImages(value:TCustomImageList) - копирование всех изображений из другого ImageList
6). Insert(index:integer;image,mask:TBitmap) - добавить в указанную позицию списка
7). InsertIcon(index:integer;image:TIcon) - добавить *.ico в конкретную позицию
8). ResourceLoad(ResType:TResType;Name:string;MaskColor:TColor):Boolean - загрузка из файла ресурсов с именем name ,В ResType указывается тип ресурса,MaskColor - прозрачный цвет

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


Вопрос # 474

Здравствуйте, уважаемые эксперты!
Подскажите пожалуйста - как определить вмдеоадаптер в ПК, и монитор, подключенный к ПК.

С уважением, zlm

Вопрос задал: zlm (статус: Посетитель)
Вопрос отправлен: 12 апреля 2007, 13:04
Всего ответов: 1

 

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

Здравствуйте, zlm!Вот пример как определить видеокарту,и посмотрите delphiworld.narod.ru/base/get_set_videoadapter_modes.html и delphiworld.narod.ru/base/get_set_video_modes.html

Приложение:

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 12 апреля 2007, 14:28
Оценка за ответ: 5
Комментарий: Большое спасибо


Вопрос # 475

Здраствуйте, дорогие эксперты. Помогите пожалуйста решить такой вопрос:
В SQL-Server-е создал VIEW. А теперь нужно из формы DELPHI с помощью компонента TABLE связаться с этой VIEW. У меня в Инспекторе Объектов, в свойстве TABLENAME компонента TABLE название созданной мною VIEW отсутствует. Как можно добавить в это свойство название новой VIEW. Заранее Вам спасибо.

Вопрос задал: Usmonov Farrukh Faiziddinovich (статус: Посетитель)
Вопрос отправлен: 13 апреля 2007, 08:00
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

 

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

1. Попробуй задать имя таблицы (то есть твоего View) вручную.
2. Попробуй вместо компонента "таблица" использовать запрос виде SELECT * FROM VIEW; (конечно, это не самый лучший вариант)

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


Вопрос # 476

Здравствуйте, уважаемые эксперты!
У меня 2 вопроса:
1. Как определить IP ПК в случае одной сетевой карты я знаю (http://delphiworld.narod.ru/base/get_ip.html) но как мне получить второй IP (если у ПК 2 сетевых)
2 вопрос. Размер логических дисков ПК я определять умею, а как мне определить размер ФИЗИЧЕСКИХ дисков ПК и их количество
С уважением, zlm

Вопрос задал: zlm (статус: Посетитель)
Вопрос отправлен: 13 апреля 2007, 11:59
Всего ответов: 2

 

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

1) Данные о настройках IP можно найти в реестре в такой ветке:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Adapters
где ключе вида {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - идентификатор адаптера, если у вас две сетивые то у Вас должно быть да различный ключа.
Далее в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} Вы найдете настройки конкретного адаптера.
В таких ключах:
IPAddress - сам IP адрес
SubnetMask - маска подсети
NameServer - DNS сервер
DefaultGateway - адрес шлюза.

Достучаться до реестру при помощи программы можно таким образом:
.........
s:='Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\';
Reg:=TRegistry.Create;
reg.openkey(s,false);
if reg.ValueExists(key)
then
begin
......
end;
Reg.CloseKey;
Reg.Free;

Только нужно дописать: uses Registry;

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

Удачи!!!

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

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

Здравствуйте, zlm!Дорога вам на 1). delphiworld.narod.ru/_internet_.html
2). delphiworld.narod.ru/_files_.html

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 13 апреля 2007, 15:24
Оценка за ответ: 4


Вопрос # 478

Здравствуйте, уважаемые эксперты!
У меня к вам такой вопрос?
Например, я создал программу. Кинул ярлык
на рабочий стол, нажав на ярлыке программы
правую кнопку мыши, выбираю свойства, ярлык, сменить значок (то есть иконку), но менять то нечего, у меня там всего одна иконка. Как мне сделать так, чтобы в моей программе было несколько иконок, из которых можно выбирать, а не нажимать кнопку обзор и искать их. И ещё если можно спросить, как мне в Delphi сделать программу с набором иконок на примере как в Windows в файле shell32.dll.
С уважением, Толков Геннадий Викторович

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

 

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

Нужно просто добавить иконки в файл.
Это можно сделать так. С помощью любого редактора ресурсов делаем res файл, в который напихаем нужные иконки. Сохраняем файл в папке с вашим проектом. Теперь осталось подключить к проекту. Для этого пишем в project.dpr строку
{$R icon.res}
где icon.res = файл с иконками

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

Ответ #2. Отвечает эксперт: Лукьяненко Алексей Валериевич

Для этого нужно сформировать .res-файл с иконками.
Файл можно подготовить с помощью какой-либо специализированной программы, а можно и с помощью Delphi. Для этого в блокноте или др. редакторе создаете текстовый файл такого сожержания:

ICON1 ICON "C:\Icons\Icon1.ico"
ICON2 ICON "C:\Icons\Icon2.ico"
.....


где ICON1 - имя иконки, "C:\Icons\Icon2.ico" - путь к файлу с иконкой, а ICON - код ресурса.
Файл сохраняете с расширением .rc
После этого выполняете команду
brcc32 путь_к_rc_файлу путь_к_res_файлу
если .rc-файл Вы сформировали правильно, то у Вас появится файл .res, который можно подключать к проекту Delphi - в любом файле проекта указываете директиву {$R путь_к_res_файлу}

Ответ отправил: Лукьяненко Алексей Валериевич (статус: 1-ый класс)
Ответ отправлен: 16 апреля 2007, 10:45


Вопрос # 479

Здравствуйте, уважаемые эксперты!

Я пишу дипломную работу.
Программа для компьютерного клуба. База данных на accesse. Соответственно использую ADO.
В программе отсчитывается время до конца. Так вот: как можно считать данные из базы? При чем несколько строк одновременно!

Приложение:

Вопрос задал: Бондаренков Александр Александрович (статус: Посетитель)
Вопрос отправлен: 14 апреля 2007, 15:17
Всего ответов: 1

 

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

Код правильный, но в вопросе не указаны:
1) Текст запроса и структура данных
2) Выдаются ли ошибки времени выполнения (если да, то какие).

На первый взгляд, либо Connection, либо сам Query не активны (свойство Active), или неправильно составлен запрос.

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


Вопрос # 480

Здравствуйте, уважаемые эксперты!
Подскажите какой нибудь компонент для экспорта данных из ListView в HTML.
--
С уважением, Spawn.

Вопрос задал: Spawn (статус: 1-ый класс)
Вопрос отправлен: 15 апреля 2007, 08:24
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

 

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

Непонятно, что подразумевается под "экспортом". В принципе, если не нужны иконки, то HTML-файл очень легко генерируется (см. приложение).

Приложение:


Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 7-ой класс)
Ответ отправлен: 15 апреля 2007, 09:13
Оценка за ответ: 4
Комментарий: Попробую.. Под экспортом я подразумеваю именно компонент для экспортирования данных в файл какого либо формата, в основном мне нужен HTML.


Вопрос # 481

Здравствуйте, уважаемые эксперты!
Как сделать сквозную нумерацию строк (типа № п/п) в DBGrid, но не автоинкремент? Например как в Excel Меню\Правка\Заполнить\Прогрессия
Спасибо.
С уважением, Алексей.

Вопрос задал: Алексей-508 (статус: Посетитель)
Вопрос отправлен: 15 апреля 2007, 14:18
Всего ответов: 1

 

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

Здравствуйте, Алексей!
В DataSet'е , который отображается в Grid'e создайте вычисляемое поле (Calculated) числового типа и в событии OnCalcFields пропишите
Table1NEWFIELD.Value:=Table1.RecNo;

Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент)
Ответ отправлен: 16 апреля 2007, 10:17


Вопрос # 482

Здравствуйте, уважаемые эксперты!
Напишите последовательность действий для объявления объекта по классу с именем TNewclass.
И второй вопрос:
Назовите все компоненты класса, входящие в него при создании.
Вопросы не конкретные, хотелось бы получить ответы ина них в общем виде.
С уважением, Полушин Сергей Анатольевич

Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)
Вопрос отправлен: 15 апреля 2007, 16:11
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

 

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

[quote]Напишите последовательность действий для объявления объекта по классу с именем TNewclass.[/quote]

Не совсем понятно, что тут подразумевается.
Создание экземпляра класса:
nc:= TNewClass.Create(...);

Создание самого класса:
type
TNewClass = class(<Предок класса>)
private
// Поля, внутренние методы
protected
// Поля, внутренние методы
public
// Поля, методы, конструктор, деструктор
published
// если это компонент, то свойства и события
// этой секции будут видны в Object Inspector.
end;

Более подробно: могу выслать кусок книжки по этому поводу.

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


Вопрос # 483

Скажите, пожалуйста, почему у меня после такого кода на первом месте появляется Item с индексом "3", значком как у Item[0] и без Caption?

Приложение:

Вопрос задал: Иван-488 (статус: Посетитель)
Вопрос отправлен: 15 апреля 2007, 18:06
Всего ответов: 1

 

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

Пришлось отформатировать код в редакторе :).

1) Строка bit.LoadFromFile(ExtractFilePath(Application.ExeName)+('%d.bmp',[I-1]));
Вероятно, здесь пропущена функция Format().

2) Строка Form1.ListView1.Items.AddItem(nil, i);
Что добавляется в ListView?

3) Строка Form1.ListView1.Items.Item.Caption:=i;
После Items или Item должен стоять индекс в квадратных скобках, а также свойство Caption имеет тип string, а переменная i - Integer, это ж параметр цикла.

Компилятор просто бы выдал ошибки по коду.

Ответ отправил: min@y™ (статус: Бакалавр)
Ответ отправлен: 16 апреля 2007, 08:41


Вопрос # 484

Здравствуйте, уважаемые эксперты!
помогите разобраться с компонентом TTimer
вот мой кусочек задания:
На обрабатывающий участок цеха поступают детали. Интервал между моментами поступления деталей составляет в среднем 10 мин . Через каждые два часа поступление деталей прерывается ровно на 15 мин; обработка деталей, уже поступивших на участок, в это время не прекращается.
вопрос такой, можно ли это реализовать с помошью компонента TTimer? И если можно то как?!
А может есть ещё какие то варианты решения этой задачи, подскажите пожалуйста!!!
С уважением, Бабунов

Вопрос задал: Бабунов (статус: Посетитель)
Вопрос отправлен: 15 апреля 2007, 21:48
Всего ответов: 4

 

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

Самый простой способ который пришел в голову такой, возможно не самый рациональный:
советую Вам воспользоваться сразу тремя компонентами типа TTimer.
Timer1 - установите его интервал в 600000, что соответствует 10 минутам.
Timer2 - установите его интервал в 900000, что соответствует 15 минутам.
Timer3 - с интервалом в 7200000 - соответствует 2-м часам.

И соответственно останется верно скомбинировать их в зависимости от условия.

Удачи!!!

Ответ отправил: Николай Рубан (статус: 10-ый класс)
Ответ отправлен: 15 апреля 2007, 22:38
Оценка за ответ: 5

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

Здравствуйте, Бабунов!
К предыдущему ответу:
Вместо третьего таймера лучше делать подсчёт в первом таймере.
Варианты решения может и есть, но Вы же не сформулировали задачу. Кроме того у Вас есть загадочная фраза "обработка деталей, уже поступивших на участок, в это время не прекращается", тоесть для полной картины ещё нужно время обработки каждой порции.

Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент)
Ответ отправлен: 16 апреля 2007, 10:25
Оценка за ответ: 5

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

А мне кажется, всю обработку надо выполнять в цикле (без использования компонента Timer), в конце итерации - задержка с использованием процедуры Sleep с рандомным количеством миллисекунд (чтобы в среднем получалось 10 секунд), ну и отдельно учитывать общее время, чтобы ставить задержку на 15 минут каждые два часа.

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

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

Здравствуйте, Бабунов!
Хочу заметить, что TTimer штука очень неточная,погрешность зависит от загрузки компа.
При интервале <=1сек приемлемо, а вместо 10 минут Вы можете получить и 9 и 11 и даже 12 или 8.
По этому я предлагаю: настроить таймер на 1000=1сек, в начале интервала считывать с помощью функции Time системное время, записать его в переменную типа TDateTime и каждую секунду (чаще или реже) опять получить системное время, из него вычесть то что запомнили, получится число секунд от начала интервала, когда разница досигнет или превысит 600, прошло 10 минут, причем весьма точно. Ведь нет разницы на каком цикле таймера достигнут конец интервала на 600 или 650, все зависит от системных часов.
Удачи!

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


Вопрос # 485

Приветствую!!У меня MS SQL Server.Не получается добавить в системную таблицу syscolumns новые поля.Подскажите,можно ли это сделать и если да, то как.Спасибо.

p.s. Это связано с програмированием на Delphi.

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

 

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

Зачем добавлять поля в системную таблицу? Вы уверены, что сервер вообще после этого будет нормально работать?
И даже записи новые не стоит добавлять

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


Вопрос # 487

Здравствуйте, уважаемые эксперты!
При перемещении Timage последний страшно мерцает. Как устранить сей момент.Заранее большое спасибо.

С уважением, Авдошин Алексей Витальевич

Вопрос задал: Авдошин Алексей Витальевич (статус: Посетитель)
Вопрос отправлен: 16 апреля 2007, 17:31
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

 

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

Анимацию мутим? Лучше совать в момент события OnPaint. Ищите в ответах, я несколько раз на подобные вопросы отвечал, больше не хочу.

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 16 апреля 2007, 17:44
Оценка за ответ: 3
Комментарий: Необходимо просто гонять рисунок за мышей.Постараюсь найти в ответах


Вопрос # 488

Здравствуйте, уважаемые эксперты!
Как установить у Timage свойство DoubleBuffered

С уважением, Авдошин Алексей Витальевич

Вопрос задал: Авдошин Алексей Витальевич (статус: Посетитель)
Вопрос отправлен: 16 апреля 2007, 18:34
Всего ответов: 2; сообщений в мини-форуме вопроса: 2

 

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

Здравствуйте.
Свойство DoubleBuffered (Boolean) есть только у формы. У всех остальных компонент его нет. Оно автоматически применяется ко всему, что этой форме принадлежит. Поэтому следует написать так:
Form1.DoubleBuffered:=True;
И сделать это достаточно всего один раз - как правило, при запуске программы, т.е. на событии OnCreate() формы. Свойство действительно убирает мерцание при анимации. Пусть и не полностью, но результат очень заметен.
Желаю удачи!

Ответ отправил: Dron (статус: Студент)
Ответ отправлен: 16 апреля 2007, 19:01

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

Свойство DoubleBuffered есть не только у формы, а у всех классов, наследованных от TWinControl. Если TImage лежит, к примеру, на TPanel, то можно поставить Panel.DoubleBuffered:= True;

В приложении оставляю функцию установки свойства DoubleBuffered всех оконных компонентов, лежащих на компонентое Parent, включая его самого.

Приложение:

Ответ отправил: min@y™ (статус: Бакалавр)
Ответ отправлен: 17 апреля 2007, 08:21


Вопрос # 489

Здравствуйте, уважаемые эксперты!

Подскажите как сделать полную(RecNo) сортировку записей таблицы по определенному полю.
dBaseIV
Как в Database Desktop Tools/Utilities/Sort.

С уважением, Владимир

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

 

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

1. Создать индекс по этому полю, указать этот индекс в свойстве IndexName компонента TTable.
2. Использовать запрос (SELECT ... FROM... ORDER BY ...)

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


Вопрос # 490

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

С уважением, Илья Бабаков

Вопрос задал: Илья Бабаков (статус: Посетитель)
Вопрос отправлен: 17 апреля 2007, 09:02
Всего ответов: 1; сообщений в мини-форуме вопроса: 3

 

Ответ #1. Отвечает эксперт: PaVeL-Ekt

Здравствуйте, Илья Бабаков!

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

или молжно в это поле внести идентификатор файлового имени например Logov тогда все гр файлы будут Logov_1.jpg ... Logov_n.jpg

Насчет эскизов тоже есть 2 варианта, либо при каждой загрузке картинок их ужимать, либо при добавлении картинки к архиву создавать эскиз и сохранять его по имени файла_small
н.п. Logov_1_small.jpg

Ответ отправил: PaVeL-Ekt (статус: 2-ой класс)
Ответ отправлен: 17 апреля 2007, 10:04
Оценка за ответ: 4


Обучение Delphi

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

22. Простые типы данных
23. Множества
24. Записи (часть 1)

Работа с файлами и каталогами (часть 1)

Автор:
© Ерёмин А.А., 2009
Ничто так не засоряет постоянную память, как временные файлы.
Номер урока:
25

Введение

Несмотря на то, что предыдущий урок был посвящён записям, но тема не была раскрыта полностью, данный урок будет о другом - о том, как работать с файлами и с каталогами. Эти знания нам понадобятся в дальнейшем при работе с записями, поэтому логично рассказать об этом прямо сейчас. Кроме того, вопросы относительно файлов и папок возникают достаточно часто.

Вспомним, о чём, собственно, речь...

Для обычного пользователя, который не занимается программированием, знать о файлах и папках много не нужно. Достаточно иметь базовые представления, что это такое, как это используется, и какие возможны операции. Однако при программировании необходимо понимание того, что находится "внутри" и как всё это работает.
Итак, файл. Существуют сотни определений этого слова, но все они крутятся вокруг одно и того же. Файл (file) - это совокупность байтов, хранящаяся во внешней памяти и имеющая своё имя. Каждый файл мы можем найти именно по его имени. Каталог (папка, директория - folder, directory) - это своеобразный контейнер для файлов и для других папок. Каждая папка считается абсолютно "резиновой", т.е. мы можем класть в неё файлы до тех пор, пока есть место на диске: объём папки не ограничен. Эти два ключевых понятия неразрывно связаны между собой. В рамках одной папки имена файлов уникальны, т.е. не может быть двух файлов с одним именем. Следует отметить, что регистр, в котором написаны имена файлов и папок, играет свою роль. В операционной системе Windows заглавные и строчные буквы не различаются и к файлу file.txt можно запросто обратиться FILE.TXT и даже fIlE.TxT - система это прек расно поймёт и проведёт Вас к одному и тому же файлу. Однако в некоторых других операционных системах этот принцип не работает - FILE.TXT и file.txt - два совершенно разных файла. Говорить о том, какой вариант лучше, можно долго - у каждого варианта есть свои преимущества и свои недостатки. Где ещё мы думаем или, наоборот, не задумываемся о регистре? Язык Pascal регистро-независимый: можно писать в любом регистре - как больше нравится или как удобнее. Код, написанный в любом регистре, интерпретируется совершенно одинаково. Речь не идёт, конечно, о строках и символах: при их обработке регистр, естественно, важен.
Что ещё мы должны знать? Каждый файл имеет расширение. Как правило, это 3 символа, хотя современные файловые и операционные системы позволяют делать его и большей длины. У файлов и папок есть атрибуты - некоторые свойства. Кроме того, файловая система хранит некоторую дополнительную информацию о файлах и папках - дата и время создания, открытия, изменения файла, автора и пр.
Ну что же, вроде бы основные моменты вспомнили. Теперь начнём постепенно разбираться, как же со всем этим хозяйством можно работать в Delphi.

Текстовая обработка: пути и имена файлов

Для начала давайте узнаем, где мы вообще находимся. Я имею ввиду полный путь к исполняемому файлу нашей программы. Совершенно логично, что спрашивать нужно у самого приложения, т.е. у объекта Application. Свойство называется ExeName. Не обращайте внимания, что по названию это имя файла - вовсе нет, это самый полный путь к нему.

Edit1.Text:=Application.ExeName;

В качестве результата будет например следующее: C:\Documents and Settings\Андрей\Мои документы\RAD Studio\Projects\Project1.exe.

Уже неплохо, согласитесь? Ориентация в пространстве - одна из важных функций. Есть и другой способ получить ту же самую информацию - функция ParamStr() с параметром 0.

Edit1.Text:=ParamStr(0);

Если никогда не слышали о командных параметрах - не волнуйтесь. Всему своё время. Просто используйте первый вариант. Идём дальше.

Что нам ещё нужно? Да много чего на самом деле! Например, мы хотим узнать-таки имя исполняемого файла нашей программы. Да, Вы знаете, под каким именем сохранён Ваш проект - именно так и называется исполняемый файл, но только расширение другое - exe. Однако кто сказал, что этот файл будет называться именно так всю свою жизнь? Например, в дистрибутив программа может быть включена совершенно под другим именем. Вывод: "жёстко" указывать имя в коде не пойдёт - будем брать его динамически. Откуда его можно взять? Да вот из пути, который мы только что получили! Нам поможет функция, название которой именно это и означает: "извлечь имя файла" - ExtractFileName(). Единственный параметр - путь к файлу. Итак, пробуем:

Edit1.Text:=ExtractFileName(Application.ExeName);

Ага, Project1.exe. Ловкость рук и никакого мошенничества. А Вы, уже было, приготовились открывать урок про работу со строками, и писать цикл по строке? :-) На самом деле, эта функция так и работает, но код уже написали давным-давно за нас.

Следующий логичный вопрос. Имя файла знаем, а как бы нам узнать только путь? Правильно, всё очень просто: "извлечь путь к файлу" - ExtractFilePath(). Параметр - снова путь:

Edit1.Text:=ExtractFilePath(Application.ExeName);

Получили C:\Documents and Settings\Андрей\Мои документы\RAD Studio\Projects\. Что ещё для счастья нужно? Казалось бы, ничего? Ан-нет, во многих случаях в таком виде путь неприемлем. Слеш в конце лишний. Можно его удалить вручную, а можно использовать другую функцию - ExtractFileDir(). Всё то же самое, только она вернёт нам путь без слеша на конце:

Edit1.Text:=ExtractFileDir(Application.ExeName);

Результат: C:\Documents and Settings\Андрей\Мои документы\RAD Studio\Projects.

Рабочий каталог с свойствах ярлыкаУ Вас наверняка есть своё рабочее место - часть комнаты дома или в офисе: стол с компьютером, кресло. Есть ещё и виртуальный рабочий стол. Программы в этом плане не обделены - у них тоже есть своё рабочее место, которое называется рабочим каталогом. Что это такое? Это та папка, которую программа считает текущей. Т.е. если никуда не ходить, то мы будем работать прямо в этой папке. Что это даёт? Это позволяет обращаться к этому уголку дискового пространства напрямую: вместо указания полного пути к файлу - только его имя. Хотим перейти в подкаталог - пожалуйста, скажите только его имя. По умолчанию рабочим каталогом программы считается тот, в котором расположен её исполняемый файл. Узнать текущий каталог можно функцией GetCurrentDir() - как всегда, логичное название ("получить текущую директорию"):

Edit1.Text:=GetCurrentDir();

В моём случае это C:\Documents and Settings\Андрей\Мои документы\RAD Studio\Projects. К примеру, если в этой папке создать файл new.txt, то к нему можно будет обратиться прямо new.txt, а не писать полный путь C:\Documents and Settings\Андрей\Мои документы\RAD Studio\Projects\new.txt. Если есть подкаталог Data, то зайти в него - просто Data\ вместо длинного C:\Documents and Settings\Андрей\Мои документы\RAD Studio\Projects\Data\. Предчувствую вопрос: а как перейти на уровень выше? Предыдущий уровень обозначается двумя точками, поэтому "..\" - это C:\Documents and Settings\Андрей\Мои документы\RAD Studio. Ну а повторив такой переход несколько раз, придём в корень диска C:. Не лишним будет также сказать, что есть и обозначение текущего каталога - одна точка ("./"). Позже, когда мы попробуем получить список файлов, эти тонкости всплывут.

Ну а теперь главное. Запомните, что рабочий каталог программы вовсе не обязан быть именно в папке с exe-файлом. Этот каталог можно легко изменить - если заглянуть в свойства ярлыка к любой программе, там есть поле "Рабочая папка". Изменение этого пути приведёт к смене рабочего каталога. К чему это ведёт, надеюсь понятно: программа начнёт обращаться к несуществующим данным, сохранять всё не там, где нужно - бардак в общем. Это одна из частых ошибок, о которой забывают, а потом не могут понять, откуда столько проблем.

Как изменить рабочий каталог? Думаю, сами догадались - функцией SetCurrentDir(). Пример:

SetCurrentDir('../../../');
Edit1.Text:=GetCurrentDir();

Здесь мы поднялись на три уровня вверх. Теперь наш рабочий каталог - C:\Documents and Settings\Андрей. Аналог этой функции - ChDir(). Вы всегда можете проверить свои догадки относительно того пути, куда попадёте, в любом файловом менеджере или в оболочке - в том же Проводнике. Так, например, путь C:\Documents and Settings\Андрей\Мои документы\RAD Studio\Projects\..\..\RAD Studio\ вполне законный и ничем не отличается от других.

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

Функция ExtractFileExt() позволяет извлечь расширение файла. Ext - сокращение от англ. extension - расширение. Обратите внимание, что функция возвращает расширение с первым символом точкой:

Edit1.Text:=ExtractFileExt(Application.ExeName);

Этот код выдаст ".exe".

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

Edit1.Text:=ChangeFileExt(Application.ExeName,'.txt');

В данном случае получим C:\Documents and Settings\Андрей\Мои документы\RAD Studio\Projects\Project1.txt.

Пожалуй, об основных моментах побеседовали. Пока что мы работали только с именами и путями. Теперь перейдём непосредственно к работе с файлами.

Есть ли, с чем работать?

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

Проверка существования файла выполняется функцией FileExists() - "файл существует?". Возвращаемое значение - логическое (Boolean).

if FileExists('new.txt') then
  ShowMessage('Файл существует.')
else
  ShowMessage('Файл отсутствует.');

Путь к файлу может быть как абсолютным (полный путь), так и относительным (от рабочего каталога).

Как видите, всё элементарно. А как узнать, есть ли папка? Да всё то же самое, только вместо File - Directory: DirectoryExists():

if DirectoryExists('Data') then
  ShowMessage('Папка существует.')
else
  ShowMessage('Папки нет.');
Файлы и папки - понятия разные, поэтому и функии для проверки разные. Вполне может существовать папка new.txt и файл Data (без расширения).

О том, что все так любят делать...

Догадались, о чём пойдёт речь? Да-да, именно об удалении. Сломать проще, чем построить. Однако удалять ненужное - благое дело. С удалением всё не так просто, как с проверкой существования. Когда Вы пытаетесь удалить файл, какая-нибудь программа может его использовать. Естественно, файловая система удалить его не позволит.
Чтобы удалить файл, следует воспользоваться функцией DeleteFile(). Параметр - путь к файлу. Функция возвращает True, если файл успешно удалился, и False, если сделать этого не получилось.

if DeleteFile('text.doc') then
  ShowMessage('Файл удален.')
else
  ShowMessage('Не удалось удалить файл.');

Для удаления папок используется функция RemoveDir():

if RemoveDir('Data') then
  ShowMessage('Папка удалена.')
else
  ShowMessage('Не удалось удалить папку.');

Есть и альтернатива - процедура RmDir(), однако об успешности удаления она не сообщает.

О том, как создавать папки

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

Начнём с того, как создавать папки. Здесь всё достаточно просто. Создать папку позволяет функция CreateDir() и процедура MkDir(). Аналогично удалению, первая может сказать о том, получилось ли создать, а вторая лишь молча попробует сделать своё дело.

CreateDir('Documents');

Есть и более интересная модификация - функция ForceDirectories(). Она позволяет создать сразу целую цепочку вложенных друг в друга папок. Например, мы хотим создать папку Files, в ней Documents, а в последней - Срочное. Вариант с использованием MkDir():

MkDir('Files');
MkDir('Files\Documents');
MkDir('Files\Documents\Срочное');

Неудобно, согласитесь? И это только 3 папки. А бывают случаи, когда нужны цепочки и длиннее... Функция ForceDirectories() автоматически создаёт всё недостающее по указанному пути. Одна особенность - функция требует на вход полного (абсолютного) пути. Для нашего примера:

ForceDirectories(GetCurrentDir()+'\Files\Documents\Срочное');
В этом случае получаем C:\Documents and Settings\Андрей\Мои документы\RAD Studio\Projects\Files\Documents\Срочное.

О том, как создавать файлы и работать с их содержимым

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

Под указателем в программирование понимается некоторая ссылка, которая может однозначно привести нас к какому-либо объекту. Указатели бывают разные. Например, указатель на ячейку памяти, в которой хранятся какие-либо данные. В этом случае указатель хранит адрес этой ячейки. Указатели существуют во многих операциях, без них доступ к данным невозможен. В реальной жизни указатель можно сравнить с адресом дома, с номером комнаты. Если нам известно, куда идти, то мы туда придём и сделаем то, что нужно. Если указатель (адрес) потерян, найти место проблематично, а то и вовсе невозможно. При работе с файлами тоже используются своего рода указатели. Дело в том, что работа с файлом делится на несколько этапов. Сначала файл нужно открыть. Без этого нельзя ни прочитать из него данные, ни записать их в него. Когда файл открыт, с его содержимым можно выполнять требуемые действия. По окочании работы файл нужно закрыть. Железное правило: не забывайте закрывать о ткрытые файлы! Весь процесс можно увидеть и в реальной жизни: открыл дверь, зашёл, что-то сделал, вышел, закрыл дверь. Если файл не закрыть, можно его заблокировать: система будет думать, что он занят программой, однако программа уже завершила работу и потеряла указатель на него. Результат: открыть файл уже не получится. Лечится такая ситуация либо перезагрузкой системы, либо использованием специальных программ типа File Unlocker, которые восстанавливают доступ к занятым файлам. А теперь начнём разбираться, как работать с файлами.

1. Объявление указателя.

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

var имя_указателя: File of тип_данных;

В качестве типа данных задаётся тот тип, переменную которого можно считать одной записью в файле. Это означает, что Вы изначально подразумеваете файл разбитым на некоторое количество записей. Именно с каждой такой записью будут выполняться все операции: добавление записи в файл или удаление записи из него. Обычный текстовый файл - это набор байтов: каждый символ кодируется один байтом (не принимая в расчёт файлы, содержащие текст в формате Юникода), поэтому текстовый файл описывается так:

var имя_указателя: File of Byte;

Вместо Byte можно написать Char. С последним работать удобнее, если в файле записан текст. Поскольку чаще всего приходится работать именно с текстовыми файлами, был введён отдельный тип данных - TextFile:

var F: TextFile;

Указатели чаще всего называют буквой F (file).

Итак, указатель есть. Переходим к следующему шагу.

2. Установка связи с файлом.

Этот этап можно сравнить с поиском двери нужного Вам номера. Связь устанавливается процедурой AssignFile():

AssignFile(указатель, 'путь к файлу');

Первый параметр - указатель, который мы объявили в п.1. Путь к файлу может как абсолютным, так и относительным.

После этой операции мы готовы к открытию файла.

3. Открытие файла.

Открытие - не такая простая операция. Она может выполняться в трёх разных режимах.

Rewrite - перезапись файла (в т.ч. создание несуществующего файла). Подразумевает очистку содержимого файла и установку текущей позиции (её тоже называют указателем) в начало файла.

Reset - открытие файла только для чтения. Указатель устанавливается в начало файла.

Append - добавление. Используется для записи данных в конец файла, не затрагивая существующие данные. Указатель ставится в конец.

Что за указатель тут используется? Это не тот, который даёт нам доступ к файлу. Представьте внутреннее содержимое файла как текст. В текстовом редакторе есть курсор, который находится в какой-то конкретной позиции. С файлом то же самое: есть невидимый курсор, посредством которого можно работать с содержимым. Если требуется записать данные в файл, курсор ставится в нужную позицию и далее выполняется запись. Если нужно прочитать - перемещаемся в нужное место и, шаг за шагом, считываем нужные данные. Указатель при этом каждый раз движется вперёд. Рано или поздно он достигнет конца файла.

Функции вроде OpenFile нет - вместо неё есть 3 функции с названиями, приведёнными выше: Rewrite(), Reset(), Append(). Единственный обязательный параметр всех этих функций - указатель на наш файл, причём тот, с помощью которого уже установлена связь с помощью AssignFile().

4. Закрытие файла.

Закрытие выполняется помощью CloseFile() передачей переменной-указателя на файл.

Вот и основные сведения о том, как работать с файлами. При работе следует заботиться обо всём, что может произойти. Так, например, если попытаться открыть файл для чтения функцией Reset(), которого не существует, произойдёт ошибка.

Пример 1. Создадим пустой текстовый файл.

var F: TextFile;
 
AssignFile(F,'new.txt');
Rewrite(F);
CloseFile(F);
Мы объявили переменную F типа "текстовый файл", далее привязали её к файлу new.txt, сделали перезапись файла и закрыли его. В итоге получен пустой файл.

Набор из трёх команд необходимо выполнять при работе с любым файлом.

Чтение и запись

Для чтения и записи существуют процедуры с понятными именами Read() и Write(). Процедуры необычые: у них неограниченное число параметров. У обеих первым параметров передаётся указатель на файл, а дальше - список переменных (или значений), с которыми нужно выполнить данную операцию. Команда Read() читает одну запись из файла и заносит её в переменную, которая указана вторым параметром. При этом указатель сдвигается на одну позицию. Если указать несколько переменных - в них будут считаны значения по порядку. Функция автоматически распознаёт разделители значений - пробелы, что позволяет с лёгкостью считывать несколько значений из файла. Запись работает аналогично: все переданные значения последовательно записываются в файл.

Помните, что пока Вы не закрыли файл, внесённые изменения в нём не сохраняются!

Пример 2. Запись в файл.

var F: TextFile; a,b: Byte;
 
AssignFile(F,'new.txt');
Rewrite(F);
a:=2;
b:=10;
Write(F,'1',a,'3 ',b);
CloseFile(F);

В данном примере показано использование Write(). В результате в файле будет строка "123 10". Были записаны как явно заданные строки, так и значения переменных.

Пример 3. Считывание из файла двух чисел.

var F: TextFile; a,b: Byte;
 
AssignFile(F,'new.txt');
Reset(F);
Read(F,a,b);
CloseFile(F);
 
ShowMessage(IntToStr(a)+' ; '+IntToStr(b));

В данном примере файл открывается для чтения (Reset) и из него считываются записанные там значения в переменные a и b. На экран будет выведено сообщение "123 ; 10".

Процедуры Read() и Write() не проверяют типов данных, которые используются при работе с файлом. Так что можно напрямую записывать числа, не преобразуя их в строки, и обратно из строк в числа при чтении.

Итак, записывать и читать данные научились. Но хватит ли этого для решения любых задач? Нет.

Гораздо чаще требуется работать с файлами построчно, т.е. считывать и записывать целые строки. Реакция функций на пробелы-разделители будет только вставлять палки в колёса. На помощь приходят функции ReadLn() и WriteLn(). Ln - сокращение от line (строка). ReadLn() читает целую строку из файла, а WriteLn() записывает данные и вставляет после них признаки конца текущей строки и начала новой. В остальном работа этих функций точно такая же.

Когда выполняется чтение файла, указазатель ("курсор") перемещается автоматически. Понятно, что в какой-то момент мы придём к концу файла и дальше читать уже будет нечего. Чтобы отследить это состояние, используется функция EOF() - сокращение от end of file (конец файла). Передаём указатель на файл и узнаём, дошли ли до конца. Что может быть проще? Таким образом, чтение файла легко записывается в цикл.

Пример 4. Считывание всего файла в ListBox.

var F: TextFile; S: String;
 
ListBox1.Clear;
AssignFile(F,'new.txt');
Reset(F);
while not EOF(F) do
begin
  ReadLn(F,S);
  ListBox1.Items.Add(S)
end;
CloseFile(F);

Разберём пример построчно:

  • Очищаем ListBox.
  • Связываемся с файлом new.txt.
  • Открываем файл для чтения (указатель в начале файла).
  • До тех пор, пока не дошли до конца файла...
  • ... читаем очередную строку в переменную S...
  • и добавляем эту строку в ListBox.
  • Закрываем файл.

Механизм простой, и, надеюсь понятный.

Пример 5. Сохранение всех строк из поля Memo в текстовый файл.

var F: TextFile; I: Integer;
 
AssignFile(F,'test.txt');
Rewrite(F);
for I := 0 to Memo1.Lines.Count-1 do
  WriteLn(F,Memo1.Lines[I]);
CloseFile(F);
  • Установили связь с файлом.
  • Перезаписали файл.
  • Проходим по всем строкам Memo1...
  • ... и переписываем каждую строку в файл.
  • Закрываем файл.

Считаю необходимым напомнить, что операции сохранения и загрузки из файла в Memo и ListBox предусмотрены. Эквиваленты для данных примеров:

ListBox1.Items.LoadFromFile('new.txt');
Memo1.Lines.SaveToFile('test.txt');

Заключение

Мы рассмотрели работу с файлами и каталогами. Научились работать с путями и именами файлов, а также узнали, как записывать информацию в файлы, и как считывать её оттуда. Конечно, это далеко не всё. Ещё множество вопросов осталось за кадром. Как определить объём файла? Как скопировать, переместить, переименовать файл? Речь об этом пойдёт во второй части данной темы, однако в следующем уроке мы вернёмся к работе с записями.

Домашнее задание

Примерное окно программы (домашнее задание)

Для усвоения пройденного предлагаю создать следующую программу.

На форме два поля для ввода текста. В первое вводится путь к некоторой папке, а во второе - текстовая строка, содержащая символ "*" (звёздочка). Дополнительно (с помощью каких-либо компонентов) вводятся два числа. Требуется в указанной папке создать текстовые файлы с именами из второго поля, заменив звёздочку на числа из заданного диапазона. При этом, если такой файл уже был на диске, нужно дописать в него текущее время, а если его не было - то и дату, и время.

Подсказка: текущее время в виде строки можно получить как TimeToStr(Now), а дату - DateToStr(Now).

Примерный вид окна программы приведён на рисунке справа. Для указанных исходных данных на диске C:\ будут созданы файлы Test1.txt, Test2.txt, ..., Test5.txt.


Оценить данный урок, а также оставить свои комментарии Вы можете, перейдя на сайт. Данный урок на сайте »
 

Статьи

Использование хранилища объектов Delphi

Введение

Начиная делать новую программу, мы обычно не задумываемся над тем, а обязательно ли делать всё в нуля, с самого-самого начала? С большой долей вероятности в каждой программе есть та или иная часть, присутствующая в других, ранее созданных программах. Когда мы пишем заявление или заполняем какую-нибудь бумажную анкету, мы ведь используем не чистый лист бумаги - в нём уже написана или напечатана некоторая заготовка. Встаёт вопрос: а каким образом можно применить это в программировании? Можно ли сократить время на создании стандартных интерфейсов и написании стандартного кода? В данной статье я буду рассматривать работу в Delphi 2009, однако в предыдущих версиях всё, о чём будет идти речь, было сделано практически идентично.

Хранилище объектов в Delphi

Хранилище объектов (Object Repository) появилось в Delphi практически с первых версий. Не замечая того, каждый из нас пользуется им постоянно. Новый проект - это тоже своего рода заготовка. Delphi не заставляет нас писать вручную файл проекта, описывать основную форму и добавлять её в проект. Далее, когда требуется добавить в приложение новую форму, мы тоже берём некий шаблон. Да, это чистая форма без каких-либо компонентов, но ведь её описание тоже состоит из некоторого количества строк. А мы их не пишем. И одновременно с этим создаётся новый модуль примерно такого содержания:

unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm2 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.dfm}
 
end.

Так где же находится это хранилище объектов? А находится оно в меню File - New. Что же это за хранилище такое, ведь там всего несколько пунктов? Ан-нет, имеющиеся в этом подменю пункты - наиболее основные. Они используются очень часто, поэтому и вынесены ближе. Среди них - новое приложение, новая форма, новый модуль и т.п.

Подменю File - New в Delphi

Однако помимо этих пунктов есть и ещё два - Other... (Другое) и Customize (Настроить под себя). Вот они-то нам и нужны. Пункт Other... открывает тот самый Object Repository, а пункт Customize позволит изменить содержимое данного меню.

Окно Object Repository

В заголовке окна - надпись "New Items", хотя и называется это хранилищем объектов. Для чего оно нужно? Всё просто: это набор заготовок самого разного типа и предназначенных для самых разных задач, проще говоря шаблоны. Используются они очень просто: выбираем то, что нужно, и получаем "бланк", который меняем так, как нам угодно. Вспомните, например, сколько раз вам приходилось создавать окно About ("О программе") в своих проектах? А ведь это окно стандартное, типичное для всех приложений. Да и общий вид у него есть, сформировавшийся со временем и привычный для всех пользователей. Вместо того, чтобы каждый раз создавать это окно заново, можно взять готовый шаблон, вписать нужные данные и окошко готово!

Итак, окно состоит из двух частей - слева находится список (дерево) категорий, а справа отображаются объекты, принадлежащие выбранной категории. В более ранних версиях Delphi окно было выполнено в виде вкладок с названиями категорий.

Окно хранилища объектов (Object Repository)

Разработчики поместили в хранилище множество интересных и полезных вещей. Что именно нам доступно, рассмотрим чуть позже.

Использование хранилища очень простое: выбираем желаемый объект, нажимаем OK и он добавляется в текущий проект (если это составная часть проекта - форма, модуль и т.п.), либо создаётся новый проект (например, если это DLL или вообще готовый проект). Добавление некоторых объектов сопровождается предварительной их настройкой - это может быть окно с предложением ввести требуемые данные, либо пошаговый мастер.

Примеры использования

Раз уж мы заговорили об окне About, давайте его и попробуем добавить в наш проект. Итак, выбираем File - New - Other. Нужный нам объект называется About box и располагается в категории Delphi Files:

Delphi Files в Object Repository (объект About box)

После нажатия OK в нашем проекте появилась новая форма с именем AboutBox и несколькими компонентами - текстовыми метками, картинкой и кнопкой. Удобно, не правда ли? Остаётся лишь вписать название программы, версию, вставить нужную иконку и окно полностью готово. Делается буквально за минуту. Создать такое окно вручную несложно, но всё же это займёт больше времени.

Окно About, созданное из заготовки в репозитории

Теперь давайте возьмём что-нибудь более интересное. Например, объект Dual list box. Как следует из названия, это окно с двумя списками. Знакомое окно? Ещё бы, ведь такие используются очень часто. Далеко ходить не надо - окно настроек проекта (Project - Options), раздел Forms. Согласитесь, что размещение такого количества компонент на форме заняло бы гораздо больше времени. Но всё это ещё не всё. В окне About за нас был автоматически создан интерфейс. А в этом примере за нас ещё и код написали! Откройте программный модуль - там не так уж и мало написано. Ну что, а каково писать всё это вручную?

Окно Dual list box из хранилища объектов - удобная и функциональная форма

Выбор способа вставки объекта в проект

При выборе в окне хранилища некоторых объектов (в основном форм) внизу появляется область выбора способа вставки объекта. Имеется 3 разных варианта. По умолчанию выбран вариант Copy. С использованием этого варианта ничего "плохого" сделать не удастся, так что можно безболезненно экспериментировать.

Способ вставки объекта в проект - Copy, Inherit или Use

Итак, разберём, в чём смысл каждого из способов.

Copy (копирование) - стандартный способ вставки, когда имеющийся в хранилище объект просто копируется в ваш проект. Вы можете изменять вставленный объект как угодно, так как эти изменения останутся только в вашем проекте: в хранилище объект нисколько не изменится. Именно поэтому я назвал этот способ безопасным.

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

Use (использование) - способ, при использовании которого в проект вставляется оригинальный объект и все изменения сразу же вносятся в объект хранилища. В пояснениях, думаю, не нуждается.

Физическое расположение хранилища

Понятно, что все объекты хранилища не появляются из ниоткуда, а находятся где-то на диске. Найти это место несложно - это папка ObjRepos в папке, куда установлена сама среда Delphi, т.е. в большинстве случаев это X:\Program Files\CodeGear\RAD Studio\x.0\ObjRepos. Названия файлов в основном соответствуют тем названиям, которые видны в окне File - New - Other. Так что, если вам потребовалось изменить какой-нибудь объект, следует найти нужный файл и внести в него изменения.

Содержимое хранилища

Теперь давайте кратко пробежимся по хранилищу и посмотрим, что есть у нас в арсенале. Рассмотрение будет идти по категориям.

Delphi Projects:

Console Application - консольное приложение, т.е. приложение без форм.

Control Panel Application - приложение для "Панели управления" Windows (т.н. апплет).

DLL Wizard - заготовка DLL-библиотеки.

MDI Application - приложение с многооконным интерфейсом, т.е. для одновременного редактирования сразу нескольких документов. Выполнено в виде текстового редактора. Запрограммированы функции создания нового документа и открытия существующего.

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

Resource DLL Wizard - пошаговый мастер по созданию DLL-библиотек, используемых в нескольких проектах.

SDI Application - программа с единственным окном редактирования документа. Создано аналогично MDI Application - в виде текстового редактора.

Service Application - сервисное приложение, т.е. дополнительная служба для операционной системы.

VCL Forms Application - стандартное VCL-приложение, которое мы в основном и используем.

ActiveX - основные элементы для разработки собственных компонент, дополнений и библиотек типов.

Delphi Files:

About box - информационное окно "О программе".

Component - новый компонент на базе какого-либо из существующих.

Control Panel Module - модуль для Control Panel Application.

Data Module - модуль данных, на котором размещают компоненты, отвечающие за работу с базами данных.

Dialog with Help (Horizontal) и Dialog with Help (Vertical) - стандартные диалоговые окна с кнопками "OK", "Cancel" и "Help". Отличаются расположением кнопок - снизу по горизонтали или справа по вертикали.

Dual list box - окно с двумя списками (ListBox) и возможностью выбора требуемых элементов из списка.

Form - стандартная пустая форма.

Frame - форма-фрейм, которая может отображаться внутри другой формы. Чтобы вставить имеющийся фрейм на форму, используется кнопка Frames на вкладке Standard палитры компонент.

Password Dialog - диалог ввода пароля.

Reconcile Error Dialog - используется в приложениях баз данных для пояснения обнаруженной ошибки при изменении таблицы.

Standard Dialog - классический диалог с кнопками "OK" и "Cancel".

Tabbed Pages - диалоговое окно с несколькими вкладками и кнопками "OK", "Cancel" и "Help".

Thread Object - модуль с объектом "поток" (TThread).

Unit - заготовка для нового программного модуля.

Inheritable Items - формы, которые добавляются в проект наследованием (описание этого способа внедрения см. выше).

VCL for the Web - основные элементы для создания Web-приложений.

Wizards - различные мастера-помощники по созданию каких-либо объектов.

Other Files:

Code Template - шаблон для быстрой вставки в программный код (пишется как XML).

Project Group - группа проектов. Является удобным средством для работы сразу с несколькими проектами, а также может существенно облегчить параллельную разработку программ и DLL-библиотек.

Text - простой текстовый файл.

Unit Test - средства для тестирования имеющихся модулей и проектов и разделения готовых (Release) и разрабатываемых (Debug) версий.

Web Documents - основные форматы файлов, используемые в Web.

Расширение хранилища

Надеюсь, вы уже оценили полезность Object Repository. Нужно поговорить теперь и о том, как можно добавить в этот каталог что-то новое. На самом деле, добавление происходит очень легко и выполняется за несколько секунд. Однако, разработав что-то полезное (в первую очередь для себя) и добавив это в хранилище, можно впоследствии радоваться всю жизнь :-)

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

За основу возьмём Password Dialog. Открыв модуль, видим, что ни одной дополнительной строки кода там нет. Что ж, сделаем сами.

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

procedure TPasswordDlg.OKBtnClick(Sender: TObject);
begin
  if Length(Trim(LoginEdit.Text)) = 0 then
  begin
    MessageDlg('Вы не ввели логин.',mtError,[mbOk],0);
    Exit
  end;
  if Length(Trim(Password1Edit.Text)) = 0 then
  begin
    MessageDlg('Вы не ввели пароль.',mtError,[mbOk],0);
    Exit
  end;
  if Length(Trim(Password2Edit.Text)) = 0 then
  begin
    MessageDlg('Вы не ввели подтверждение пароля.',mtError,[mbOk],0);
    Exit
  end;
  if Password1Edit.Text <> Password2Edit.Text then
  begin
    MessageDlg('Пароль и его подтверждение не совпадают.',mtError,[mbOk],0);
    Exit
  end;
end;

Новая форма для регистрации пользователей

После того, как всё завершено, сохраняем полученную форму.

Теперь нужно добавить наше творение в репозиторий. Для этого в контекстном меню нашей формы выбираем пункт Add to Repository. В появившемся окне нужно ввести название добавляемого объекта, его описание, имя автора. Также можно выбрать иконку, которая будет отображаться в окне возле названия объекта. Объект будет помещён в ту категорию, которая выбрана в дерева слева. Можно создать и новую категорию кнопкой New Category.

Окно добавления созданной формы в хранилище объектов (Add to Repository)

После этого в окне хранилища появится созданная нами форма.

Созданная форма в списке (категория Delphi Files)

Если нужно добавить не отдельную форму, а весь проект, то следует выбрать пункт меню Project - Add to Repository. Появится аналогичное окно, которое точно так же заполняется.

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

Редактор Object Repository

Для редактирования имеющихся объектов существует простой редактор, который вызывается командой Tools - Repository. В этом окне можно удалить или изменить существующие объекты.

Заключение

Хранилище объектов - простое в плане понимания и использования, но в то же время очень удобное средство для разработки приложений. Особенно удобно то, что в хранилище можно добавить свои собственные разработки, а также отредактировать существующие. В данной статье были освящены все основные приёмы работы с Object Repository, а также был приведён краткий обзор тех объектов, которые уже имеются в стандартной поставке Dephi. Успехов в программировании!


Оценить данную статью, а также оставить свои комментарии Вы можете на нашем сайте. Перейти на страницу со статьёй »
 

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

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

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

Название
Описание
Раздел
Объём
Ссылки
Domestic library of the programmer
Это бесплатная библиотека компонентов, которая изначально ориентирована на среду разработки Delphi и операционную систему Windows XP. Основные её задачи - это решение самых трудоемких аспектов программирования. В состав библиотеки вошли следующие компоненты: TdpPipetteShape, TdpChoiceSpectr, TdpGradSpectr, TdpColorSpectr, TdpPipette, TdpTrayIcon, TdpTrayIconList, TdpCoolTrayIcon, TdpCoolTrayIconList. Компоненты TdpTrayIcon-TdpCoolTrayIconList дают программисту очень много возможностей: от получения координат значка до обработки всех событий мыши. Компоненты TdpPipetteShape-TdpPipette помугут создать свой спектроскоп, не хуже чем у профессиональных программ. Совместимость: Delphi 7, 10, 11. Также внутри архива имеется справка в формате CHM и несколько примеров-исходников.
138 Кб
TGIFImage
Обновлённая версия компонента TGIFImage, адаптированная для работы в Delphi 7, Delphi 2005, Delphi 2006. Имеется поддержка не только статических, но и анимированных изображений. Создан для использования в VCL-приложениях на платформе Win32. Работа в приложениях .NET не обеспечивается.
199 Кб
TViorProtect

Компонент предназначен для защиты от несанкционированного копирования программ, написанных на Delphi.

311 Кб


Delphi 5. Руководство разработчика
Книга Стива Тейксейра и Ксавье Пачеко. Полная версия, вместе с файлами и исходниками.

11.14 Мб

ProcView
Программа является средством управления процессами, библиотеками и окнами в Windows 2000, XP, Vista. Позволяет записывать блоки данных напрямую в адресное пространство процесса, что очень часто используется для взлома игр. Умеет скидывать блоки памяти, используемые процессом в файл (например: из зависшей проги можно выдернуть данные). Отображает список библиотек, загруженных процессом в память. Осуществляет поиск набора байт в памяти по разным алгоритмам. Замораживает значения в определенных ячейках памяти.

1.29 Мб

Программа на WinAPI
Простейший пример программы, в которой не используется VCL. Создание окна, кнопки и лейбла на нём.

1 Кб

 
Представлено файлов: 6  
13.08 Мб
 
 

Юмор

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

Расшифровка смайликов

Основные смайлики:

:-) Ваша оcновная улыбка.
;-) Улыбка c подмигиванием.
:-( Хмуpая физиономия.
:-I Индиффеpентная физиономия.
:-> Саpкаcтичеcкая физиономия.
>:-> Саpкаcтичеcкая физиономия c дьявольcким оттенком.
>;-> То же плюc подмигивание..

Изменения pта:

:-[ Вампиp.
:-E Клыкаcтый вампиp.
:-F Он же c обломанным клыком.
:-7 Кpивая улыбка.
:-* Угpюмый.
:-@ Оpущий.
:-# Носящий скобки
:-& Лишившийcя даpа pечи; cмутившийcя; коcноязычный.
:-Q Куpящий.
:-? Куpящий тpубку.
:-P Выcовывающий язык.
:-S Hепоcледовательный, беccвязный.
:-D Гpомко pжущий.
:-X Рот на замке.
:-C Лодыpь.
:-/ Скептик.
:-o Ох-ох.
:-9 Облизывающий губы.
:-0 Hе оpи! Также оpатоp.
:-“ Сплевывающий (табак).
:-1 Normal.
:-! Normal.
:-$ Рот cкpеплен пpоволокой?
:-% Банкиp.
:-q Пытающийcя доcтать языком до ноcа.
:-a Тоже cамое, но c дpугой cтоpоны.
:-e Разочаpованный.
:-t Злой, pаздpаженный.
:-i Полуулыбка.
:-] Болван.
:-[ Hеулыбающийcя болван.
:-} Потpеcкавшиеcя губы или ухмылка (боpода?)
:-{ Уcатый.
:-j Левая улыбка.
:-d Левая улыбка насмешка над читающим.
:-k Это меня убивает.
:- Hеpешившийcя.
:-| Дежурная улыбка.
:-< Печальный.
:-x Рот на замке.
:-c Ленивая.
:-v Говоpящая голова?
:-b Выcунувший язык.

Изменения ноcа:

:*) Пьяный.
:^) Со cломанным ноcом.
:v) То же, но в дpугую cтоpону.
:_) Hоc cоcкользнул c его/ее лица.
:<) From an Ivy League school.
:=) Два ноcа.
:o) Клоун.
:u) Забавно выглядящий ноc (left).
:n) Забавно выглядящий ноc (right).

Изменения в глазах:

%-) Очень долго таpащившийcя на экpан.
8-) Hоcящий cолнечные очки.
B-) Hоcящий очки (could be horn-rims).
O-) Циклоп или одевший маcку для ныpяния.
.-) Одноглазый.
,-) Подмигивающий одноглазый.
g-) Hоcящий пенcне (монокль?)

Изменения более чем в одном cимволе:

|-I Спящий.
|-O Зевающий.
%-6 Мозги cпеклиcь.
|^o Хpапящий?
:,( Плачущий, но без ноcа.
8-| Вcтpевоженный.

Добавление cимволов:

::-) Hоcящий очки (четыpехглазый).
B:-) Очки подняты на голову.
8:-) Маленькая девочка.
:-)-8 Взpоcлая девочка.
:-{) Уcатый.
:-#) Куcтиcтые уcы.
{:-) Hоcящий паpик.
}:-) Парик дыбом.
:-)~ Валяющий дуpака.
:-~) Замерзший.
:“-) Плачущий от cчаcтья.
=:-) Гладкоголовый.
-:-) Панк.
+-:-) Папа Римcкий.
“:-) Голова выбpита c одной cтоpоны.
,:-) То же c дpугой cтоpоны.
O :-) Ангел.
C=:-) Шеф.
*<:-) В шапочке Санта Клауcа.
E-:-) Ham radio operator.
8 :-) Колдун.
:-) Hоcящий тюpбан.
[:-) В наушниках.
:-)) Двойной подбоpодок.
>:-) Дьявол.
(:-) Большая улыбка.
+:-) Священник.
:-)X Hоcящий галcтук-бант.

Смешанные:

(-: Left handed.
[:] Robot.
:-{} Кpаcящяя губы.
:“-( Плачущий.
<|-) Китаец.
<|-( Hе понимающий таких шуток китаец.
-:-( Hеулыбающийcя панк.
= За ядернаую войну.
(8-o Mr. Bill. (From original Saturday Night Live)
*:o) Клоун Bozo.
3:] Ласковая улыбка.
3:[ Средне ласковая.
d8= Бородач с темными очками и жесткой шляпой.
(:I Яйцеголовый.
<:-I Тупица.
K:P Ребенок с вертящейся башкой.
:-: Мутант.

Hевидимка:

X-( Меpтвый.
[] Кpепкие объятия.
~~:-( Вcпыливший; покpаcневший.
O |-) Религиозный.
8 :-I Волшебник Unixа.
>:-I Путешествующий.
3:o[ Клоун.
8 Беcконечноcть.

Миниатюpы

:) Standard.
:] Веселый.
:@ Вопящий.
:D Ржущий.
:I Думающий.
:( Опечаленный.
:[ Лодырь.
:O Гpомко говоpящий.
:Q Куpящий.

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

:))

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




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


В избранное