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

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


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

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

Выпуск № 770
от 04.04.2007, 11:35

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


Вопрос № 80269: Здравствуйте. У меня нависло несколько вопросов. 1) Как запустить консольное приложение с параметрами командной строки. Разумеется из моего приложения надо запускать. 2) Все тоже самое что и 1 вопрос только при определенных пара...
Вопрос № 80287: Здравствуйте! Вопрос такого плана... Мне нужно сохранить всю файловую структуру диска в отдельный файл. Обьясну по подробней... Программа на делфи должна сканировать жесткий диск и зписать его структуру в файл. Потом другая (ну не обязательно...
Вопрос № 80308: Уважаемые эксперты! Покажите пожалуйста на примере, как программно создавать Edit'ы ( то есть не путем бросания на форму, потому что не известно заранее необходимое количество етих Edit'тов, а, например, в цикле)....
Вопрос № 80350: Здраствуйте. Даже не знаю в какой раздел написать этот вопрос. А вопрос такой: как в дельфи создать програму, которая бы автоматически запускалась при старте windows (у меня XP), но при этом не помещая ее в папку startup (автозагрузка)? Возможно ...
Вопрос № 80360: Здравствуйте. Сроки поджимают, помогите ламеру. Просил о помощи, но ответ так и не скомпилировался. Поэтому разбиваю вопрос на маленькие: 1) Как сохранить файл, задав ему имя текущей даты 2)Как создавать папки 3) Как перехватить нажатие к...

Вопрос № 80.269
Здравствуйте.
У меня нависло несколько вопросов.

1) Как запустить консольное приложение с параметрами командной строки. Разумеется из моего приложения надо запускать.

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

3) И вопрос приминимый к 2-м предыдущим. С какими параметрами запустить это приложение чтобы оно не отображалось на панели задач и так же не проскакивало ее окошко. Приложение завершает работу очень быстро так что мелькающее окно мне будет не кстати.
Отправлен: 29.03.2007, 15:05
Вопрос задал: Сарумян (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Сарумян!
1) ShellExecute(Self.Handle либо nil, 'open' либо nil, PChar(путь к приложению, которое надо запустить), pchar(параметры приложения), nil, SW_SHOWHIDE);
3) Последний параметр стоит именно такой, как вам надо.
А вот для 2), наверное, одним ShellExecute обойтись не удастся.
Т.е. можно исхитриться и, например, записать вывод этой программы в файл — добавить к вызову "> file.txt", однако, лушче, конечно, как-дь по-другому это сделать. Через пайпыm например.
Можно попробовать ShellExecuteE.

---------
Не узнаешь - не попробуешь.
Ответ отправил: Сухомлин Кирилл Владимирович (статус: Специалист)
Ответ отправлен: 29.03.2007, 16:12
Оценка за ответ: 5
Комментарий оценки:
Спс. Шеллом запускал и сам до этого, ток не там параметры вводил (...путь,nill,параметры) и последний параметр ставил как SW_Show.
Чет ни в одной литературе нормального описания не нашел. Буду искать на 2 вопрос ответ. Но файл тут не подойдет.

Отвечает: PGM
Здравствуйте, Сарумян!

1) так же как и не консольное - CreateProcess

2) ShowMessage никто не отменял - его можно и в консольном приложении использовать (просто добавить Dialogs), а еще лучше API оконное использовать и MessageBox

3) а зачем его делать консольным в таком случае? Может что-то в терминологии не то? Обычному приложению совершенно необязательно "светиться" на экране. Пока неясна цель, зачем используется именно консольное приложение - трудно дать рекомендации. Если размер - то "чистый" API и будет не хуже консольного.
Ответ отправил: PGM (статус: 2-ой класс)
Ответ отправлен: 30.03.2007, 00:41
Оценка за ответ: 4
Комментарий оценки:
PGM, Вы меня немного не поняли. Я пишу не консольное приложение. Полнофункциональное GUI приложение. Только мне надо чтоб мое приложение запускало уже готовое (не мной и вообще не с моей стране) приложение а оно как ни странно консольное. Так на всякий случай...консольное приложение это сервер Апач. И тут уже ни куда не дется, он консольным и будет.
И размер тут не причем...Пакеры всегда помогут :) 3 Мб. ехе файл сжал недавно до ~400 Кб. Так что обьем не проблема.


Вопрос № 80.287
Здравствуйте!
Вопрос такого плана... Мне нужно сохранить всю файловую структуру диска в отдельный файл. Обьясну по подробней...
Программа на делфи должна сканировать жесткий диск и зписать его структуру в файл. Потом другая (ну не обязательно другая) программа открывает этот файл и воссоздает структуру папок и файлов, которые просматриваются в TreeView и ListView (или ShellListView, по подобию файлового менеджера). Все аттрибуты файлов желательно тоже сохранять.
Я не знаю с чего, собственно, начать. Есть мысль сделать с помощью апишной функции поиска файлов, но это, кажется, слишком муторно, тем более нужно сохранить структуру.
Как можно это реализовать максимально просто и быстро?
P.S. Может записать структуру с компонент, а его сохранить как файл?
Отправлен: 29.03.2007, 16:52
Вопрос задал: Red Spirit (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 6)

Отвечает: PGM
Здравствуйте, Red Spirit!

И чего же тут муторного? Обычный рекурсивный обход дерева каталогов (апишной функцией :)) и сбор всей информации в файл. Считывание с аналогичным рекурсивным добавлением в TreeView. Строк на 10-20 там и там.
Ответ отправил: PGM (статус: 2-ой класс)
Ответ отправлен: 29.03.2007, 18:14
Оценка за ответ: 4
Комментарий оценки:
Хорошо.. тогда открываю все хелпы и мануалы по файловым функциям... просто я думал, что есть какие-нибудь специальные инструменты для этого дела.

Отвечает: Савенко Вадим Иванович
Здравствуйте, Red Spirit!
Вот Вам пример заполнения ListView (5 колонок, стиль - vsReport, сортировка - stData). С таким же успехом можете вместо ListView использовать StringList, например, а потом содержимое StringList сохранить в файл. В общем, вариантов очень много.

Приложение:

Ответ отправил: Савенко Вадим Иванович (статус: Студент)
Ответ отправлен: 30.03.2007, 08:52
Оценка за ответ: 5
Комментарий оценки:
Спасибо за помощь! Существенно облегчили мне жизнь :)


Вопрос № 80.308
Уважаемые эксперты! Покажите пожалуйста на примере, как программно создавать Edit'ы ( то есть не путем бросания на форму, потому что не известно заранее необходимое количество етих Edit'тов, а, например, в цикле).
Отправлен: 29.03.2007, 22:01
Вопрос задал: Богдан (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Gh0stik
Здравствуйте, Богдан!

Вот пример:
procedure TForm1.Button1Click(Sender: TObject);
var i,n:integer;
MyEdit:TEdit;
begin
n:=10;
for i:=1 to n do
begin
MyEdit:=TEdit.Create(self);
MyEdit.Name:=Format('MyEdit%d',[i]);
with TEdit(FindComponent(Format('MyEdit%d',[i]))) do
begin
Parent:=Form1;
Top:=i*30;
Left:=40;
Visible:=true;
end;
end;
end;


По нажатию на кнопку сотворяем 10 Edit-ов. Переменная n - отвечает за количество созданных объектов, ее Вы можете определить в удобное Вам время и месте. :)

Так же рекомендую Вам прочитать ответы на подобный вопрос №79948, а также мини-форум не забудьте прочитать.

Good Luck!!!
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Профессионал)
Украина, Славянск
Организация: Славянский государственный педагогический университет (Кафедра алгебры)
ICQ: 289363162
----
Ответ отправлен: 29.03.2007, 23:12

Отвечает: sir henry
Здравствуйте, Богдан!
Проще, наверное, будет создать массив Edit'ов:

Var
ArrEdit: array of TEdit;
Begin
//Когда определитесь с количеством, то устанавливаете размер массива
SetLength(ArrEdit, 10);
For i:=0 To 9 do
Begin
ArrEdit[i]:=TEdit.Create(Self);
ArrEdit[i].Parent:=Form1;
ArrEdit[i].Top:=Формула_вычисляющая_смещение_от_верхнего_края_формы;
ArrEdit[i].Left:=Формула_вычисляющая_смещение_от_левого_края_формы;
ArrEdit[i].Height:=20;
ArrEdit[i].Width:=100;
//И прочие свойства, отличающиеся от умолчальных
...
End;
End;
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 30.03.2007, 02:44

Отвечает: Gladiator
Здравствуйте, Богдан!

Предложенное Gh0stik

MyEdit.Name:=Format('MyEdit%d',[i]);

вызовет исключение, если MyEdit с таким именем уже существует.
Поэтому рекомендую сделать следующим образом:

try
MyEdit.Name:=Format('MyEdit%d',[i]);
except
Continue;
end;

Исключается вывод на экран сообщения об ошибке и продолжаем выполнение
цикла for со следующего шага.

И ещё, зачем это -
with TEdit(FindComponent(Format('MyEdit%d',[i]))) do

если можно так -
with MyEdit do
Ответ отправил: Gladiator (статус: 9-ый класс)
Ответ отправлен: 30.03.2007, 08:19

Отвечает: PGM
Здравствуйте, Богдан!

Пример

for i := 1 to Count do
with TEdit.Create(Self) do begin
Parent := Self;
// Вместо Self (текущая форма) можно задавать тот компонент, на который надо
// положить Edit - например Panel

Left := 0;
Top := i * 20;
Text := 'Edit ';
// ну и все остальные параметры что надо изменить
// если потом нужно к ним обращаться можно завести список или массив и
// туда заносить - например List.Add(TEdit.Create(Self)) и TEdit(List[i])
end;

Разрушать специально компоненты не обязательно - при создании параметром задается "собственник" (Owner), и все само освободится при освобождении "собственника".
Ответ отправил: PGM (статус: 2-ой класс)
Ответ отправлен: 30.03.2007, 10:23


Вопрос № 80.350
Здраствуйте. Даже не знаю в какой раздел написать этот вопрос. А вопрос такой: как в дельфи создать програму, которая бы автоматически запускалась при старте windows (у меня XP), но при этом не помещая ее в папку startup (автозагрузка)?
Возможно ли такое? Всем заранее спасибо за ответы.
Отправлен: 30.03.2007, 09:57
Вопрос задал: Иван Ивановввв (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

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

HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun

Приложение:

---------
Цени законы своего сердца, иди на обгон! Будь человеком, не запачкай свою совесть!

Ответ отправил: Troyan (статус: 9-ый класс)
Ответ отправлен: 30.03.2007, 10:15

Отвечает: W@NDeReR
Здравствуйте, Иван Ивановввв!
КОнечно возможно вот пример

uses Registry

var
F: TIniFile;
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', 'proga', Application.ExeName);
Regini.Free;
Ответ отправил: W@NDeReR (статус: 2-ой класс)
Ответ отправлен: 30.03.2007, 10:30

Отвечает: PGM
Здравствуйте, Иван Ивановввв!

Есть несколько способов - вот пара самых известных:
- В реестре есть ряд ключей Run (как для отдельного пользователя - HKEY_LOCAL_USER, так и для всех HKEY_LOCAL_MACHINE, SoftwareMicrosoftCurrentVersionRun и RunOnce - если надо только один раз запустить)
- Создать и зарегистрировать приложение как сервис

Это более-менее официальные способы - есть еще ряд способов для писателей вирусов и троянов, но ведь вы не этим занимаетесь? :).

Ответ отправил: PGM (статус: 2-ой класс)
Ответ отправлен: 30.03.2007, 10:33

Отвечает: Gladiator
Здравствуйте, Иван Ивановввв!
Ответ удален, по одной из указанных причин:
- пустой;
- неверный;
- вредный;
- не соответствует вопросу
и помещен для обсуждения в ветку форума "О деятельности экспертов и работе портала/Удаленные ответы для обсуждения".

-~= Gh0stik =~-
Ответ отправил: Gladiator (статус: 9-ый класс)
Ответ отправлен: 30.03.2007, 11:05

Отвечает: ~Steep~
Здравствуйте, Иван Ивановввв!
(повторный ответ)
Возможно просто прописать путь к программе в реестре по ветке
для всех пользователей
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun
для текущего
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun

Приложение:

---------
Все всегда делаеться к Лучшему!

Ответ отправил: ~Steep~ (статус: 5-ый класс)
Ответ отправлен: 30.03.2007, 13:19

Отвечает: Химяк Виктор Васильевич
Здравствуйте, Иван Ивановввв!
Для этого нужно прописать в реестре в ключе SoftwareMicrosoftWindowsCurrentVersionRunOnce название программы. Ниже предложена функция которая это делает:
procedure DoAppToRunOnce(RunName, AppName: string);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
with Reg do
begin
RootKey := HKEY_LOCAL_MACHINE;
OpenKey('SoftwareMicrosoftWindowsCurrentVersionRunOnce', True);
WriteString(RunName, AppName);
CloseKey;
Free;
end;
end;
Вызвать можно так:
DoAppToRun('Programm', 'C:ProgramsXYZProgram.exe');
Пример взят с http://delphiworld.narod.ru. Спасибо Акулову. Н.
Ответ отправил: Химяк Виктор Васильевич (статус: 3-ий класс)
Ответ отправлен: 30.03.2007, 21:47


Вопрос № 80.360
Здравствуйте. Сроки поджимают, помогите ламеру. Просил о помощи, но ответ так и не скомпилировался. Поэтому разбиваю вопрос на маленькие:
1) Как сохранить файл, задав ему имя текущей даты
2)Как создавать папки
3) Как перехватить нажатие клавиши, если прога свёрнута?
Спасибо заранее.
Отправлен: 30.03.2007, 11:06
Вопрос задал: Dende-Soft (статус: 2-ой класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: Gh0stik
Здравствуйте, Dende-Soft!

Ответы на первые два пункта:

procedure TForm1.Button19Click(Sender: TObject);
var tFrm:TFormatSettings;
flName,dirName:String;
fhnd:integer;
begin
tFrm.LongTimeFormat:='dd_MM_yyyy'; {создаем пользовательский формат вывода даты}
flName:=DateToStr(now,tFrm)+'.txt'; {имя файла}
dirName:=ExtractFilePath(Application.ExeName)+'temp'; {название директории относительно папки запуска программы}
{================ пункт I ========================}

if not DirectoryExists(dirName) {проверяем на существование}
then CreateDir(dirName) {создаем директорию}
else ShowMessage('Cannot create directory: '+dirName);

{================ пункт II ========================}
if not FileExists(dirName+flName) {проверяем файл на существование}
then
begin
fhnd:=FileCreate(dirName+flName); {создаем файл}
FileClose(fhnd); {и сразу его закрываем}
end
else ShowMessage('Cannot create file: '+flName);
end;


3) Вам необходимо будет создать свой hook, рекомендую почитать такую статью.

Good Luck!!!
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Профессионал)
Украина, Славянск
Организация: Славянский государственный педагогический университет (Кафедра алгебры)
ICQ: 289363162
----
Ответ отправлен: 30.03.2007, 12:12
Оценка за ответ: 5
Комментарий оценки:
Спасибо, хороший ответ. Вот только для моего ума не подходит последняя стать))) Но всё-равно спасибо

Отвечает: василий1
Здравствуйте, Dende-Soft!

//создавать папки оч просто

function CreateDirEx(Dir: string): Boolean;
var
I, L: Integer;
CurDir: string;
begin
if ExcludeTrailingBackslash(Dir) = '' then
exit;
Dir := IncludeTrailingBackslash(Dir);
L := Length(Dir);
for I := 1 to L do
begin
CurDir := CurDir + Dir[I];
if Dir[I] = '' then
begin
if not DirectoryExists(CurDir) then
if not CreateDir(CurDir) then
Exit;
end;
end;
Result := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
CreateDirEx('c: est est1 est2'); // будет создан весь путь, если уже существует
//ошибки не вылезет
end;

Ответ отправил: василий1 (статус: 2-ой класс)
Ответ отправлен: 30.03.2007, 15:41


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.46 от 18.03.2007
Яндекс Rambler's Top100

В избранное