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

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

  Все выпуски  

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


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

Программирование на DELPHI
Выпуск #36 (27 ноября 2005 г.) 

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

Новости сайта
Система "Эксперт"
Вопросы и Ответы

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



Связь:

Администратор
Система "Эксперт"
Информация


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

1) Спасибо всем тем, кто поздравил проект с годовщиной! Очень приятно!

2) Всё-таки, нехорошо получается, что оценивать ответы приходится мне и моим коллегам... По идее, оценивать ответы должен сам автор вопроса. Давайте подискутируем на эту тему.

Кто, по Вашему мнению, должен оценивать ответы экспертов?

Ведущий рассылки   Автор вопроса   Мне без разницы

Предлагаю Вам проголосовать. Особенно хочется узнать ваши мнения, как можно реализовать такую систему, чтобы ответы оценивал автор вопроса? Если у Вас есть идеи, поделитесь ими. Ведь автор вопроса иногда не может оценить ответы за 1 день, например, - могут быть технические причины или просто занятость. А оставлять экспертов без оценок нельзя - это основа всей системы "Эксперт". Жду Ваших мыслей.

3) На нашем сайте появилась web-форма отправки ответов на вопросы! C её помощью Вам не нужно отправлять письмо - достаточно ввести необходимые данные и нажать на кнопку. Как воспользоваться этой формой:

1. Откройте страницу http://www.delphi.int.ru/modules.php?name=webform&action=answer.
2. Проверьте, авторизированы ли Вы на портале. Для этого обратите внимание на самый верх страницы. Если Вы авторизированы, то там будет отображена служебная информация для Вашего аккаунта. Если авторизация не выполнена - там будут два текстовых поля с просьбой ввести адрес e-mail и пароль. В этом случае авторизируйтесь. Если Вы ещё не зарегистрировались на портале, сделать это можно здесь. Обратите внимание: адрес e-mail, под которым Вы авторизируетесь и адрес, с которого Вы ранее отправляли ответы на вопросы в рассылку, должен быть один и тот же адрес, иначе автоматически будет создан новый пользователь и начисление баллов пойдёт с нуля. Отправить ответ на вопрос с помощью web-формы без авторизации нельзя!
3. Введите номер вопроса, на который Вы хотите ответить.
4. Введите текст Вашего ответа. Если Вы уже достигли статуса Специалист, то можете в тексте ответа использовать html-теги для изменения визуального оформления текста ответа. Если этого статуса Вы ещё не достигли, html-теги будут вырезаны из Вашего ответа.
5. Если требуется, в поле "Приложение" введите или скопируйте дополнительную информацию.
6. В зависимости от Вашего статуса (т.е. количества баллов) Вы можете прикреплять к своим ответам файлы объёмом от 250 Кб до 1 Мб. Подробнее об этом в таблице "Статусы экспертов и их возможности".
7. Нажмите кнопку "Отправить ответ" и дождитесь полной загрузки страницы. Если к своему ответу Вы прикрепляете файл, то страница будет загружаться дольше, т.к. файл отправляется на сервер.

Данная форма пока что введена в тестовый режим. Если Вы заметили ошибки в её работе, пожалуйста, сообщите об этом на admin@delphi.int.ru.

4) Изменено оформление сайта. Теперь сайт загружается заметно быстрее и выглядит более симпатично, т.к. всё выполнено в одном оттенке.

5) Изменена и доработана навигация сайта. Теперь каждый из блоков, находящихся в левой части страницы, можно свернуть! Да-да, прямо как в Проводнике Windows XP! Если страница, которую Вы открыли, небольшая, то все левые блоки можно свернуть и они будут занимать на экране минимум места. Поверьте, это очень удобно! Кроме того, в блоке "Навигация" можно свернуть отдельные ссылки по группам. Ну и самое приятное - состояния всех блоков автоматически сохраняются и при каждом следующем входе на сайт Вам не нужно заново их настраивать!
Примечание: для работы улучшенной системы навигации, а также сохранения настроек этих блоков и информации для автоматической авторизации, в Вашем браузере должны быть включены cookies и JavaScript. Если у Вас отключён JavaScript, сворачивание/разворачивание блоков, а также некоторые другие возможности работать не будут. Если у Вас отключены cookies, состояния блоков не будут сохраняться; а также Вам придётся авторизироваться при каждом входе на сайт.

Если Вы авторизированы на сайте, то для Вас значительно упрощается процесс навигации по сайту - в тех местах, где нужно вводить своё имя и e-mail, система автоматически сделает это за Вас! Например, чтобы отправить вопрос в рассылку, Вам нужно всего лишь ввести текст вопроса и нажать на кнопку!

6) Ещё одна возможность введена в тестовый режим. Пока что только для раздела "Plug-in's". Изменён формат отображения информации о файлах, а также добавлена возможность оставлять комментарии для каждого файла! Предлагаю Вам протестировать систему и заодно высказать мнение о тех файлах, что сейчас находятся в разделе "Plug-in's"! Для того, чтобы оставить комментарий, откройте страницу раздела и внизу нажмите на ссылку "Добавить комментарий". Появится небольшая форма для ввода комментария. Примечание: при отключённом JavaScript форма добавления комментария не работает. Введите текст комментария, выберите файл, к которому обращён Ваш комментарий и нажмите кнопку. Не забудьте ввести своё имя и e-mail. Авторизированным пользователям всё делать проще - вводить имя и e-mail не нужно - система подставит их автоматически! Ну и для полного счастья мы решили сделать возможность вставки смайликов в текст комментария! :)

Ух... Вот сколько всего нового на сайте! Предлагаю всем Вам без раздумий отправиться туда и испытать все новые возможности. Как всегда, жду Ваших отзывов и комментариев!

До встречи через неделю!

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

Авторское слово
Новые вопросы
Ответы на вопросы
Статья по Delphi
Файловый архив
Друзья
Юмор


Количество читателей рассылки: 3698.


Подписка на рассылку:


Лидеры по количеству баллов:


Место
Имя
Баллы
Статус
1
Feniks
281
Практикант
2
Dron
279
Практикант
3
Ermakova Dasha
262
Практикант
4
Садовников Владимир
248
Практикант
5
Iron Monk
200
Практикант
6
mvp
125
Студент
7
Ершов Денис
111
Студент
8
Лучников А.И.
108
Студент
9
Матвеев И.В.
92
Эксперт: 10-ый класс
10
VeroLom
90
Эксперт: 10-ый класс

Статусы экспертов и их возможности:

Статус
Необходимое кол-во баллов
Прикрепление файлов
Форматирование текста
Посетитель
0
нет
нет
Эксперт 1-го класса
1
нет
нет
Эксперт 2-го класса
10
нет
нет
Эксперт 3-го класса
20
нет
нет
Эксперт 4-го класса
30
нет
нет
Эксперт 5-го класса
40
нет
нет
Эксперт 6-го класса
50
до 250 Кб
нет
Эксперт 7-го класса
60
до 250 Кб
нет
Эксперт 8-го класса
70
до 250 Кб
нет
Эксперт 9-го класса
80
до 250 Кб
нет
Эксперт 10-го класса
90
до 250 Кб
нет
Студент
100
до 250 Кб
нет
Практикант
150
до 250 Кб
нет
Специалист
300
до 250 Кб
да
Профессионал
500
до 1 Мб
да
Профессор
800
до 1 Мб
да
Академик
1000
до 1 Мб
да

Примечание: Под форматированием текста понимается возможность оформлять ответы с использованием html-тегов.

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


Основные правила нашей рассылки:

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


Задать вопрос в рассылку
   |   Задать вопрос с помощью web-формы   |   Система "Эксперт"

Внимание! Вопросы и ответы для следующего выпуска рассылки принимаются до 03.12.2005 18:00. Будьте внимательны.
Письма, присланные позже либо отсеиваются, либо откладываются для публикации в следующем выпуске.


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

Вопрос #190 (автор вопроса: #One; вопрос отправлен: 05.11.2005 22:54):

Открыт или закрыт лоток CD-ROM - как это проверить программно? [Ответить на вопрос]


Вопрос #191 (автор вопроса: Саша; вопрос отправлен: 06.11.2005 20:09):

Можете подсказать какой-нибудь код для восстановления расфокусированных изображений (например решение двумерного интегрального уравнения Фредгольма 1 рода) ? [Ответить на вопрос]


Вопрос #192 (автор вопроса: Sismarev Juri; вопрос отправлен: 07.11.2005 08:46):

Когда я пишу программы в Дельфи, то у меня получается 10-20 файлов этой программы и иконка для запуска. Как мне сделать так, чтобы программа состояла только из одного файла или (exe) файла? [Ответить на вопрос]


Вопрос #193 (автор вопроса: Sismarev Juri; вопрос отправлен: 07.11.2005 08:49):

Как сделать программу, чтобы она инсталлировалась, а не запускалась просто с иконки, и надо ли это вообще, чтобы программа инсталлировалась? [Ответить на вопрос]


Вопрос #194 (автор вопроса: olhovik; вопрос отправлен: 07.11.2005 18:14):

Помогите пожалуйста! У меня есть база данных db. Из базы выводится некоторая информация в RichEdit. Мне нужно выделить встречающие нужные слова жирным или цветом в RichEdit. И еще: как вставить в RichEdit гиперссылку, например "см. ссылку" и чтобы при нажатие открывалось новое окно RichEditа? Как это сделать? Подскажите пожалуйста. [Ответить на вопрос]


Вопрос #195 (автор вопроса: olhovik; вопрос отправлен: 09.11.2005 16:29):

Помогите пожалуйста! В ListBoxе есть - список несколько тысяч киргизских слов, отсортированных по алфавиту. В Киргизском языке есть три дополнительные буквы "?","µ","?3;". Подскажите пожалуйста, как мне сделать, чтобы эти буквы стояли например: "?" - после буквы н, "µ" - после буквы о, "?3;" - после буквы у? Заранее спасибо. [Ответить на вопрос]

Если проблемы с отображением символов на странице, вот другой вариант: Помогите пожалуйста! В ListBoxе есть список - несколько тысяч киргизских слов, отсортированных по алфавиту. В Киргизском языке есть три дополнительные буквы "код символа 189","код символа 188","код символа 179". Подскажите пожалуйста, как мне сделать, чтобы эти буквы стояли например: "код символа 189" - после буквы н, "код символа 188" - после буквы о, "код символа 179" - после буквы у? Заранее спасибо.


Вопрос #196 (автор вопроса: Yurchik; вопрос отправлен: 13.11.2005 15:03):

Добрый день! Подскажите, есть ли в Дельфи аналог функции sscanf из C? И если нет, то где ее можно взять? [Ответить на вопрос]


Вопрос #197 (автор вопроса: EvGeny; вопрос отправлен: 14.11.2005 01:39):

Я новичок в программировании. Как можно в Delphi на OpenGL загрузить .x файл? P.S. Просто этот файл удобен тем, что его можно открыть обычным текстовым блокнотом и просмотреть его структуру. А я очень хочу понять принцип - как загружать файлы 3D сцен в Delphi (как осуществлять перехот от одной координаты в другую, записанную в файле 3D модели, как отличать один объект от другого и т.д.) Буду очень благодарен за исходник с подробными объяснениями. Спасибо заранее! [Ответить на вопрос]


Вопрос #198 (автор вопроса: N; вопрос отправлен: 14.11.2005 20:14):

Как выполнить комбинированный поиск по нескольким параметрам в таблице Access (не используя переменные в свойстве Parametrs, ADOQuery)? Не идут почему-то "даты". [Ответить на вопрос]


Вопрос #199 (автор вопроса: Виктор; вопрос отправлен: 24.11.2005 14:26):

Здрвствуйте, уважаемые эксперты!
Скажите, пожалуйста, как узнать длину видео файла? Пробую:

procedure Timer1.Timer(...);
begin
Label2.Caption := FormatDateTime ('hh:nn:ss', Player.Length / (1000 * 24 * 60 * 60))+ ' / ' + FormatDateTime ('hh:nn:ss', Player.Position / (1000 * 24 * 60 * 60));
end;

Но это работает только с аудио файлами. [Ответить на вопрос]



Вопросы, оставшиеся без ответа:

Вопрос #90 (автор вопроса: Nanny_Jagg; вопрос отправлен: 17.03.2005 07:56):

Как в DBGrid из библиотеки Ehlib 3.6 добавить Lookup-поле, чтобы оно действительно работало? Поле вроде сделано, но ключевое поле, оставленное рядом для контрола не меняется, по какому событию обработчик писать? [Ответить на вопрос]


Вопрос #176 (автор вопроса: Тимур; вопрос отправлен: 12.10.2005 13:58):

Нужно программно узнать температуру процессора. Мать Abit NF7-S (или любая другая) с микросхемой мониторинга Winbond W83627HF. [Ответить на вопрос]


Вопрос #181 (автор вопроса: pena; вопрос отправлен: 24.10.2005 14:52):

Как взять из Word картинку и вставить в мою базу данных? [Ответить на вопрос]

 


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


Вопрос #180:
Подскажите пожалуйста! Работаю с реестром - необходимо создать программно двоичный параметр со значением 0A ff и пожалуйста пример кода. Заранее благодарен.

1. [Отвечает: Матвеев И.В., 05.11.2005 13:52]: приблизительно так:

var
Reg : TRegistry;
Buff : array[0..1] of Byte;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run', False);
Buff[0] := $0A;
Buff[1] := $FF;
Reg.WriteBinaryData('test', Buff, 2);
Reg.CloseKey;
Reg.Free;
end;

Не забудьте подключить модуль Registry.

Оценка за ответ: 5.

2. [Отвечает: Садовников Владимир, 05.11.2005 16:25]: Воспользуйся объектом TRegistry:

uses Registry;

// Создание параметра DWORD
procedure MakeHRef(Param:DWORD);
var
Key:TRegistry;
begin
// Создаём объект реестра
Key:=TRegistry.Create;
// Рутовый раздел реестра
Key.RootKey:=HKEY_LOCAL_MACHINE;
// Открываем HKEY_LOCAL_MACHINE\Software\Your_Company\Your_Soft
// True говорит о том, что данный раздел будет создан, если он
// Не существует
Key.OpenKey('Software\Your_Company\Your_Soft',True);
// Записываем Двоичный параметр
Key.WriteInteger('Your_DWORD_Param',Param);
// Закрываем открытый раздел
Key.CloseKey;
// Удаляем объект
Key.Destroy;
end;

Оценка за ответ: 5.

3. [Отвечает: Screw aka Victor, 06.11.2005 03:11]: А вот вам ответ на простом примере с коментариями:

PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR
Registr: TRegistry;
Source: WORD;
BEGIN
Source := $FF0A;
//создаём объект TRegistry }
Registr := TRegistry.Create;
TRY
//устанавливаем корневой ключ;
//напрмер hkey_local_machine или hkey_current_user
Registr.RootKey := hkey_local_machine;
//открываем и создаём ключ
Registr.OpenKey('SOFTWARE\Test', true);
//записываем значение
Registr.WriteBinaryData('Value', Source, SizeOf(Source));
FINALLY
//закрываем и освобождаем ключ
Registr.CloseKey;
Registr.Free;
//для удаления ключа используется функция Registry.DeleteKey
END;
END;

Оценка за ответ: 5.

4. [Отвечает: Антон Трапезников, 06.11.2005 09:52]: Добрый день, wvw.

uses
Registry, Windows;

...

var
Reg: TRegistry;
KeyVal: array [0..4] of byte; // В этом массиве будет хранится значение параметра
KeyName: String; // Имя параметра

...

Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('\Software', True) then
begin
Reg.WriteBinaryData(KeyName, KeyVal, SizeOf(KeyVal));
Reg.CloseKey;
end;
finally
Reg.Free;
end;

Удачи!

Оценка за ответ: 5.

5. [Отвечает: mvp, 06.11.2005 19:51]: Приблизительно так (только не забываем добавить в uses модуль Registry):

var
Reg : TRegistry;
a : ^word;
//-----
begin
//---
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('путь к ключу', true); //если нет, то будет создан
new(a);
a^ := $ff0a; //очерёдность байт меняется. Выбран тип word из-за того,
что он состоит из двух байт. Можно любой другой,
//состоящий из 2-х байт
reg.WriteBinaryData('имя', a^, 2);
reg.CloseKey;
reg.Free
//---
end;

Оценка за ответ: 5.

6. [Отвечает: Антон, 10.11.2005 12:03]:
procedure TForm1.FormCreate(Sender: TObject);
var MR1: TRegistry;
buf: integer;

begin
buf:=$ff0a; //Если записать надо 0A FF
MR1:=TRegistry.Create; //Создание объекта реестра
MR1.RootKey:=HKEY_LOCAL_MACHINE; //Ключ с которым будем работать
if MR1.OpenKey('MyProga\BIN', True) then
//Расписываем место, куда будем сохранять данные
begin
mr1.WriteBinaryData('MyBinary', buf, SizeOf(buf));
MR1.CloseKey;
end;
MR1.Free;
end;

Оценка за ответ: 5.

7. [Отвечает: Yurchik, 13.11.2005 15:25]:
var
Reg: TRegistry;
buf: array [0..1] of char;
begin
Reg:= TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('\Software\MYProg', True) then
begin
try
buf:= #$0A#$FF;
Reg.WriteBinaryData('MyParam', buf, Length(buf));
except
ShowMessage('Can''t write to Registry!!!');
end;
Reg.CloseKey;
end;
Reg.Free;
end;

Оценка за ответ: 5.


Вопрос #182:
Как сделать так, чтобы прога автоматически загружалась при включении компа?

1. [Отвечает: Матвеев И.В., 05.11.2005 13:37]: Самый простой вариант - прописать в реестре:

В разделах:
HKCUS\Software\Microsoft\Windows\CurrentVersion\Run - для текущего пользователя
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run - для всех пользователей

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

также можно прописаться в разделы:
HKCUS\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce

тогда программа запустится только один раз после перезагрузки.

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

Инсталлируются сервисы так:

// CreateNTService(ExecutablePath,ServiceName: String)
// ExecutablePath - Полный путь к изполнимого файла от
// которого создавается NT Service
// ServiceName - Имя сервиза которое отобразится
// в Service Control Manager Результат:
//Результат:
// true - если операциая завершена успешно
// false - если есть ошибка. Можно произвести
// call то GetLastError чтобы информироваться об
// естество ошибки

function CreateNTService(ExecutablePath, ServiceName: string): boolean;
var
hNewService, hSCMgr: SC_HANDLE;
// Rights: DWORD;
FuncRetVal: Boolean;
begin
FuncRetVal := False;
hSCMgr := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
if (hSCMgr <> 0) then
begin
//Custom service access rights may be built here
//we use GENERIC_EXECUTE which is combination of
//STANDARD_RIGHTS_EXECUTE, SERVICE_START, SERVICE_STOP,
//SERVICE_PAUSE_CONTINUE, and SERVICE_USER_DEFINED_CONTROL
//You can create own rights and use them as shown in the
//commented line below.

//Rights := STANDARD_RIGHTS_REQUIRED or SERVICE_START or SERVICE_STOP
// or SERVICE_QUERY_STATUS or SERVICE_PAUSE_CONTINUE or
// SERVICE_INTERROGATE;

hNewService := CreateService(hSCMgr, PChar(ServiceName), PChar(ServiceName),
STANDARD_RIGHTS_REQUIRED, SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
PChar(ExecutablePath), nil, nil, nil, nil, nil);
CloseServiceHandle(hSCMgr);
if (hNewService <> 0) then
FuncRetVal := true
else
FuncRetVal := false;
end;
CreateNTService := FuncRetVal;
end;

// ***

//DeleteNTService(ServiceName: String):boolean;
// ServiceName - имя сервиза подлежающии удаления
//Результат:
// true - если операциая завершена успешно
// false - если есть ошибка. Можно произвести call то GetLastError чтобы
// информироваться об естество ошибки

function DeleteNTService(ServiceName: string): boolean;
var
hServiceToDelete, hSCMgr: SC_HANDLE;
RetVal: LongBool;
FunctRetVal: Boolean;
begin
FunctRetVal := false;
hSCMgr := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
if (hSCMgr <> 0) then
begin
hServiceToDelete := OpenService(hSCMgr, PChar(ServiceName),
SERVICE_ALL_ACCESS);
RetVal := DeleteService(hServiceToDelete);
CloseServiceHandle(hSCMgr);
FunctRetVal := RetVal;
end;
DeleteNTService := FunctRetVal;
end;
Пример использования:

procedure TForm1.Button1Click(Sender: TObject);
var
tmpS: string;
begin
tmpS := 'Delphi_Service_' + Application.Title;
if (CreateNTService(Application.ExeName, tmpS)) then
MessageDlg('Service ' + tmpS + ' has been successfully created!',
mtInformation, [mbOK], 0)
else
MessageDlg('Unable to create service ' + tmpS + ' Win32 Error code: ' +
IntToStr(GetLastError), mtWarning, [mbOK], 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
tmpS: string;
begin
tmpS := 'Delphi_Service_' + Application.Title + '1';
if (DeleteNTService(tmpS)) then
MessageDlg('Service ' + tmpS + ' has been successfully deleted!',
mtInformation, [mbOK], 0)
else
MessageDlg('Unable to delete service ' + tmpS + ' Win32 Error code: ' +
IntToStr(GetLastError), mtWarning, [mbOK], 0);
end;

Может быть я отвечаю слишком детально, но я просто стараюсь отвечать максимально детально.

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

Оценка за ответ: 5.

2. [Отвечает: Садовников Владимир, 05.11.2005 16:28]: Прописать в реестре по адресу HKLM\Software\Microsoft\Windows\CurrentVersion\Run строковый параметр с полным путём к твоей программе.

procedure MakeHRef;
var
Key:TRegistry;
begin
Key:=TRegistry.Create;
Key.RootKey:=HKEY_LOCAL_MACHINE;
Key.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',True);
Key.WriteString('My_Program',ParamStr(0));
Key.CloseKey;
Key.Destroy;
end;

Оценка за ответ: 5.

3. [Отвечает: Dron, 05.11.2005 17:31]: Нужно прописать её в реестре или поместить в папку "Автозагрузка". Вот как можно записать информацию в реестр:

Procedure AddToWindowsAutoStart(Name: String; Cmd: String);
Var R: TRegistry;
Begin
R:=TRegistry.Create;
R.RootKey:=HKEY_LOCAL_MACHINE;
R.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run',True);
R.WriteString(Name,Cmd);
R.CloseKey;
R.Free;
End;

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

AddToWindowsAutoStart("MyProgram",Application.ExeName);

Оценка за ответ: 5.

4. [Отвечает: Screw aka Victor, 06.11.2005 03:31]: Доброе время суток - уважаемый <l.yz>. Для автоматической загрузки в винде имеются некоторые ключи реестра:

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce]

Вот вам примерчик по данном случаю:
PROCEDURE TfmMain.FormClose(Sender: TObject; VAR Action: TCloseAction);
VAR
FIniFile: TRegIniFile;
BEGIN
FIniFile := TRegIniFile.Create('Software');
FIniFile.OpenKey('Microsoft', true);
FIniFile.OpenKey('Windows', true);
FIniFile.OpenKey('CurrentVersion', true);
//Здесь будет (Application.ExeName)полный путь к приложению с именем приложения
FIniFile.WriteString('Run', 'Integral', Application.ExeName);
FIniFile.Free;
END;

Оценка за ответ: 5.

5. [Отвечает: Антон Трапезников, 06.11.2005 09:56]: Здравствуйте, I.yz.

Это можно сделать несколькими способами, но наиболее оптимальный - занесение файла в автозапуск реестра, который находится по следующему адресу:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

uses Registry, Windows;
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
with Reg do
begin
RootKey := HKEY_LOCAL_MACHINE;
OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', true);
WriteString('Value', 'C:\Application.exe');
CloseKey;
Free;
end;
end;

Удачи!

Оценка за ответ: 5.

5. [Отвечает: illy, 06.11.2005 18:01]: Надо прописать прогу в секции "Run" реестра или поместить ярлык в папку"Автозапуск", меню "Пуск". Ниже приведен пример для реестра. В Uses надо добавить Registry.

procedure TSetingsForm.AutostartCheckBoxClick(Sender: TObject);
var
reg: TRegistry;
Ini: TIniFile;
begin
reg:= TRegistry.Create;
ini:= TIniFile.Create(MainDirPatch + 'IS.ini');
try
if AutostartCheckBox.Checked then
begin
reg.RootKey:= HKEY_LOCAL_MACHINE;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',true);
reg.WriteString('IS',Application.ExeName);
reg.CloseKey;
Ini.WriteBool('General','Autostart',true);
end
else
begin
reg.RootKey:= HKEY_LOCAL_MACHINE;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',true);
reg.DeleteValue('IS');
reg.CloseKey;
Ini.WriteBool('General','Autostart',false);
end;
finally
reg.Free;
Ini.Free;
end;
end;

Оценка за ответ: 5.

7. [Отвечает: mvp, 06.11.2005 19:57]: Пару месяцев назад я отвечал на этот вопрос в этой рассылке. Но, раз народ просит, то повторюсь :)

var
h : TRegistry;
//---
begin
//--
h := TRegistry.Create;
with h do
begin
RootKey := HKEY_LOCAL_MACHINE;
OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', true);
WriteString('MyProg', Application.ExeName);
CloseKey;
Free
end;
//---
end;

Это запишет программу в автозапуск.

Оценка за ответ: 5.

8. [Отвечает: Лучников А.И., 07.11.2005 09:16]: Если надо запустить программу до регистрации пользователя, то можно ее запустить как сервис или из сервиса (второе -проще, так как потом ее можно будет показать). Для запуска из сервиса нужно:
- создать Service Application
- в onExecute (ServiceExecute) сказать ShellExecute(0 ,'open','c:\myprog.exe',nil,nil,SW_SHOWNORMAL); (в данном случае последний параметр большого значения не имеет)

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

Оценка за ответ: 5.

9. [Отвечает: Саня Бориско, 09.11.2005 15:48]: Это записывает в раздел автозагрузки реестра путь к программе и при перезапуске системы прога автоматически запускается.

procedure TForm1.FormCreate(Sender: TObject);
var RegIni:TRegIniFile;
begin
RegIni:=TRegIniFile.Create('Software');
RegIni.RootKey:=HKEY_LOCAL_MACHINE;
RegIni.OpenKey('Software', true);
RegIni.OpenKey('Microsoft', true);
RegIni.OpenKey('Windows', true);
RegIni.OpenKey('CurrentVersion', true);
RegIni.WriteString('Run', 'Имя твоего екзешника.exe',
Application.ExeName);
RegIni.Free;
End;

Оценка за ответ: 5.

10. [Отвечает: Антон, 10.11.2005 12:07]: Для автоматической загрузки программы при включении компьютера можно поместить ярлык Вашей программы в папку "Автозагрузка" (Пуск\Программы\Автозагрузка). Так же можно воспользоваться реестром, прописав маршрут к Вашей программе в HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run.

Оценка за ответ: 5.

11. [Отвечает: dasha ermakova, 12.11.2005 23:55]: Нужно скопировать ярлык ехе-шника в Пуск -> Программы -> Автозапуск (Startup).

Оценка за ответ: 3.

12. [Отвечает: Zeon, 13.11.2005 01:03]: sProgTitle: Название для программы. sCmdLine: Имя EXE файла с путем доступа. bRunOnce: Запустить только один раз или постоянно при загрузке Windows.

procedure RunOnStartup(sProgTitle, sCmdLine : string; bRunOnce : boolean );
var
sKey : string;
reg : TRegIniFile;
begin
if( bRunOnce )thensKey := 'Once'
elsesKey := '';
reg := TRegIniFile.Create( '' );
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.WriteString(
'Software\Microsoft'
+ '\Windows\CurrentVersion\Run'
+ sKey + #0,
sProgTitle,
sCmdLine );
reg.Free;
end;

//Например
RunOnStartup('Title of my program','MyProg.exe',False );

Оценка за ответ: 5.

13. [Отвечает: Yurchik, 13.11.2005 15:29]:
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER; //автозапуск для текущего пользователя
//Reg.RootKey := HKEY_LOCAL_MACHINE; //автозапуск для всех пользователей
if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\RunOnce',
True) then
begin
Reg.WriteString('MyApp','"' + ParamStr(0) + '"');
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;

Оценка за ответ: 5.

14. [Отвечает: VeroLom, 20.11.2005 02:30]: Самое простое - добавить её в автозапуск. Например прописать её в реестре "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run".

Оценка за ответ: 4.

15. [Отвечает: Ares, 20.11.2005 14:19]: Если прога должна загружаться при входе юзера в систему, то решаетсяэто просто добавлением ключика в реестр:

для текущего пользователя: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
для любого пользователя: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

а добавить можно так:

var Reg: TRegistry;
begin
Reg := TRegistry.Create;
with Reg do
begin
RootKey := HKEY_CURRENT_USER;
OpenKey('\software\microsoft\windows\currentversion\run', true);
WriteString('Имя проги', Application.ExeName);
Free;
end;

Если же требуется запуск приложения без входа юзера в систему, - то здесь нужно писать не обычное приложение, а сервис (File -> New ->Other и там выбираешь Service)

Оценка за ответ: 5.


Вопрос #183:
Подскажите пожалуйста, как осуществить Drag&Drop файлов (и папок) в TShellListView-ах между собой и извне (и наоборот, куда-то в папку). Спасибо!

1. [Отвечает: Матвеев И.В., 05.11.2005 14:47]: Решение вашего вопроса представляет собой две части - обеспечение приема файлов/папок и обеспечение "покидания" файлов/папок.

При таком подходе автоматически решиться и третий вопрос - о перемещении файлов/папок между TShellListView ами.

1. Прием файлов

Поскольку вы хотите принимать файлы разными ListView'ами, вы должны написать потомка от TShellListView такого вида:

Загрузить файл >>

Теперь для принятых файлов/каталогов будет создаваться событие OnDropFiles, в обработчке которого вы и делайте что хотите.

2. Перемещение файлов из вашей программы в проводник.

Этот вопрос практически не описывается в интернете, поэтому однажды я решил исправить это и, начитавшись книги "Программирование в Delphi 3" (http://podgoretsky.com/ftp/Docs/Delphi/D3/D3ProgLib/ch_01.htm), написал компонент TDropper.

Загрузить файл >>

Вам нужно вызвать метод TDropper.StartDrop в момент, когда вам нужно начать перетаскивание и в событии OnDropUp перечислить файлы для копирования.

Надеюсь у Вас все получится.

Оценка за ответ: 5.


Вопрос #184:
Delphi 7. Использую ListView в режиме vsReport для отображения статистики. Необходимо организовать слежение за добавленными записями. Проблему решил скроллингом компонента на всю длину записей - методом Scroll, однако этот метод не имеет действия при запуске программы (ни в OnCreate, ни в OnShow) от него пользы нет. Как обеспечить скроллинг компонента при запуске? Есть что-нибудь изящнее, чем скроллировать по таймеру?

1. [Отвечает: midav.land.ru, 08.11.2005 18:31]: Насколько я понял - проблема "сделать гарантировано видимой нужную запись"? Я делаю это так:

ListView1.ItemIndex:=ListView1.Items.Count-1; //Сделаем выделеным нужный нам элемент (в данном случае - последний)
ListView1.Selected.MakeVisible(True); //А этой строкой заставим его показаться

Оценка за ответ: 5.


Вопрос #185:
В настройках Windows есть такая предательская настройка, как размер системного шрифта. В результате, если этот параметр у разработчика и пользователя имеет разное значение, это плачевно сказывается на внешнем виде формы. В одних случаях контролы наплывают друг на друга и уходят за край формы, что чревато ее скроллингом, в других - появляется много свободного места. Есть успешные решения данной проблемы?

1. [Отвечает: Садовников Владимир, 05.11.2005 16:32]: Одно из рациональных решений - использовать параметр Align каждого контрола. Правда, для этого придётся пихать панели на форму и т.д. Но это в любом случае избавляет от первых симптомов такой "болезни". У меня были такие проблемы, когда я пытался компоненты растягивать строго по форме, а форму делать фиксированного размера. Такой трюк не проходил при смене шрифта. Когда воспользовался методом Align и парой-тройкой панелей, то все симптомы пропали.

Оценка за ответ: 5.

2. [Отвечает: Dron, 05.11.2005 17:40]: В пакете GlobusLib (http://cpr.biblio-globus.ru) есть компонент glSmallFontsDefence: "Компонент, защищающий приложение от искажений, возникающих при запуске в режиме крупных шрифтов. Можно снять защиту с гридов, чтобы не лишать пользователей всех преимуществ крупных шрифтов". Думаю, это то, что нужно.

Оценка за ответ: 4.

3. [Отвечает: #One, 05.11.2005 21:14]: Денис, данная проблема решается просто: в обработчике OnResize формы программно выставляешь положение контрола. В приведённом ниже примере использован OnPaint, т. к. пример взят из проекта, где размер формы постоянный:

procedure TfmOptions.FormPaint(Sender: TObject);
begin
// кнопка bbCancel будет от правого края формы fmOptions отстоять
// на 1/6 своей ширины
fmOptions.bbCancel.Left := fmOptions.Width-bbCancel.Width-(bbCancel.Width div 6)
end;

Оценка за ответ: 5.

4. [Отвечает: Антон Трапезников, 07.11.2005 08:07]: Здравствуйте, Денис. Попробуте следующий код. Он масштабирует как размер формы, так и размер шрифтов. Вызывайте его в Form.FormCreate. Надеюсь это поможет.

unit geScale;

interface
uses Forms, Controls;

procedure geAutoScale(MForm: TForm);

implementation
type
TFooClass = class(TControl); { необходимо выяснить защищенность }

{ свойства Font }

procedure geAutoScale(MForm: TForm);
const

cScreenWidth: integer = 800;
cScreenHeight: integer = 600;
cPixelsPerInch: integer = 96;
cFontHeight: integer = -11; {В режиме проектирование значение из Font.Height}

var

i: integer;

begin

{
ВАЖНО!! : Установите в Инспекторе Объектов свойство Scaled TForm в FALSE.

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

if (Screen.width &; lt > cScreenWidth) or (Screen.PixelsPerInch <>
cPixelsPerInch) then
begin
MForm.scaled := TRUE;
MForm.height := MForm.height * screen.Height div cScreenHeight;
MForm.width := MForm.width * screen.width div cScreenWidth;
MForm.ScaleBy(screen.width, cScreenWidth);

end;

{
Этот код проверяет, отличается ли размер шрифта во времы выполнения от
размера во время проектирования. Если во время выполнения pixelsperinch
формы отличается от pixelsperinch во время проектирования, шрифты снова
масштабируются так, чтобы форма не отличалась от той, которая была во
время разработки. Масштабирование производится исходя из коэффициента,
получаемого путем деления значения font.height во время проектирования
на font.height во время выполнения. Font.size в этом случае работать не
будет, так как это может дать результат больший, чем текущие размеры
компонентов, при этом текст может оказаться за границами области компонента.
Например, форма создана при размерах экрана 800x600 с установленными
маленькими шрифтами, имеющими размер font.size = 8. Когда вы запускаете
в системе с 800x600 и большими шрифтами, font.size также будет равен 8,
но текст будет бОльшим чем при работе в системе с маленькими шрифтами.
Данное масштабирование позволяет иметь один и тот же размер шрифтов
при различных установках системы.
}

if (Screen.PixelsPerInch <> cPixelsPerInch) then
begin

for i := MForm.ControlCount - 1 downto 0 do
TFooClass(MForm.Controls[i]).Font.Height :=
(MForm.Font.Height div cFontHeight) *
TFooClass(MForm.Controls[i]).Font.Height;

end;

end;

end.

Свойство, отвечающее за размер шрифта важно, но не менее важны в этом вопросе и другие характеристики. Я получал безобразные результаты при изменении резолюции, пока я не начал задавать размер шрифта в пикселях (pixels) вместо точек (points). Вы можете установить font.height, и вы можете установить font.size. Я обнаружил, что установка значения font.height дает значительно лучшие результаты, поскольку данное свойство определяет количество пикселей, и размер шрифта меняется пропорционально изменению размера пиксела. Также, вы можете обнаружить, что шрифт по-умолчанию не может быть ниже определенной высоты. Будет гораздо лучше, если вместо SYSTEM вы выберите шрифт MS sans-serif. У формы имеется свойство, названное "scaling". Я обнаружил, что лучше его иметь выключенным. Если свойство включено, Delphi или Windows пытаются при изменении размера формы все соответствено смаштабировать. Все это хорошо только для сохранения относительных позиций элементов, так что я выключил свойство, и больше о нем не вспоминал. Если свойство выключено, а форма ваша максимизирована, вы обнаружите, что все ваши компоненты устремились вслед за левым верхним углом формы. Где не желателен этот эффект, я получал разрешение экрана (Screen.Height и Screen.Width) и прислаивал свойствам компонентов Left и Тор скорректированные свойства прежде, чем форма успевала появиться (в методе OnCreate, во время выполения приложения). В целом же, завершая рассказ, следует подчеркнуть, что выключенное свойство scaling и использование пикселей вместо точек для изменения размеров шрифта, дает вполне приемлимый результат.

Оценка за ответ: 5.


Вопрос #186:
Здравствуйте! Пишу первую в жизни DLL. В ней функция заполняющая динамический массив случайными числами. В uses прописал ShareMem. Проблема - Не получается передать этот массив, точнее, указатель в программу. Объявление function masss(n:integer):array of integer; не проходит. подскажите что делать? Если можно с примером.

1. [Отвечает: Матвеев И.В., 05.11.2005 14:57]: Первое - модуль ShareMem должен быть не просто объявлен, он должен быть объявлен первым, у Вас он первый?

Второе - попробуйте использовать не function masss(n:integer):array of integer; а function masss(n:integer):TArrayOfInt; где TArrayOfInt = array of integer; // Объявлено и в DLL и в программе

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

Оценка за ответ: 5.

2. [Отвечает: Садовников Владимир, 05.11.2005 16:36]: Используйте лучше так вот:

function Mass (n:integer, var a:array of Integer):Integer;

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

Оценка за ответ: 5.

3. [Отвечает: mvp, 06.11.2005 20:28]: У меня всё получается и без ShareMem (ох и беды он мне в своё время доставил, хотя не уверен, что без него программа будет работать на машине без Delphi. Но, на всякий случай, если Вы его пишите, то только в DLL и в файле *.dpr проекта на первом месте. Иначе у Вас будут выскакивать ошибки при закрытии). Делаем так: создаём модуль, где описан тип type RdynMass = array of integer; Пусть он называется types_. Добавляем его в uses dll и в модуль, откуда вызывается эта dll. Меняете объявление (всё-таки указывайте тип передачи параметров - так надёжнее): function masss(n:integer): RdynMass; stdcall

В модуле, откуда вызываем, тоже самое:

uses types_, ...;
//---
var
info : function(n:integer): RdynMass; stdcall;
sd : RdynMass
//--
begin
//----
//думаю, что вы уже разобрались, как подключить dll
@info := GetProcAddress(handle, 'masss');
if @info <> nil then sd := info;//всё - вы получили свой массив. Далее,
как обычно: Length(sd) - длина массива и
//поэлементный доступ - всё работает. Доступ с 0 начинается :)
end;

Оценка за ответ: 5.

4. [Отвечает: Yurchik, 13.11.2005 16:59]: В модуле Types объявлен тип TIntegerDynArray так: TIntegerDynArray = array of Integer;

В DLL пишешь:

library MyLib;
uses
ShareMem, Types;
function masss(n: Integer): TIntegerDynArray; stdcall;
var
i: Integer;
begin
SetLength(Result, n);
for i:= 0 to n-1 do
Result[i]:= Random(1000);
end;
exports
masss;
begin
Randomize;
end.

В своей программе пишешь:

uses
ShareMem, ...
function masss(n: Integer): TIntegerDynArray; stdcall; external 'MyLib.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
ia: TIntegerDynArray;
begin
Memo1.Clear;
ia:= masss(108);
for i:= 0 to Length(ia)-1 do
Memo1.Lines.Add(IntToStr(ia[i]));
ia:= nil;
end;

Оценка за ответ: 5.


Вопрос #187:
Кто знает методы, свойства и события компонента ShellListView на вкладке Samples и их описания подскажите пожалуйста.

1. [Отвечает: Матвеев И.В., 05.11.2005 14:38]: Могу подсказать как получить путь к выделенному файлу в TShellListView.

Label1.Caption := ShellListView1.Folders[ShellListView1.ItemIndex].PathName;
{ Для получения полных путей }
var
path: string;
begin
for i:=0 to ShellListView1.SelCount-1 do
begin
path := ShellListView1.Folders[ShellListView1.GetNextItem(ShellListView1.Selected,
sdAll,[isSelected]).Index+i-1].PathName;
// ...
end;
end;

Оценка за ответ: 4.

2. [Отвечает: Ares, 20.11.2005 14:32]: Я, конечно, понимаю, что мой ответ будет не по существу, но всё-таки: хелпом воспользоваться религия не позволяет?

Оценка за ответ: 1.


Вопрос #188:
Помогите написать программу, которая подсчитывает трафик в ЛВС? Или подскажите как? Исходные данные: целью этого проекта является разработка программы для одного уникального узла, который не участвует в сетевых операциях, а контролирует и анализирует все кадры, передаваемые в сетевой среде.

1. [Отвечает: mvp, 06.11.2005 20:37]: Не помню, откуда скачал, но программа с исходниками и считает трафик. Посмотрите - думаю, что разберётесь.

Загрузить файл >>

Оценка за ответ: 5.


Вопрос #189:
Как программно перехватить имя файла, если запускаешь его в меню "Открыть с помощью", или задать ассоциацию так, чтобы файл при двойном щелчке открывался именно твоей программой?

1. [Отвечает: Матвеев И.В., 05.11.2005 14:56]: Вам нужно при запуске проверять ParamStr - переданные программе параметры.

Плюс нужно внести изменения в реестр:

// Изменения в реестре
procedure CheckRegistry;
var
RegKey : TRegistry;
begin
RegKey := TRegistry.Create;
RegKey.RootKey := HKEY_CLASSES_ROOT;
// Регистрация расширений
// Регистрация расширения .ASM
RegKey.OpenKey('.asm', True);
RegKey.WriteString('', 'AsmCode');
RegKey.CloseKey;

RegKey.OpenKey('AsmCode', True);
RegKey.WriteString('', 'Asm Текст');
RegKey.CloseKey;
RegKey.OpenKey('AsmCode\DefaultIcon', True);
RegKey.WriteString('', ParamStr(0)+',1');
RegKey.CloseKey;
RegKey.OpenKey('AsmCode\shell\open\command', True);
RegKey.WriteString('', '"'+ParamStr(0)+'" "%1"');
RegKey.CloseKey;

Обрабатывать параметры при запуске вот так:

if FileExists(ParamStr(1)) then
LoadFile(ParamStr(1)).

Учтите, что если вы обрабатываете загрузку в OnCreate нужно, чтобы компоненты, в которые вы загружаете файл (скажем текст в Memo) были уже созданы.

Оценка за ответ: 5.

2. [Отвечает: Dron, 05.11.2005 17:40]: Когда Windows запускает какую-либо программу, то имя файла для открытия передаётся параметром %1, прочитать который можно следующий образом: FileName:=ParamStr(1); Подробно об ассоциации файлов с приложениями здесь:
http://www.delphi.int.ru/modules.php?name=questions&action=view&id=99
http://www.delphi.int.ru/modules.php?name=articles&action=view&articleid=2

Оценка за ответ: 5.

3. [Отвечает: Лучников А.И., 07.11.2005 09:32]: Простейший пример:

здесь:
ext - расширение (без точки)
ApplicationFile-EXE-шник, который надо запустить (ассоциировать ext c
ApplicationFile)
Caption - наименование типа файла (отображается при просмотре ассоциаций
типов файлов)

Procedure RegTypeFile(Ext,ApplicationFile,Caption:String);
var
reg: TRegistry;
begin
reg:=TRegistry.Create;
with reg do
begin
RootKey:=HKEY_CLASSES_ROOT;
OpenKey('.'+ext,True);
WriteString('',ext+'file');
CloseKey;
CreateKey(ext+'file');
OpenKey(ext+'file',True);
WriteString('',Caption);
OpenKey(ext+'file\DefaultIcon',True);
WriteString('',ApplicationFile+',0');
CloseKey;
OpenKey(ext+'file\shell\open\command',True);
WriteString('',ApplicationFile+' "%1"');
CloseKey;
Free;
end;
end;

Оценка за ответ: 5.

4. [Отвечает: midav.land.ru, 08.11.2005 18:41]: Вариант а - инжектиться в процесс Explorer - но это сложновато и чревато страшными последствиями. Вариант Б - Вся эта инфа прописывается в реестре. Прописываем свою прогу туда, а уже она запускает то, что дожно(если надо) ПО поводу двойного клика - ниже процедура как сделать это.
Сначала, естественно, объявляем в uses модуль Registry.

uses
Registry;

Затем в публичных объявлениях объявляем процедуру регистрации нового типа файлов:

public
{ Public declarations }
procedure RegisterFileType(ext: string; FileName: string);

Описываем её так:

procedure TForm1.RegisterFileType(ext: string; FileName: string);
var
reg: TRegistry;
begin
reg:=TRegistry.Create;
with reg do
begin
RootKey:=HKEY_CLASSES_ROOT;
OpenKey('.'+ext,True);
WriteString('',ext+'file');
CloseKey;
CreateKey(ext+'file');
OpenKey(ext+'file\DefaultIcon',True);
WriteString('',FileName+',0');
CloseKey;
OpenKey(ext+'file\shell\open\command',True);
WriteString('',FileName+' "%1"');
CloseKey;
Free;
end;
end;

Ну а по нажатию какого-нибудь батона регистрируем!

procedure TForm1.Button1Click(Sender: TObject);
begin
RegisterFileType('mmm', Application.ExeName);
end;

После этого файлы mmm будут по двойному клику обрабатываться нашей прогой. Правда в проге нужно доделать обработку параметров

Оценка за ответ: 5.

5. [Отвечает: VeroLom, 20.11.2005 02:34]: Например, расширение - .ext. В реестре в разделе "HKEY_CLASSES_ROOT" создать раздел".ext\Shell\Open\Command" и там в параметре по умолчанию вписать полный путь к твоей программе.

Оценка за ответ: 4.

6. [Отвечает: Ершов Денис, 23.11.2005 12:15]: Я считаю, перехватывать диалог - это решение из ряда вон. На порядок проще зарегистрировать расширение при первом запуске программы или возложить эту работу на инсталлятор программы (setup). Список всех зарегистрированных в системе расширений хранится в реестре в разделе "HKEY_CLASSES_ROOT". Для примера вызвал данный диалог для некоего расширения ".aaa" для некоей программы "aaa.exe". В результате в этом разделе реестра появилось два раздела.

Первый:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.aaa]
@="aaa_auto_file"

Второй:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\aaa_auto_file]
@="Файл тестирования ассоциаций"

[HKEY_CLASSES_ROOT\aaa_auto_file\shell]
@="open"

[HKEY_CLASSES_ROOT\aaa_auto_file\shell\open]

[HKEY_CLASSES_ROOT\aaa_auto_file\shell\open\command]
@="D:\\Projekts\\aaa\\aaa.exe \"%1\""

Думаю, добавлением данных ключей в реестр данная проблема будет исчерпана.

Оценка за ответ: 5.


Все вопросы и ответы на них Вы всегда можете найти на нашем сайте в разделе "Эксперт": http://www.delphi.int.ru/modules.php?name=expert.


Статья по Delphi.

Сегодня новых статей нет.


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


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

Из данного раздела Вы можете скачать различные файлы: компоненты, plug-in'ы для Delphi, документацию по программированию, программы, игры, написанные на Delphi и всё остальное... Вы можете добавить свои файлы в данный раздел. Чтобы сделать это, пожалуйста, заполните форму на сайте.

Внимание! На сайте в данное время идёт перестройка, поэтому появление новых файлов происходит с задержками, при этом описания этих файлов на страницах сайта отсутствуют. Это временное явление. Пока что ссылки на файлы будут публиковаться исключительно в рассылке, но потом всё возобновится.

Новые файлы на сайте:

Название / описание файла
Категория
Объём
Ссылки
Text Restruct - Программа предназначена для структуризации исходников в синтаксисе Pascal.
Программы
374 Кб
XLSReadWriteII - Мощный компонент для работы с файлами *.xls.
Компоненты
263 Кб

Чтобы перейти к разделу "Файловый архив" на сайте, нажмите на эту ссылку.


Дружественные сайты.

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


http://xskernel.narod.ru/ - XSystem Kernel Project. Сайт, посвящённый написанию операционной системы. Новости, информация об XSystem Kernel Team, документация, глоссарий, исходники системы. Open Source - наше направление.


http://tpascal.h15.ru/ - Сайт Злобина Евгения Сергеевича "ВСЁ О ПАСКАЛЕ". Здесь найдётся всё: исходники, программы, документация, алгоритмы, олимпиада, конкурсы, форум, уроки и многое, многое другое!!! Вступайте в сообщество ПаскALL. Сайт постоянно обновляется и развивается!!!


http://www.hkdsoft.narod.ru/ - H.K.D. Soft - Программирование на Delphi, C/C++, Assembler, Pascal, Basic/VB/VBA/VBS. Компоненты, статьи, исходники, множество е-книг, форум. Бесплатный софт. Скачать программу GamesBase - базу данных по играм содержащую описания, скриншоты, коды, прохождения игр.


http://infomania2004.webhost.ru/ - Этот сайт создан для того, чтобы вы могли получить интересующую вас информацию с минимальными затратами сил и времени. Если вы не нашли здесь нужной информации, вы можете оставить заявку на ее поиск. Как только информация будет найдена, она появится на сайте, а вам сообщат об этом.


http://www.visualbasic.noka.ru/ - Программирование на Visual Basic & Basic. На сайте Вы найдете множество примеров, статьи, исходники, ActiveX, а также многое другое!


http://www.sashook.hut1.ru/ - Игры, коллекция флешек, обои и заставки, компьютерные приколы, картинки, тосты и алкогольные присказки, смешные истории и анекдоты.


http://www.ssgroup.fatal.ru/ - Delphi 39. Ресурс для программистов. Статьи, исходники, компоненты, учебники, справочники, FAQ, программы и многое другое.


Дружественные рассылки:

Рассылки Subscribe.Ru :: Программирование
Интернет для Delphi-программиста
X-Program ПО, новости сайта и программирование в Delphi7
Visual Basic для новичков и профессионалов
Поиск текстов, переводов и аккордов песен
   

 


Юмор.

Новость: На сайте Федерального казначейства размещены образцы банкнот нового дизайна. Там же можно скачать версию для печати.

:))

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

:))

Начальник отдела кадров и хакер:
-"Не работал", "не учился", "не служил", "не имеет", "нет", "нет", "нет". Как же ты с такими данными работать собираешься?
- Не волнуйтесь, пожалуйста, уверяю вас, как только я буду работать, все данные будут в полном порядке.

:))

Ух, вот это программа! - А на что ты нажал? На что?!?

:))

Не говорите программисту: >, порадуйте его возможностью зайти администратором или, в крайнем случае - пользователем...

:))

- Мужики, а фильм Doom по какой части сняли?
- По третьей.
- Спасибо. А пароли от первой - подойдут?

:))

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


Пожалуйста, присылайте свои анекдоты по этой ссылке: info@delphi.int.ru и они обязательно будут опубликованы! Желательно на компьютерную тему.

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

Вы можете оказать помощь нашему проекту через систему WebMoney: R379291065219, Z165075684614. Будем очень признательны!

 

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphifaq
Архив рассылки
Отписаться
Вспомнить пароль

В избранное