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

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

  Все выпуски  

Программирование на DELPHI в вопросах и ответах #14


Информационный Канал Subscribe.Ru

Программирование на Delphi
Программирование на Delphi. Выпуск №14 от 05.01.05.


Добрый день, уважаемые читатели!

1. Публикация всего вопроса, перед ответами на него, вместо основной темы, - для лучшего понимания...

Согласен, будет лучше и легче. [Feniks].

По-моему сразу писать весь вопрос целиком не стоит. Предлагаю сделать выбор пользователю: если он пожелает поподробнее узнать о вопросе, то сделать для него соответствующую ссылку или всплывающее hint сообщение. [fil].

Действительно, если вы забыли вопрос, откройте предыдущие выпуски рассылки (или спец-выпуски - так гораздо удобнее) или загляните на наш сайт, где есть все вопросы и ответы. В связи с этим публикация вопроса полностью отменяется. Тема закрыта.

2. Открытие раздела, в котором содержатся ссылки на документацию по Delphi...

В принципе, раздел открыть можно - он поможет опытным программистам. Рассылка то задумывалась как помощь начинающим, так что личный ответ человека, а не набор найденных статей и кусков кода компьютером я считаю как лучшую помощь "чайникам". [fil].

Думается, что ответы, состоящие из кусков документации или статей тоже имеют полное право на жизнь, потому что их сначала надо найти, а потом - не полениться донести до вопрошающего! Это правильно (далеко не все знают где что можно прочитать)! Мало бы кому хотелось бы получить ответ на простой вопрос в виде ссылки на длинную статью, в которой ответ надо еще найти (или понять)... Ведь, если немного вдуматься, то получается, что бОльшая часть ответов - собственная интерпретация прочитанного, увиденного или услышанного. А на счет ссылок, это - обязательно (помимо авторства, что немаловажно!), потому, как одного куска, обычно, для понятия всего механизма решения вопроса, недостаточно, а умный человек всегда постарается постичь, то что ему нужно (хотя здесь сам себя поправлю - иногда достаточно просто идеи). [Андрей Лучников].

Это точно. открыть такое крайне необходимо. Хотя ... других "программистов" тоже понять можно. Зачем гдето рыться, если можно спросить. Во всяком случае такого народа, и даже не среди программистов уж очень много, отвыкли оне думать головой. Ну сделаете вы такой раздел, с уймой ссылок и очень хороший, заходит туда юзверь и ищет ответ на вопрос "как мне создать картинку при загрузке программы...". Ну нет там такого, а есть "Создание всплывающего логотипа при загрузке приложения". Результат - вопрос в форум, быстрый ответ админа, мысли админа о том самом кролике, юзвере и его матери... тогда и прийдется интеллектуальный поиск к этому разделу прикручивать. И встанет вопрос - а спать я когда буду ? За любые добрые дела надо расплачиваться... [Звягинцев Павел].

В догонку к предыдущему письму. Сижу во многих технических рассылках, так там ситуация та-же. Бороться бесполезно. В КАЖДОЙ рассылке есть вопрос "меня выкидывает из интернета и через минуту комп перегружается" и в каждой второй"какие дне дрова поставить, чтобы мой сидюк начал читать ДВД". Уж и ругались, и в архив отсылали, и к первоисточнику (органу от которого этот юзер произошел), бесполезно ... :((( Естественно на такие вопросы не то что отвечать не хочется, оне вызывают раздражение. А что делать - неизвестно. [Звягинцев Павел].

Да!!! [Vasiliy Gorshkov].

Я бы хотел чтобы в этом разделе были не только ссылки по Delphi но и по OpenGL, WinAPI, DX и т.д. и т.п.(а они бывают и на Си). [Рудов Антон].

Да будем….!!!!!! [Шишкин Максим].

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

Наш конкурс продолжается! Напомню вкратце его правила. Найдите на нашем сайте на одной из страниц секретный текст и расшифруйте его. Зашифрован он был без каких-либо программ. Затем пришлите его нам по этой ссылке. Первые 10 правильно ответивших читателей получат на свой счёт 25 баллов, а в конце февраля читатель, набравший наибольшее количество баллов, получит в подарок CD! Желаю удачи!

Top-3 (читатели, лидирующие по кол-ву баллов).

1.
63 балла
2.
43 балла
3.
38 баллов

Правила нашей рассылки:
1. Не присылайте ответов на вопросы вроде "да я не знаю" или "да/нет". Такие ответы не публикуются.
2. Вопросы, не касающиеся Delphi, не принимаются (для этого существуют другие рассылки).
3. Запрещено присылать вложенные файлы, размером более 100 Кб, без предварительной связи с администратором.
4. Не изменяйте тем присылаемых писем. Письма с "неправильными" темами не публикуются!


Новые вопросы.

41. Как в Popupmenu напротив пункта поместить иконку? [Ответить].

42. Здравствуйте, Как мне можно определить MAC - адрес компа? Можно ли найти его по IP-адресу? Или наоборот, по MAC - адресу - IP-адрес? Спасибо. [Ответить].

43. Подскажите как мне написать прогу - генератор паролей, только чтобы там можно было указывать самому из каких символов генерировать пароль. Или подскажите где найти исходник такой проги. [Ответить].

 


Ответы на вопросы.

4. (Изменение параметров экрана). [Отвечает: Садовников Владимир]: Есть очень хорошая функция - EnumDisplaySettings(DeviceName,ModeNum,DevMode). Первый параметр - имя устройства. Если монитор один - смело ставь nil. ModeNum - номер режима (можешь менять от 0 до тех пор, пока функция не вернёт False). DevMode - структура типа TDevMode. В неё запихивается всё - и разрешение экрана, и количество бит на точку, и частота. Чтобы узнать текущий режим работы монитора, в качестве ModeNum передай значение $ffffffff - и вернётся текущий режим. Чтобы получить все доступные режимы - можешь написать следующее (будут выведены все доступные режимы): procedure TForm1.FormCreate(Sender: TObject);
var
I:LongWord;
Modes:array[0..255] of TDevMode;
begin
ListBox1.Items.Clear;
I:=0;
while (EnumDisplaySettings(nil,I,Modes[I])) do
begin
ListBox1.Items.Add(Format('%4d x %4d x %2d x %3dHz',
[Modes[I].dmPelsWidth,
Modes[I].dmPelsHeight,
Modes[I].dmBitsPerPel,
Modes[I].dmDisplayFrequency]));
Inc(I);
end;
ListBox1.Items.Add('Current Mode:');
if (EnumDisplaySettings(nil,$ffffffff,Modes[255])) then
begin
ListBox1.Items.Add(Format('%4d x %4d x %2d x %3dHz',
[Modes[255].dmPelsWidth,
Modes[255].dmPelsHeight,
Modes[255].dmBitsPerPel,
Modes[255].dmDisplayFrequency]));
end;
end;Чтобы установить определённый режим, используй ChangeDisplaySettings, например: ChangeDisplaySettings(Modes[255],CDS_UPDATEREGISTRY) установит тот режим, который был перед запуском программы.

5. (Программы в стиле Windows XP). [Отвечает: Vasiliy Gorshkov]: Используй компонент XPManifest.

11. (Иконка программы в System Tray). [Отвечает: Vasiliy Gorshkov]: Я использовал компонент RXTrayIcon. Небольшой пример: procedure TForm1.FormCreate(Sender: TObject);
var checkevent:TEvent;
begin
checkevent:=tevent.create(nil,false,true,'MYPROGRAM_CHECKEXIST');
IF checkevent.WaitFor(10)<>wrSignaled then begin
Halt;
end;
end;

33. (Отслеживание событий изменения дисплея). [Отвечает: Feniks]: В Винде предусмотрено сообщение WM_DISPLAYCHANGE. Это сообщение Винда отправляет всем окнам и прогам, если изменилось: 1. частота обновления; 2. разрешение экрана; 3. количество цветов; Так написана в хелпе, но там не указано, что оно срабатывает при изменении частоты, а только при изменении разрешения и количество цветов. Хотя у меня срабатывает по всем трем условиям на Вин ХР. Есть еще одно сообщение WM_DEVMODECHANGE. Но я не знаю зачем оно, в хелпе что-то сказано о смене устройств и изменений в файле win.ini и сообщений WM_WININICHANGE и WM_SETTINGCHANGE. ИМХО, тебе все-таки нужно ловить и обрабатывать WM_DISPLAYCHANGE. Так что пробуй. Вот пример перехвата сообщений:type
TForm1 = class(TForm)
Memo1: TMemo;
private
{ Private declarations }
procedure WMDEVMODECHANGE(var Msg : TWMDEVMODECHANGE); message WM_DEVMODECHANGE;
procedure WMDISPLAYCHANGE(var Msg : TWMDISPLAYCHANGE); message WM_DISPLAYCHANGE;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMDEVMODECHANGE(var Msg : TWMDEVMODECHANGE);
begin
inherited;

Memo1.Lines.Add(DateTimeToStr(Now)+' - получено WM_DEVMODECHANGE');
end;

procedure TForm1.WMDISPLAYCHANGE(var Msg : TWMDISPLAYCHANGE);
begin
inherited;

Memo1.Lines.Add(DateTimeToStr(Now)+' - получено WM_DISPLAYCHANGE');
end;

end.


Вы также можете ответить на предыдущие вопросы. Поскольку на них уже ответили как минимум раз, они больше не публикуются в рассылке. Но если вы можете что-то добавить к ответам других, пожалуйста, отвечайте - ответы будут опубликованы. Найти предыдущие вопросы вы можете на нашем сайте: http://www.delphi-faq.fatal.ru/ или в спец-выпусках рассылки.


Статья по Delphi.

Написание инсталлятора на Delphi (Часть 7).

Создание группы программ

Менеджер программ (Program Manager) знаком многим из тех, кто работал в Windows ещё в незапамятные времена. Сейчас, когда в Windows появился Проводник, менеджер программ ушёл на второй план и исользуется сейчас, в основном, с одной-единственной целью — создавать группы программ во время инсталляции. :)

Менеджер программ может быть сервером DDE-соединения. Если вы ничего не знаете о DDE — не беспокойтесь: всё, что нам потребуется, вы прочитаете в этой статье ниже.

Для работы с DDE-серверами мы будем использовать компонент DdeClientConv, который находится на закладке System панели компонентов.

Что такое DDE? DDE (Dynamic Data Excahnge) — это устаревшая технология, которая использовалась давным давно для передачи данных между программами (сейчас для этих целей используется OLE). Передача данных в DDE производится через соединения. Программа-клиент устанавливает соединение с программой-сервером, передаёт/принимает данные и разрывает соединение.

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

Менеджер программ — простая и маленькая программа, поэтому имя сервиса у неё совпадает с именем сервера. Поместим на форму компонент DdeClientConv и настроим его в инспекторе объектов.

Свойства DDEService и DDETopic должны быть установлены в PROGMAN. Свойство ConnectionMode переключите в ddeManual —устанавливать и разрывать соединение мы будем вручную. Почему? Одним из правил, которых я придерживаюсь, является правило не кушать ресурсы без необходимости. Я создаю объекты в программах сразу перед тем, как они мне понадобятся; выделяю память непосредственно перед операторами, её использующими; и открываю файл, только тогда, когда уже готов его читать. Зачастую. :) Именно поэтому открывать соединение с менеджером программ я предлагаю только тогда, когда вся остальная работа уже выполнена.

Хорошо. Будем считать, это было лирическое отступление и вернёмся к нашим баранам. Может оказаться, что у нас под рукой нет подходящей формы для того, чтобы поместить на неё DdeClientConv. В этом случае можно создавать компонент DdeClientConv вручную: var
DdeClientConv: TDdeClientConv;
begin
DdeClientConv := TDdeClientConv.Create(nil);
with DdeClientConv do
begin
ConnectMode := ddeManual;
DDEService := 'PROGMAN';
DDETopic := 'PROGMAN';
. . .
Free;
end;
end;

Перед тем, как что-то сделать с сервером, вы должны вызвать метод OpenLink (установить соединение), а после работы — CloseLink (соответственно, разорвать).

Помимо приёма и передачи данных, DDE-сервер может выполнять команды клиента. Всё очень просто: мы передаём серверу строку, говорим, что это команда — и он её исполняет.

Методы ExecuteMacro или ExecuteMacroLines компонента DdeClientConv передают серверу команду (и команды, соответственно) для выполнения. Команды менеджера программ заключаются в квадратные скобки, и выглядят приблизительно так: [CreateGroup("SomeTools",0)] [ShowGroup("Стандартные")] [AddItem("c:\windows\notepad.exe")].

Эти команды мы подробнее рассмотрим ниже, а перед этим остановимся ещё на одном важном моменте работы с менеджером программ — получении информации о текущем состоянии дел. Что нас может интересовать? Какие группы уже созданы, какие элементы находятся в этих группах...

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

Пример показывает, как можно прочитать список групп из менеджера программ: var
GroupList: TStringList;
begin
GroupList := TStringList.Create;
. . .
GroupList.Text := String(DdeClientConv.RequestData('Groups'));
. . .
GroupList.Free;
end;
После выполнения этой строчки, в GroupList появится список доступных групп.

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

Прочитав список групп, мы можем прочитать содержимое любой группы из этого списка (например, первой): var
GroupList: TStringList;
ItemList: TStringList;
begin
GroupList := TStringList.Create;
ItemList := TStringList.Create;
. . .
GroupList.Text := String(DdeClientConv.RequestData('Groups'));
ItemList.Text := String(DdeClientConv.RequestData(PChar(GroupList[0])));
. . .
ItemList.Free;
GroupList.Free;
end;

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

Вот содержимое группы Стандартные: "Стандартные",C:\WINDOWS\ГЛАВНО~1\ ПРОГРА~1\СТАНДА~1,7,1
"Таблица символов","C:\WINDOWS\CHARMAP.EXE",, C:\WINDOWS\CHARMAP.EXE,416,32,0,0,0
"Текстовый редактор WordPad","C:\PROGRA~1\ACCESS~1\WORDPAD.EXE",, C:\PROGRA~1\ACCESS~1\WORDPAD.EXE,352,32,0,0,0
"Просмотр рисунков","C:\WINDOWS\WANGIMG.EXE",, C:\WINDOWS\WANGIMG.EXE,288,32,0,0,0
"Калькулятор","C:\WINDOWS\CALC.EXE",, C:\WINDOWS\CALC.EXE,224,32,0,0,0
"Графический редактор Paint","C:\PROGRA~1\ ACCESS~1\MSPAINT.EXE",, C:\PROGRA~1\ACCESS~1\MSPAINT.EXE,160,32,0,0,0
"Интерактивная регистрация","C:\WINDOWS\ SYSTEM\REGWIZ.EXE /i software\microsoft\windows\currentversion",, C:\WINDOWS\SYSTEM\REGWIZ.EXE,96,32,0,0,0
"Блокнот","C:\WINDOWS\NOTEPAD.EXE",, C:\WINDOWS\NOTEPAD.EXE,32,32,0,0,0

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

Далее я опишу способ создать группу и элемент в группе. var
Commands: TStringList;
begin
. . .
Commands := TStringList.Create;
Commands.Add('[CreateGroup("Нестандартные",0)]');
Commands.Add('[ShowGroup("Нестандартные",1,0)]');
Commands.Add('[AddItem("c:\windows\notepad.exe","Блокнот")]');
DdeClientConv.ExecuteMacroLines(Commands, False);
Commands.Free;
. . .
end;
В приведённом примере мы создаём группу Нестандартные (в пику группе Стандартные). Далее, мы показываем её (без этого добавление элемента не будет работать — ох, как я с этим намучился в своё время!). Наконец, добавляем Блокнот в эту группу, присваивая ему имя "Блокнот" (оригинально, не правда ли?). Важным здесь является то, что, во-первых, команды менеджеру программ заключаются в квадратные скобки, и, во-вторых, параметры команды, содержащие пробелы и прочие нестандартные символы, заключаются в кавычки. Ну, и, если вы вызываете несколько команд сразу, пользуйтесь методом ExecuteMacroLines вместо нескольких вызовов ExecuteMacro.

Полный список команд плюс описание вы найдёте в файле win32.hlp. Здесь я приведу только их список, чтобы вы знали, что искать: CreateGroup, ShowGroup, DeleteGroup, Reload, AddItem, ReplaceItem, DeleteItem и ExitProgman.

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


Для завершения создания инсталлятора вам нужно будет прочитать 2 оставшиеся статьи. Если вы всё делаете так, как описано в статьях, то смело продолжайте, а мы в конце оценим ваш труд! Когда доделаете свой инсталлятор, то пришлёте его нам, а мы оценим ваши труды и прибавим на ваш счёт значительное количество баллов!

Присылайте свои статьи по адресу delphi-faq@list.ru с темой 'Clause' (без кавычек), и они будут опубликованы в ближайших выпусках рассылки. Большая просьба: статью оформляйте в -txt или -doc формате и используйте -zip или -rar сжатие (без самораспаковки).


Кладовая.

Итак, отныне данный раздел будет присутствовать в рассылке. Также он открыт и на сайте. Здесь могут находиться практически любые файлы, тем или иным образом, связанные с Delphi. Это могут компоненты, исходники программ, различные plug-in'ы для Delphi и всё, всё, всё... Если вам есть, что добавить сюда, - пишите, щёлкнув по этой ссылке. Только большая просьба: не присылайте файлы сразу! Итак, что же сегодня новенького?

Компоненты:

Gradient - Градиент, предоставляющий большие возможности: несколько десятков вариантов перетекания, эффекты, превращения и всё всё всё, чтобы сделать красивую программу.
[Скачать. Размер: 18.7 Кб, ZIP].

StatusBar Pro - Строка состояния с дополнительными возможностями изменения внешнего вида.
[Скачать. Размер: 11.7 Кб, ZIP].

Исходники программ:

Transliterator - Транслитератор текста из русского в английский.
[Скачать. Размер: 4.39 Кб, ZIP].

 


Друзья.

Здесь представлены ссылки на дружественные сайты нашего портала. Если вы тоже хотите стать нашим другом, разместите баннер на главной странице своего сайта. Подробнее о том, как стать другом, можно прочитать здесь: http://www.delphi-faq.fatal.ru/banner.htm, а узнать о всех наших друзьях - на странице http://www.delphi-faq.fatal.ru/friends.htm

http://infomania2004.webhost.ru/ - Этот сайт создан для того, чтобы вы могли получить интересующую вас информацию с минимальными затратами сил и времени. Если вы не нашли здесь нужной информации, вы можете оставить заявку на ее поиск. Как только информация будет найдена, она появится на сайте, а вам сообщат об этом.
http://www.basic.webhost.ru/ - Программирование на языках Basic и Visial Basic. На сайте Вы найдете версии Бейсик, игры, вопросы и ответы, статьи, а также многое другое...
http://www.sashook.nm.ru/ - Игры, флешки, обои, компьютерные приколы.
http://www.dcar.nm.ru - У Вас есть компьютер подключённый к интернет? Тогда у Вас есть всё, чтобы делать деньги прямо сейчас. Создайте свою собственную денежную машину.
http://www.x-program.narod.ru/
- На этом сайте Вы найдёте некоторые наши программы. Также мы занимаемся создание ПО для любой версии ОС Windows под заказ.


Юмор.

Не ругайте Господа нашего. Представьте сеть, в которой 6 миллиардов юзеров. А каково там быть сисадмином?!

- Чем хакер отличается от юзера?
- Хакер со второго раза подбирает пароль, а юзер с десятого набирает.

60-ые: Sex & Drugs & Rock'n'Roll.
90-ые: Suxx & Bugs & Plug'n'Play.

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

На Новый Год все одели разные маски: кто зайчика, кто лисичку: И только сисадмин одел свою любимую: 255.255.255.0.


Присылайте свои "компьютерные" анекдоты по этой ссылке: delphi-faq@list.ru и они обязательно будут опубликованы!

Товарищи программисты! Проявляйте свою активность. Давайте помогать друг другу!
Если вы не нашли ответа на свой вопрос, не отчаивайтесь! Ведь количество подписчиков постоянно растёт и, наверняка, найдётся тот человек, который поможет вам!
На сегодня всё. До встречи через неделю!

Сайт рассылки: http://www.delphi-faq.fatal.ru E-mail: Delphi-FAQ@list.ru Рассылка: http://subscribe.ru/catalog/comp.soft.prog.delphifaq


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphifaq
Отписаться

В избранное