Вопрос № 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 с таким именем уже существует.
Поэтому рекомендую сделать следующим образом:
Исключается вывод на экран сообщения об ошибке и продолжаем выполнение
цикла 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 (автозагрузка)?
Возможно ли такое? Всем заранее спасибо за ответы.
Отвечает: Troyan
Здравствуйте, Иван Ивановввв!
Это можно сделать несколькими способами, но наиболее оптимальный - занесение файла в автозапуск реестра, который находится по следующему адресу:
--------- Цени законы своего сердца, иди на обгон! Будь человеком, не запачкай свою совесть!
Ответ отправил: 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 (статус: 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