![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Код на обсуждение
koha © (2007-08-10 01:55:00)
{---------------------------- AddFilesFromDir ---------------------------------}
procedure TMainForm.AddFiles(Sender: TObject);
Var
i,cont,conter : Integer;
BakLst,FilesLst : TStrings;
FT : TFindThread;
FileVerInfo : TFileVerInfo;
AddDir,KBNum : String;
begin
BakLst := TStringList.Create;
FilesLst := TStringList.Create;
try
if (sender is TAction) then begin
if (Sender as TAction).Name = Act_AddDir.Name then begin
if Not SelectDirectory('Выбор директории с файлами обновления', 'CurDir',AddDir) then exit;
FT:=TFindThread.Create(AddDir,'*.exe',FilesLst,Act_FindSubDir.Checked);
while FT.FStatEnd <> true do Application.ProcessMessages;
FT.Free;
if FilesLst.Count = 0 then exit;
end;
if (Sender as TAction).Name = Act_AddFiles.Name then begin
OpenDlg.Filter:='Exe-files *.exe|*.exe';
if Not OpenDlg.Execute then exit;
FilesLst.AddStrings(OpenDlg.Files);
end;
end;
if (Sender is Tform) then begin
FT:=TFindThread.Create(CurPath,'*.exe',FilesLst,Act_FindSubDir.Checked);
while FT.FStatEnd <> true do Application.ProcessMessages;
FT.Free;
if FilesLst.Count = 0 then exit;
end;
i := FilesLst.IndexOf(ParamStr(0));
if Not (i = -1) then FilesLst.Delete(i);
for I := 0 to LV.items.Count -1 do BakLst.Add(LV.Items[i].Caption);
// можно ли как-нибудь другим способом поместь содержимое колонки?
// в TStringList
conter := 0;
while FilesLst.Count <> conter do begin
// фильтруем от повторяющихся файлов
if BakLst.IndexOf(FilesLst.Strings[conter]) <> -1 then begin
FilesLst.Delete(conter);
continue;
end;
New(FileVerInfo); // Можно ли это сделать до цикла один раз,
//а не каждый раз в цикле?
if GetFileVerInfo(FilesLst.Strings[conter],FileVerInfo) then begin
if Act_AddFilesALL.Checked then
FileVerInfoLst.Add(FileVerInfo)
else begin
if HotFixFilter(FileVerInfo) then begin
FileVerInfoLst.Add(FileVerInfo);
mm.Lines.Add(FilesLst.Strings[conter]);
end
else begin
FilesLst.Delete(conter);
continue;
end;
end;
end
else begin
if Act_AddFilesALL.Checked then
FileVerInfoLst.Add(FileVerInfo)
else begin
FilesLst.Delete(conter);
continue;
end;
end;
NewItem:=LV.Items.Add;
with NewItem do begin
Caption:=FilesLst.Strings[conter];
AddIconToListView(FilesLst.Strings[conter]); //add icons
KBNum:='';
if (FileVerInfo.KBArticleNumber <> '') and
(Length(FileVerInfo.KBArticleNumber) = 6) then
KBNum:=FileVerInfo.KBArticleNumber
else KBNum:=GetKBArtikleFromName(FilesLst.Strings[conter]);
If (KBNum <> '') and (Length(KBNum) = 6) then begin
if (FindRegistry(Updates,KBNum) = true) or //then begin
(FindRegistry(Uninstall,KBNum) = true) then begin
StateIndex:=0;
SubItems.Add('Установлено'); //add status
end else begin
StateIndex:=1;
SubItems.Add('Hеутановлено');
end;
end else begin
StateIndex:=1;
SubItems.Add('Нет информации');
end;
SubItems.Add(FileVerInfo.KBArticleNumber); // Build Date
SubItems.Add(FileVerInfo.FileDescription);
SubItems.Add(FileVerInfo.ProductName);
SubItems.Add(FileVerInfo.AppliesTo);
SubItems.Add(FileVerInfo.SupportLink);
end;
Inc(conter);
end;
finally
mm.Lines.Add('LV.Items.Count = '+IntToStr(LV.Items.Count));
mm.Lines.Add('FileVerInfoLst.Count = '+IntToStr(FileVerInfoLst.Count));
//mm.Lines.Add('FileVerInfoLst.Count = '+FilesLst.Strings[0]);
//mm.Lines.Add('FileVerInfoLst.Count = '+FilesLst.Strings[1]);
BakLst.Free;
FilesLst.Free;
end;
end;
koha (2007-08-11 09:25:00) [1]
> Loginov Dmitry © (11.08.07 00:08) [8]
- конечно извиняюсь за глупый вопрос.
- я почему-то думал, что метод TList.add(); умеет сам автоматом выделять память или копировать структуру. Да, лезут же такие глупости в голову.
Loginov Dmitry (2007-08-11 00:08:00) [2]> Вот вопрос: нужно ли каждый раз при добавлении в список
> указателя делать New
Конечно нужно. В противном случае ты каждый раз при вызове GetFileVerInfo будешь изменять поля одной и той же структуры. Указатель FileVerInfo будет для всех элементов списка иметь одно и тоже значение, а сведения запомнятся только для самого последнего файла из FilesLst.
koha (2007-08-10 22:02:00) [3]
> Loginov Dmitry © (10.08.07 20:12) [6]
- ты прав, я далеко не.......
но вот, что интересует: eсть указатель на структуру FileVerInfo: TFileVerInfo, который должен быть PFileVerInfo и есть список указателей TList в который добавляется указатель на структуру. Вот вопрос: нужно ли каждый раз при добавлении в список указателя делать New(FileVerInfo);
while FilesLst.Count <> conter do
begin
New(FileVerInfo);
FileVerInfoLst.Add(FileVerInfo);
//...............
Inc(conter);
end;
или можно сделать один раз перед циклом? (кстати то же работает)
New(FileVerInfo);
while FilesLst.Count <> conter do
begin
FileVerInfoLst.Add(FileVerInfo);
//...............
Inc(conter);
end;
Loginov Dmitry (2007-08-10 20:12:00) [4]> FileVerInfo : TFileVerInfo;
Что такое TFileVerInfo? Используешь New(FileVerInfo); Значит TFileVerInfo - тип - указатель на соответствующую структуру. Тогда почему "T" а не "P"? При таком стиле в этом коде фик кто разберется, кроме его создателя.
А так обсуждать тут в общем-то нечего. Код новичка с изрядной долей каши в голове.
koha (2007-08-10 13:20:00) [5]
> Slym © (10.08.07 05:11) [1]
- это понял.
> Slym © (10.08.07 05:14) [2]
> if (FindRegistry(Updates,KBNum) = true)
> ===
> if (FindRegistry(Updates,KBNum))
в моем случае в нутри функции такая конструкция:
myfunk: boolean;
begin
//................
end;
- это почему-то не срабатывает, как ты показываешь наверно потому, что result не проинициализирован.
в твоем случае срабатывает если соблюдается такая конструкция в нутри функции:
myfunk: boolean;
begin
result:=false;
//................
end;
по другому почемуто не работает.
> Slym © (10.08.07 05:15) [3]
-это, так левый код при отладке нужен был, заблудился - забыл удалить.
MsGuns (2007-08-10 08:22:00) [6]Код как код. Обычный уровень новичка
Slym (2007-08-10 05:15:00) [7]
finally
mm.Lines.Add('LV.Items.Count = '+IntToStr(LV.Items.Count));
mm.Lines.Add('FileVerInfoLst.Count = '+IntToStr(FileVerInfoLst.Count));
finally в данном случае точно не для этого
Slym (2007-08-10 05:14:00) [8]
if (FindRegistry(Updates,KBNum) = true)
===
if (FindRegistry(Updates,KBNum))
Slym (2007-08-10 05:11:00) [9]
FT:=TFindThread.Create(...);
try
while FT.FStatEnd <> true do Application.ProcessMessages;
finally
FT.Free;