Форум: "Начинающим";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
ВнизПожалуйста, помогите организовать цикл! Найти похожие ветки
← →
Pretender © (2006-04-11 11:51) [0]Доброго времнени суток всем! Я хочу написать программу, которая формировала бы письма с вложениями и ложила их в активный ящик. Количество файлов задается вручную, из формы. У меня возникла проблема с формированием цикла. Вот часть кода:
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. Как это реализовать? Я уже совсем запутался... :(
← →
tsa (2006-04-11 11:52) [1]Спамеры обнаглели!
← →
Вот так (2006-04-11 12:08) [2]
for i:=n downto 1 do begin
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;
← →
tsa (2006-04-11 12:10) [3]
> [2] Вот так (11.04.06 12:08)
А ещё можно поливать пивом из пульверизатора тополя
← →
Pretender © (2006-04-11 13:13) [4]
> Спамеры обнаглели!
Уважемый, я с Вами не знаком, поэтому скажу просто: не гоните! Я симтемный администратор и эта программа не для организации массовых рассылок, а для отправки пополнения нашим клиентам.
> for i:=n downto 1 do begin
>
> 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;
Вот спасибо, на работу приду - попробую.
← →
Pretender © (2006-04-11 14:22) [5]Гм. Это поборол... А в ящик активный не кладётся... Куда посмотреть?
← →
Anatoly Podgoretsky © (2006-04-11 14:37) [6]Пригласите программиста, а не системного администратора.
← →
Pretender © (2006-04-11 14:39) [7]Да я сам разобраться хочу...
← →
Anatoly Podgoretsky © (2006-04-11 14:46) [8]Это долго
← →
Сергей М. © (2006-04-11 14:48) [9]
> в ящик активный не кладётся
Что есть "активный ящик" и где в своем коде ты в него пытаешься что-то "накласть" ?
← →
Pretender © (2006-04-11 14:54) [10]Активный ящик - у меня TheBat висит в трее, в нем ящик с каталогом "Исходящие", в этот каталог письмо и должно попасть.
← →
Сергей М. © (2006-04-11 15:01) [11]
> Pretender © (11.04.06 14:54) [10]
Не в ту сторону копаешь.
IdSMTP знать не знает ни про какие TheBat и знать не обязан.
← →
Pretender © (2006-04-11 15:07) [12]А каким образом сформированное сообщение попадёт в каталог "Исходящие"? Вот, допустим, консольная версия архиватора rar при задании сооответствующего параметра в командной строке, архивированные файлы пихает прямо в "Исходящие". Как это можно реализовать?
А в коде естественно ничего нет, я пока не знаю как это делать :)
← →
Сергей М. © (2006-04-11 15:26) [13]
> А каким образом сформированное сообщение попадёт в каталог
> "Исходящие"?
> консольная версия архиватора rar при задании сооответствующего параметра в > командной строке, архивированные файлы пихает прямо в "Исходящие"
Средствами MapiSendMail().
Это ф-ция фигурирует в составе MS MAPI, к коему IdSMTP не имеет ни малейшего отношения - компонент этот работает с SMTP-сервисом напрямую, минуя любой из прочих SMTP-клиентов, установленных в системе.
Говорят же тебе - найми программиста, не парься)
← →
Pretender © (2006-04-11 16:07) [14]
> найми программиста
Не, я не работодатель, чтоб людей нанимать, это так, чисто для себя. Что ж, спасибо за помосщь, буду сам разбираться.
← →
tsa (2006-04-11 16:16) [15]Это не правильный системный администратор.
← →
Pretender © (2006-04-12 12:46) [16]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). Как это корректно реализовать?
← →
Старик (2006-04-12 12:57) [17]Ну... рассылку клиентам организовать... тут два варианта:
1. Твоя прога сама напрямую на мыло высылает сформированные письма. Это, имхо, лучший вариант. Пример на отслыку почты есть в демках делфи.
2. С другой стороны, если тебе нужно, чтобы твои сформированные письма появлялись именно в Бате и именно в его ящике... я вижу только один способ - редактировать соответствующий файл у Бата - он свои почтовые архивы хранит у себя в директории. Вот один из тех файликов и надо редактировать. А потом не забыть перегрузить Бата.
← →
Pretender © (2006-04-12 14:02) [18]Старик
Да я практически всё сделал, только непонятно, почему при первом нажатии инишка читается, а при втором и т.д. уже нет - вот в чём вопрос.
← →
Anatoly Podgoretsky © (2006-04-12 14:10) [19]Pretender © (12.04.06 14:02) [18]
С инишками так не работаютAssignFile(F1,"sm.ini");
Reset(F1);
← →
Pretender © (2006-04-12 14:34) [20]Anatoly Podgoretsky
Делал я так, тоже самое. Верней эксепшн возникает на CloseFile(F1), если CloseFile(F1) не ставить, письма второй раз не генерятся.
← →
Kolan © (2006-04-12 14:35) [21]
С инишками так не работают
AssignFile(F1,"sm.ini");
Reset(F1);
Есть класс TIniFile...
← →
Pretender © (2006-04-12 15:34) [22]Вот что я сделал:
В процедуре 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 не заносятся... А почему?
← →
Pretender © (2006-04-13 08:24) [23]Всё просто оказалось, нужно вписать ExtractFilePath(Application.Exename) и всё работает. Да... господа профи, хорошо же вы новичкам помогаете, ничего не скажешь. :)
← →
balepa © (2006-04-13 08:26) [24]Да, они такие
← →
Pretender © (2006-04-13 09:58) [25]Нет, без обид только. Просто я сравниваю как сисадмины помогают начинающим - если вопрос задан по существу, тебе на него ответят. А тут почему-то нет. Хотя... С сабжем помогли, а всё остальное - это уже другая песня :)
← →
Anatoly Podgoretsky © (2006-04-13 10:37) [26]Pretender © (13.04.06 09:58) [25]
Программисты такие же, если вопрос задан по существу, тебе на него ответят.
← →
Pretender © (2006-04-13 11:51) [27]Ок. Тогда вопрос по существу :):
как с помощью FindFirst, FindNext и FindClose организовать поиск архивов по маске popoln*.part*.rar и по завершении поиска занести их количество в переменную n?
← →
Anatoly Podgoretsky © (2006-04-13 11:58) [28]Pretender © (13.04.06 11:51) [27]
Это есть в справке
← →
Pretender © (2006-04-13 12:57) [29]Вот что я сделал пока:
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 13:04) [30]Точку останова поставь.
Код не понятный, что ты хочешь сделать?
← →
Плохиш © (2006-04-13 13:11) [31]
> Pretender © (13.04.06 12:57) [29]
if (sr.Attr and faArchive) = faArchive then
← →
Anatoly Podgoretsky © (2006-04-13 13:23) [32]Плохиш © (13.04.06 13:11) [31]
Но это же противоположный результат, чем в коде
← →
Плохиш © (2006-04-13 13:26) [33]
> Anatoly Podgoretsky © (13.04.06 13:23) [32]
А я телепатор из ремонта в n-й раз получил, проверяю ;-)
← →
Pretender © (2006-04-13 13:32) [34]
> А я телепатор из ремонта в n-й раз получил, проверяю
:)))
Anatoly Podgoretsky
Пытаюсь найти архивный файл и при нахождении оного прибавить n на единицу, а в Label3 занести имя файла (хоть какого-нибудь, наверно это будет последний файл) - если я правильно понял пример. Что значит точка останова - брейкпойнт? Дело в том, что и в справке и в книге, в которой я смотрю пример использования, примеры сделаны ацтойно (не исключаю и свою глупую голову)...
← →
Pretender © (2006-04-13 14:09) [35]Да, st2 содержит путь к папке, в которой эти архивы лежат (берется из ини файла).
← →
Anatoly Podgoretsky © (2006-04-13 14:21) [36]Pretender © (13.04.06 13:32) [34]
1. Тогда согласно телепатору от Плохиша.
2. N := N + 1
3. Label3.Caption := sr.Name;
4. это в отладчике, нажимаешь F5 программа остановится в этой точке
5. примеры сделаны нормально, но если не устраивают, то ко мне на сайт, там самая правильная версия по данному вопросу.
← →
Pretender © (2006-04-13 14:42) [37]Это DirScan или File Size Analyzer? П. 2-3 к чему? Сделал
if (sr.Attr and faArchive) = faArchive then
в n занеслось 1, в labelCaption занеслось пустое место, т.е. ничего.
← →
Anatoly Podgoretsky © (2006-04-13 14:54) [38]Ни то ни другое, это программы - очень старые не оптимальные, на сайте есть FAQ из ФИДО, вот его смотреть, при том найдешь ответы и на другие вопросы. Кроме это могут быть полезны две статьи
1. Двоичная математика, работа с битовой логикой
2. Работа с файлами Паскаля
Пункт 2 и 3 к тому, что ты про них спросил.
← →
Плохиш © (2006-04-13 15:00) [39]
> в n занеслось 1, в labelCaption занеслось пустое место,
> т.е. ничего.
Даю 98%, что туда занеслась точка.
← →
Pretender © (2006-04-13 15:13) [40]
> Даю 98%, что туда занеслась точка.
Нет, просто пустое место.
Anatoly Podgoretsky
Пошёл искать.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.011 c