![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пожалуйста, помогите организовать цикл!
Pretender © (2006-04-11 11:51:00)Доброго времнени суток всем! Я хочу написать программу, которая формировала бы письма с вложениями и ложила их в активный ящик. Количество файлов задается вручную, из формы. У меня возникла проблема с формированием цикла. Вот часть кода:
procedure TForm1.Button1Click(Sender: TObject);
var i,n: integer;
F1: TextFile;
St1: String;
begin
n:=StrToInt(Edit1.Text);
AssignFile(F1,'sm.ini');
Reset(F1);
Readln(F1,st1);
for i:=n downto 1 do
IdMessage1.Recipients.EMailAddresses:=st1;
IdMessage1.CharSet:='Windows-1251';
IdMessage1.ContentType:='text/plain';
idMessage1.Subject:='Пополение (часть ' + IntTostr(i) + ' из ' + IntTostr(n) + ')' ;
for i:=n downto 1 do Memo1.Lines.Insert(0,'Сформирован файл пополения № ' + IntTostr(i));
end;
Вот как сделать, чтобы последовательно формировалось сообщение от 1 до n (n вводится вручную). Т.е. сначала создается объкт - само сообщение, затем последовательно заполняется адрес (из ini-файла), тема (тоже генерируется соответствующие цифры в теме), присоединяется файл и письмо ложится в активный ящик (не отправляется, просто ложится), а затем формируется новое сообщение т.д. до n. Как это реализовать? Я уже совсем запутался... :(
Pretender (2006-04-13 13:32:00) [21]
> А я телепатор из ремонта в n-й раз получил, проверяю
:)))
Anatoly Podgoretsky
Пытаюсь найти архивный файл и при нахождении оного прибавить n на единицу, а в Label3 занести имя файла (хоть какого-нибудь, наверно это будет последний файл) - если я правильно понял пример. Что значит точка останова - брейкпойнт? Дело в том, что и в справке и в книге, в которой я смотрю пример использования, примеры сделаны ацтойно (не исключаю и свою глупую голову)...
Плохиш (2006-04-13 13:26:00) [22]
> Anatoly Podgoretsky © (13.04.06 13:23) [32]
А я телепатор из ремонта в n-й раз получил, проверяю ;-)
Anatoly Podgoretsky (2006-04-13 13:23:00) [23]Плохиш © (13.04.06 13:11) [31]
Но это же противоположный результат, чем в коде
Плохиш (2006-04-13 13:11:00) [24]
> Pretender © (13.04.06 12:57) [29]
if (sr.Attr and faArchive) = faArchivethen
Anatoly Podgoretsky (2006-04-13 13:04:00) [25]Точку останова поставь.
Код не понятный, что ты хочешь сделать?
Pretender (2006-04-13 12:57:00) [26]Вот что я сделал пока:
if FindFirst(st2, faArchive, SR) = 0 then
n := 0;
begin
repeat
if (sr.Attr and faArchive) = sr.Attr then
begin
n := n + 1;
label3.Caption:= sr.Name;
end;
until FindNext(SR) <> 0;
FindClose(SR);
end;
Но почему-то в label3.Caption имя файла не заносится...
Anatoly Podgoretsky (2006-04-13 11:58:00) [27]Pretender © (13.04.06 11:51) [27]
Это есть в справке
Pretender (2006-04-13 11:51:00) [28]Ок. Тогда вопрос по существу :):
как с помощью FindFirst, FindNext и FindClose организовать поиск архивов по маске popoln*.part*.rar и по завершении поиска занести их количество в переменную n?
Anatoly Podgoretsky (2006-04-13 10:37:00) [29]Pretender © (13.04.06 09:58) [25]
Программисты такие же, если вопрос задан по существу, тебе на него ответят.
Pretender (2006-04-13 09:58:00) [30]Нет, без обид только. Просто я сравниваю как сисадмины помогают начинающим - если вопрос задан по существу, тебе на него ответят. А тут почему-то нет. Хотя... С сабжем помогли, а всё остальное - это уже другая песня :)
balepa (2006-04-13 08:26:00) [31]Да, они такие
Pretender (2006-04-13 08:24:00) [32]Всё просто оказалось, нужно вписать ExtractFilePath(Application.Exename) и всё работает. Да... господа профи, хорошо же вы новичкам помогаете, ничего не скажешь. :)
Pretender (2006-04-12 15:34:00) [33]Вот что я сделал:
В процедуре Button1Click добавил
var Cfg: TIniFile;
begin
Cfg:=TIniFile.Create('sm.ini');
st1:=Cfg.ReadString('Config','Addr','');
st2:=Cfg.ReadString('Config','Path','');
.....
Инишка выглядит так
[Config]
Addr=user@xyz.com
Path=C:\1
Так вот, эти значения в переменные st1, st2 не заносятся... А почему?
Kolan (2006-04-12 14:35:00) [34]
С инишками так не работают
AssignFile(F1,'sm.ini');
Reset(F1);
Есть класс TIniFile...
Pretender (2006-04-12 14:34:00) [35]Anatoly Podgoretsky
Делал я так, тоже самое. Верней эксепшн возникает на CloseFile(F1), если CloseFile(F1) не ставить, письма второй раз не генерятся.
Anatoly Podgoretsky (2006-04-12 14:10:00) [36]Pretender © (12.04.06 14:02) [18]
С инишками так не работают
AssignFile(F1,'sm.ini');
Reset(F1);
Pretender (2006-04-12 14:02:00) [37]Старик
Да я практически всё сделал, только непонятно, почему при первом нажатии инишка читается, а при втором и т.д. уже нет - вот в чём вопрос.
Старик (2006-04-12 12:57:00) [38]Ну... рассылку клиентам организовать... тут два варианта:
1. Твоя прога сама напрямую на мыло высылает сформированные письма. Это, имхо, лучший вариант. Пример на отслыку почты есть в демках делфи.
2. С другой стороны, если тебе нужно, чтобы твои сформированные письма появлялись именно в Бате и именно в его ящике... я вижу только один способ - редактировать соответствующий файл у Бата - он свои почтовые архивы хранит у себя в директории. Вот один из тех файликов и надо редактировать. А потом не забыть перегрузить Бата.
Pretender (2006-04-12 12:46:00) [39]rocedure TForm1.Button1Click(Sender: TObject);
var i,n,k: integer;
F: TextFile;
St1,St2: String;
mail: TStringList;
begin
ShellExecute(Application.MainForm.Handle,nil,Pchar('rar.exe'),'e -y *.rar',nil,SW_ShowNormal);
if StrToInt(Edit1.Text)>1 then
ShellExecute(Application.MainForm.Handle,nil,Pchar('rar.exe'),'m -y -m5 -v1000 -ag0M0A popoln *.ans',nil,SW_ShowNormal) else
ShellExecute(Application.MainForm.Handle,nil,Pchar('rar.exe'),'m -y -m5 -ag0M0A popoln *.ans',nil,SW_ShowNormal);
n:=StrToInt(Edit1.Text);
AssignFile(F,'sm.ini');
Reset(F);
Readln(F,st1);
Readln(F,st2);
for i:=1 to n do begin
mail := TStringList.Create;
try
mail.values['to'] := st1;
mail.values['subject'] := 'Пополнение (часть ' + IntTostr(i) + ' из ' + IntTostr(n) + ')';
mail.values['body'] := 'Test';
mail.values['attachment0'] := st2 + '\Test.txt';
sendEMail(Application.Handle, mail);
finally
mail.Free;
for k:=n downto 1 do Memo1.Lines.Insert(0,'Сформировано письмо № ' + IntTostr(k));
end;
CloseFile(F);
end;
Теперь проблема в том, что первый раз параметры st1 и st2 берутся из файла нормамально, а если (не закрывая проекта) нажать ещё раз кнопку Button1, то приложение вылетает с эксепшеном "Project Project1.exe raised exception class EInOutError with message 'I/O error 103'" на строчке CloseFile(F). Как это корректно реализовать?
tsa (2006-04-11 16:16:00) [40]Это не правильный системный администратор.