Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пожалуйста, помогите организовать цикл!


Страницы:   1 2 3

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]

Это не правильный системный администратор.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо