![]() |
| ||
|
|
Новости |
Поиск |
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-14 14:17:00) [1]Вот что напсано по поводу этого по F1:
Delphi syntax:
procedure CreateProcess(const ExeName, Args: string; const RemoteHost: string = '');
Description
CreateProcess starts a process for debugging.
The ExeName parameter is the path to the executable file to run.
The Args parameter is the command line to pass to the executable. It can be an empty string if there are no arguments.
The RemoteHost parameter is the name of the host where the process should run. The empty string means to use the local host.
The process is created and initially stopped at the main module’s entry point. After the debugger notifier receives the ProcessCreated notification, your wizard can leave the process in its stopped state or run the process.
И всё. Про WaitForSingleObject вообще ничего нет.
Virgo_Style (2006-04-14 13:35:00) [2]Pretender © (14.04.06 11:19) [52]
Класс. 5 баллов. F1 читайте, если нету - пойдите и плюньте тому, у кого купили, если языка не знаете - учите.
Pretender (2006-04-14 11:19:00) [3]Сделал CreateProcess(Pchar('rar.exe'),'e -y *.rar','');, а отладчик ругается Incompatible types: 'String' and 'PSecurityAttributes'? Это на какой параметр - на первые два?
Жуков Олег (2006-04-14 10:46:00) [4]Ничего не понял, но ShellExecute+Sleep тут - потенциальный источник багов. Вместо них CreateProcess+WaitForSingleObject.
Pretender (2006-04-14 10:26:00) [5]Странно, выявилась еще одна проблема: при первом нажатии на кнопку архив пакуется частями (свойство CheckBox1.Checked=True), формируется необходимое количество писем; а если сделать CheckBox1.Checked=False (т.е. снять флажок - соответствует одному архиву) и нажать второй раз, то ничего не происходит - мелькает окно архиватора, а в n заносится значение 0. Тоже происходит при CheckBox1.Checked=True если удалить архивный файл(ы). В чём проблема?
procedure TForm1.Button1Click(Sender: TObject);
var i,n,k: integer;
St1,St2: String;
mail: TStringList;
Cfg: TIniFile;
//SR: TSearchRec;
begin
Cfg:=TIniFile.Create(ExtractFilePath(Application.Exename) + 'sm.ini');
if RadioButton1.Checked=True then st1:=Cfg.ReadString('Config','Addr1','') else
if RadioButton2.Checked=True then st1:=Cfg.ReadString('Config','Addr2','');
st2:=Cfg.ReadString('Config','Path','');
Cfg.Free;
ShellExecute(Application.MainForm.Handle,nil,Pchar('rar.exe'),'e -y *.rar',nil,SW_ShowMaximized);
Sleep(1000);
if CheckBox1.Checked=True then
ShellExecute(Application.MainForm.Handle,nil,Pchar('rar.exe'),'m -y -m5 -v1000 -ag0M0A popoln *.dbf',nil,SW_ShowMaximized);
if CheckBox1.Checked=False then
ShellExecute(Application.MainForm.Handle,nil,Pchar('rar.exe'),'m -y -m5 -ag0M0A popoln *.dbf',nil,SW_ShowMaximized);
ListBox1.Items.Clear;
if CheckBox1.Checked=True then ScanDir1(st2,'',ListBox1.Items)
else
ScanDir2(st2,'',ListBox1.Items);
n:=ListBox1.Items.Count;
label3.caption:=inttostr(n);
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;
end;
Anatoly Podgoretsky (2006-04-13 22:13:00) [6]Это рекурсивный поиск. Рекурсия это такая штука, когда из себя вызываешь себя.
Pretender (2006-04-13 18:49:00) [7]Что не понятно я в комментах написал со знаком "?". А на сайте Вашем действительно много полезной информации, потавлю ночью кое-что на закачку.
Anatoly Podgoretsky (2006-04-13 16:50:00) [8]Работает, но не во всех случаях.
А объяснять что, там все понятно, а что тебе не понятно ты не говоришь.
Вернись к предметному разговору и тебе расскажут.
Pretender (2006-04-13 16:42:00) [9]Пардон, почему? Работает же. В том виде, в котором я привёл. Я потом делаю n:=ListBox1.Items.Count; и, соответственно, по количеству итемов генерирую соответствующее количество писем. Я просто прошу объяснить как это работает (оно работает, но хочется до конца разобраться).
Anatoly Podgoretsky (2006-04-13 16:37:00) [10]Используй Зотова
Pretender (2006-04-13 16:25:00) [11]Ой. Не Зотова, а Леонида Трояновского.
Pretender (2006-04-13 16:22:00) [12]
> Anatoly Podgoretsky
Да оно-то работает! :) Как раз от Ю.Зотова. Только я не понимаю принцип, вот и всё. Поэтому прошу объяснить. если не трудно.
Anatoly Podgoretsky (2006-04-13 16:16:00) [13]Это может работать, а может не работать, а в FAQ есть стопроцентно рабочий вариант от Юрия Зотова.
Pretender (2006-04-13 16:06:00) [14]Anatoly Podgoretsky
Объясните пожалуйста, как это работает:
procedure ScanDir(StartDir: string; Mask:string; List:TStrings);
var
SearchRec : TSearchRec;
begin
if Mask = '' then Mask := 'popoln*.part*.r*'; //ну это параметр маски файла
if StartDir[Length(StartDir)] <> '\' then StartDir := StartDir + '\'; // это
даёт корневой каталог, хотя я не понял что даёт StartDir[число]
if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then //если нет
найденных файлов, то запустить поиск ?
begin
repeat
Application.ProcessMessages;
if (SearchRec.Attr and faDirectory) <> faDirectory then // ?
List.Add(StartDir + SearchRec.Name)
else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
List.Add(StartDir + SearchRec.Name + '\'); //почему тут \
ScanDir(StartDir + SearchRec.Name + '\',Mask,List); //тут опять эта функция вызывается?
end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
Вообщем, как это работает?
end;
Pretender (2006-04-13 15:13:00) [15]
> Даю 98%, что туда занеслась точка.
Нет, просто пустое место.
Anatoly Podgoretsky
Пошёл искать.
Плохиш (2006-04-13 15:00:00) [16]
> в n занеслось 1, в labelCaption занеслось пустое место,
> т.е. ничего.
Даю 98%, что туда занеслась точка.
Anatoly Podgoretsky (2006-04-13 14:54:00) [17]Ни то ни другое, это программы - очень старые не оптимальные, на сайте есть FAQ из ФИДО, вот его смотреть, при том найдешь ответы и на другие вопросы. Кроме это могут быть полезны две статьи
1. Двоичная математика, работа с битовой логикой
2. Работа с файлами Паскаля
Пункт 2 и 3 к тому, что ты про них спросил.
Pretender (2006-04-13 14:42:00) [18]Это DirScan или File Size Analyzer? П. 2-3 к чему? Сделал
if (sr.Attr and faArchive) = faArchive then
в n занеслось 1, в labelCaption занеслось пустое место, т.е. ничего.
Anatoly Podgoretsky (2006-04-13 14:21:00) [19]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:09:00) [20]Да, st2 содержит путь к папке, в которой эти архивы лежат (берется из ини файла).