Форум: "Начинающим";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
ВнизПожалуйста, помогите организовать цикл! Найти похожие ветки
← →
Pretender © (2006-04-13 15:13) [40]
> Даю 98%, что туда занеслась точка.
Нет, просто пустое место.
Anatoly Podgoretsky
Пошёл искать.
← →
Pretender © (2006-04-13 16:06) [41]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;
← →
Anatoly Podgoretsky © (2006-04-13 16:16) [42]Это может работать, а может не работать, а в FAQ есть стопроцентно рабочий вариант от Юрия Зотова.
← →
Pretender © (2006-04-13 16:22) [43]
> Anatoly Podgoretsky
Да оно-то работает! :) Как раз от Ю.Зотова. Только я не понимаю принцип, вот и всё. Поэтому прошу объяснить. если не трудно.
← →
Pretender © (2006-04-13 16:25) [44]Ой. Не Зотова, а Леонида Трояновского.
← →
Anatoly Podgoretsky © (2006-04-13 16:37) [45]Используй Зотова
← →
Pretender © (2006-04-13 16:42) [46]Пардон, почему? Работает же. В том виде, в котором я привёл. Я потом делаю n:=ListBox1.Items.Count; и, соответственно, по количеству итемов генерирую соответствующее количество писем. Я просто прошу объяснить как это работает (оно работает, но хочется до конца разобраться).
← →
Anatoly Podgoretsky © (2006-04-13 16:50) [47]Работает, но не во всех случаях.
А объяснять что, там все понятно, а что тебе не понятно ты не говоришь.
Вернись к предметному разговору и тебе расскажут.
← →
Pretender © (2006-04-13 18:49) [48]Что не понятно я в комментах написал со знаком "?". А на сайте Вашем действительно много полезной информации, потавлю ночью кое-что на закачку.
← →
Anatoly Podgoretsky © (2006-04-13 22:13) [49]Это рекурсивный поиск. Рекурсия это такая штука, когда из себя вызываешь себя.
← →
Pretender © (2006-04-14 10:26) [50]Странно, выявилась еще одна проблема: при первом нажатии на кнопку архив пакуется частями (свойство 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;
← →
Жуков Олег (2006-04-14 10:46) [51]Ничего не понял, но ShellExecute+Sleep тут - потенциальный источник багов. Вместо них CreateProcess+WaitForSingleObject.
← →
Pretender © (2006-04-14 11:19) [52]Сделал CreateProcess(Pchar("rar.exe"),"e -y *.rar","");, а отладчик ругается Incompatible types: "String" and "PSecurityAttributes"? Это на какой параметр - на первые два?
← →
Virgo_Style © (2006-04-14 13:35) [53]Pretender © (14.04.06 11:19) [52]
Класс. 5 баллов. F1 читайте, если нету - пойдите и плюньте тому, у кого купили, если языка не знаете - учите.
← →
Pretender © (2006-04-14 14:17) [54]Вот что напсано по поводу этого по 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 вообще ничего нет.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.01 c