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

RusFAQ.ru: Программирование на Delphi


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

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 344
от 03.01.2006, 22:12

Администратор:Калашников О.А.
В рассылке:Подписчиков: 233, Экспертов: 52
В номере:Вопросов: 3, Ответов: 16


Вопрос № 32379: Уважаемые эксперты!!! Как программно прописать в реестре свой тип файла и при открытии этого файла моя программа сама загружала этот файл в RichEdit?...
Вопрос № 32392: Здравствуйте! С наступающим Новым Годом! Нужно отловить запуск приложения и закрыть его. Вот так происходит закрытие по заголовку: PostMessage(FindWindow(Nil, 'Заголовок окна'), WM_QUIT, 0, 0); Но как узнать когда это приложение поя...
Вопрос № 32402: Здравствуйте! У меня Delphi 2005, создаю я форму и ставлю её значение Visible := False, но при запуске форму всё равно видно! Как сделать что бы формы не было видно?? И ещё вопрос: как скрыть приложение от диспетчера задач?...

Вопрос № 32.379
Уважаемые эксперты!!!
Как программно прописать в реестре свой тип файла и при открытии этого файла моя программа сама загружала этот файл в RichEdit?
Отправлен: 29.12.2005, 13:44
Вопрос задал: Sassoft (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Romodos
Здравствуйте, Sassoft!
Для этого можете воспользоваться моим компонентом RegAsso(romodos.narod.ru/regasso.zip)
Описание действий в приложении
А вот при открытиии вашей проги в событии формы OnCreate пропишите
что-то вроде richedit.lines.loadfromfile(paramstr(1));
Тогда файл откроется.
Думаю работать с реестром вы умеете:)
А если не умеете, то в хелпе все подробно расписано, да и в исходниках моего компонента это можно увидеть

Приложение:

---------
FAQ me off!

Ответ отправил: Romodos (статус: Студент)
Отправлен: 29.12.2005, 14:28

Отвечает: Ерёмин Андрей
Здравствуйте, Sassoft!
Вот здесь подробно разобрано, как ассоциировать определённый тип файлов со своим приложением:
http://www.delphi.int.ru/modules.php?name=questions&action=view&id=189
http://www.delphi.int.ru/modules.php?name=questions&action=view&id=99
Ну а загрузить текст в RichEdit или Memo очень просто. Windows при запуске передаёт программе в первом параметре (%1) полный путь к файлу, который пользователь пытается открыть. Этим и нужно воспользоваться:

RichEdit.Lines.LoadFromFile(ParamStr(1));


---------
Работа - не волк, а произведение силы на расстояние!
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 29.12.2005, 15:00

Отвечает: Toxic~Fire
Здравствуйте, Sassoft!
Для большего совершенства твоего зарегистрированного файла используй функцию RegWriteStr работы с реестром. Вот она:

function RegWriteStr(RootKey: HKEY; Key, Name, Value: string): Boolean;
var
Handle: HKEY;
Res: LongInt;
begin
Result := False;
Res := RegCreateKeyEx(RootKey, PChar(Key), 0, nil, REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, nil, Handle, nil);
if Res <> ERROR_SUCCESS then
Exit;
Res := RegSetValueEx(Handle, PChar(Name), 0, REG_SZ, PChar(Value),
Length(Value) + 1);
Result := Res = ERROR_SUCCESS;
RegCloseKey(Handle);
end;

Дальше смотри программу (регистрируем расширение *.xxx)

Приложение:

Ответ отправил: Toxic~Fire (статус: 1-ый класс)
Отправлен: 29.12.2005, 15:03

Отвечает: Schmak
Здравствуйте, Sassoft!
Я приведу пример для BMP файла (впрочем прописание других типов ничем не отличается), взятый из книги М.Фленова "Delphi глазами Хакера"Ж
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CLASSES_ROOT;
Reg.OpenKey('.BMP' , True);
Reg.WriteString('', 'BMPfile');
Reg.CloseKey;

Reg.CreateKey('BMP'+'file_cyd');
Reg.OpenKey('BMPfileDefaultIcon', True);
Reg.WriteString('', Application.ExeName + ',0');
Reg.CloseKey;
Reg.OpenKey('BMPfileshellopencommand', True);
Reg.WriteString('', Application.ExeName + ' "%1"');
Reg.CloseKey;
Reg.Free;
end;

2) Для того. чтобы открыть файл необходимо прочитать параметры, с которыми он был открыт. Загвоздка может быть в том, что параметры разделяются пробелами, но в имени файлов или папок он тоже может присутствовать, поэтому лучше считывать все параметры и объединять их в одну строку.
var
Str:String;
i:Integer;
begin
if (ParamCount > 0) then
begin
Str:=ParamStr(1);
for i:=2 to ParamCount do
begin
Str:=Str+' '+ParamStr(i);
end;
RichEdit1.Lines.LoadFromFile;
end;
---------
Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Студент)
Отправлен: 29.12.2005, 16:48

Отвечает: Diman_A
Здравствуйте, Sassoft!
Я в своем проекте делал регистрацию, опираясь на то, имя файла передается через параметр.
Вот приложение, которое при нажатии одной кнопки регистрирует ассоциирует тип 'test' с собой, а принажатии второй снимает регистрацию:
unit Unit1;
interface
uses Windows, Forms, Registry, Controls, StdCtrls, Classes, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
RichEdit1: TRichEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
public
procedure RegisterFileType(ext: string; FileName: string);
end;
var
Form1: TForm1;
reg:TRegistry;
implementation
{$R *.dfm}
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+'fileDefaultIcon',True);
WriteString('',FileName+',0');
CloseKey;
OpenKey(ext+'fileshellopencommand',True);
WriteString('',FileName+' "%1"');
CloseKey;
Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if ParamCount>0 then
richedit1.Lines.LoadFromFile(ParamStr(1));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//Register new file type
registerfiletype ('test', application.ExeName)
end;
procedure TForm1.Button2Click(Sender: TObject);
//Remove registration
begin
reg:=TRegistry.Create;
with reg do
begin
RootKey:=HKEY_CLASSES_ROOT;
DeleteKey('.test');
Free;
end;
end;
end.

Ответ отправил: Diman_A (статус: 2-ой класс)
Отправлен: 29.12.2005, 17:33

Отвечает: CJ
Здравствуйте, Sassoft!
Ну вприниципе добавить нечего. Все эксперты замечательно все описали. Единственно могу добавить, что необходимо протестить по разными операционками и необходимо проработать разные варианты: например вручную удалить ключи и проассоциировать заново, либо проассоциировать с другой программой, а потом своей. Вобщем что-бы не возникло разнообразных проблем, необходимо тестить в разных вариантах. А то как я делал, становился нередко на грабли с этой ассоциацией.
Ответ отправил: CJ (статус: Практикант)
Отправлен: 29.12.2005, 21:01


Вопрос № 32.392
Здравствуйте! С наступающим Новым Годом!
Нужно отловить запуск приложения и закрыть его.
Вот так происходит закрытие по заголовку:
PostMessage(FindWindow(Nil, 'Заголовок окна'), WM_QUIT, 0, 0);
Но как узнать когда это приложение появилось?
Отправлен: 29.12.2005, 17:38
Вопрос задал: Клёмин Сергей (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, SuperXakep!
Если окно существует, то функция FindWindow() возвратит его handle, который будет больше нуля. Этим и следует воспользоваться. Отловить момент, когда приложение запустилось, достаточно сложно, поэтому проще пытаться его закрыть через определённые интервалы времени, по таймеру (TTimer):

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if FindWindow(Nil,'Заголовок окна') > 0 then
PostMessage(FindWindow(Nil,'Заголовок окна'), WM_QUIT, 0, 0);
end;


Не забудьте активировать таймер (Enabled:=True) и установить нужный интервал времени (Interval).
---------
Работа - не волк, а произведение силы на расстояние!
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 29.12.2005, 18:26
Оценка за ответ: 5

Отвечает: Лучников Юрий Владимирович
Здравствуйте, SuperXakep!
Используйте стандартный компонент Timer. В обработчике OnTimer пропишите код, который будет выявлять, присутствует ли окно в системе с помощью FindWindow. Если окно присутствует - послать Message на его закрытие;)

Успехов!
Ответ отправил: Лучников Юрий Владимирович (статус: 8-ой класс)
Отправлен: 29.12.2005, 18:30
Оценка за ответ: 5

Отвечает: sir henry
Здравствуйте, SuperXakep!
Нужно завести таймер и через интервал времени, определяемый таймером, запускать FindWindow() с нужным Вам заголовком. Если функция возвратила хэндл окна, тогда закрыть, иначе ждать следующей провкеруи.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 30.12.2005, 02:28


Вопрос № 32.402
Здравствуйте!
У меня Delphi 2005, создаю я форму и ставлю её значение Visible := False, но при запуске форму всё равно видно! Как сделать что бы формы не было видно??
И ещё вопрос: как скрыть приложение от диспетчера задач?
Отправлен: 29.12.2005, 20:54
Вопрос задал: Клёмин Сергей (статус: Посетитель)
Всего ответов: 7
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: CJ
Здравствуйте, SuperXakep!
В обработчик FormCreate пропиши строку Application.ShowMainForm:=false;
В приложение пример того, как это делается в D7, в 2005 аналогично.

Приложение:

Ответ отправил: CJ (статус: Практикант)
Отправлен: 29.12.2005, 21:14

Отвечает: Ерёмин Андрей
Здравствуйте, SuperXakep!
Свойство Visible для форм не действует. Скрыть форму можно так:

ShowWindow(Form1.Handle,SW_HIDE);


А вот здесь описано, как скрыть программу от диспетчера задач:
http://www.delphi.int.ru/modules.php?name=questions&action=view&id=75.
---------
Работа - не волк, а произведение силы на расстояние!
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 29.12.2005, 21:53
Оценка за ответ: 5

Отвечает: sir henry
Здравствуйте, SuperXakep!
1) Visible:=False в OnCreate этого окна. Наверно оно определено у Вас как главное, поэтому по умолчанию создается видимым. Или вообще не создавать его при запуске. Меню Project - Options и там убрать окно из Auto-create forms. Только когда оно Вам будет нужно - не забудте его создать.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 30.12.2005, 02:33

Отвечает: Diman_A
Здорово, SuperXakep!
Твой супер-Delphi 2005 тут ни при чем: я сижу по delphi 5 и 6, там то же самое,
ведь форма - это и есть форма, а не батон какой-нибудь. Чтобы формы действительно не было видно, надо в самом проекте (файл *.dpr) после строчки Application.Initialize; написать
application.ShowMainForm:=false;
После этого твоя прога исчезнет с экрана и с панели задач. Закрыть можно либо из delphi (CTRL+F2), либо из Диспетчера задач.
По поводу самого диспетчера писать я тебе не буду, ответ найдешь на
http://delphiworld.narod.ru/base/app_xp_hide.html
Ответ отправил: Diman_A (статус: 2-ой класс)
Отправлен: 30.12.2005, 06:18

Отвечает: Ballon
Здравствуйте, SuperXakep!

Попробуй так:

Form1.Hide;
---------
Хочу все знать...
Ответ отправил: Ballon (статус: 7-ой класс)
Отправлен: 30.12.2005, 09:01

Отвечает: Denisss
Здравствуйте, SuperXakep!
Про то, как спрятать форму Вам ответ уже дали. А вот про то, как спрятать приложение от диспетчера задач была статья на wasm.ru.
Учитывая, что почему-то этот сайт у меня сейчас не открывается (не знаю в чем дело, но не исключаю, что может сам где-то его блокирую), то прикрепляю Вам эту статью в файл.
Пример "как спрятать Winlogon.exe из процессов" лежит в архиве prochide.rar

Прикреплённый файл: Загрузить >>
Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа.

Ответ отправил: Denisss (статус: Специалист)
Отправлен: 30.12.2005, 10:53

Отвечает: Toxic~Fire
Здравствуйте, SuperXakep!
можно так

form1.left:=screen.width;

и, чтобы форму не засекли, когда поменяют разрешение экрана, напиши:
procedure WMDisplayChange(var message: TMessage); message WM_DISPLAYCHANGE;
...
procedure TForm1.WMDisplayChange(var message: TMessage);
begin
form1.left:=screen.width;
inherited;
end;

она уйдет за пределы экрана.
Но попробуй лучше написать консольное приложение.

А скрыть из диспетчера задач у меня есть пример только на C++
Удачи
Ответ отправил: Toxic~Fire (статус: 1-ый класс)
Отправлен: 30.12.2005, 12:41


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100

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

В избранное