Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: CL | DM;

Вниз

Код на обсуждение   Найти похожие ветки 

 
koha ©   (2007-08-10 01:55) [0]

{---------------------------- 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;


 
Slym ©   (2007-08-10 05:11) [1]

FT:=TFindThread.Create(...);
try
    while FT.FStatEnd <> true do Application.ProcessMessages;
finally
 FT.Free;


 
Slym ©   (2007-08-10 05:14) [2]

if (FindRegistry(Updates,KBNum) = true)
===
if (FindRegistry(Updates,KBNum))


 
Slym ©   (2007-08-10 05:15) [3]

finally
  mm.Lines.Add("LV.Items.Count = "+IntToStr(LV.Items.Count));
  mm.Lines.Add("FileVerInfoLst.Count = "+IntToStr(FileVerInfoLst.Count));

finally в данном случае точно не для этого


 
MsGuns ©   (2007-08-10 08:22) [4]

Код как код. Обычный уровень новичка


 
koha ©   (2007-08-10 13:20) [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]


-это, так левый код при отладке нужен был, заблудился - забыл удалить.


 
Loginov Dmitry ©   (2007-08-10 20:12) [6]

> FileVerInfo     : TFileVerInfo;


Что такое TFileVerInfo? Используешь New(FileVerInfo); Значит TFileVerInfo - тип - указатель на соответствующую структуру. Тогда почему "T" а не "P"? При таком стиле в этом коде фик кто разберется, кроме его создателя.

А так обсуждать тут в общем-то нечего. Код новичка с изрядной долей каши в голове.


 
koha ©   (2007-08-10 22:02) [7]


> 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-11 00:08) [8]

> Вот вопрос: нужно ли каждый раз при добавлении в список
> указателя делать New


Конечно нужно. В противном случае ты каждый раз при вызове GetFileVerInfo будешь изменять поля одной и той же структуры. Указатель FileVerInfo будет для всех элементов списка иметь одно и тоже значение, а сведения запомнятся только для самого последнего файла из FilesLst.


 
koha ©   (2007-08-11 09:25) [9]


> Loginov Dmitry ©   (11.08.07 00:08) [8]

- конечно извиняюсь за глупый вопрос.
- я почему-то думал, что метод TList.add(); умеет сам автоматом выделять память или копировать структуру. Да, лезут же такие глупости в голову.



Страницы: 1 вся ветка

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
11-1168893404
Trible
2007-01-15 23:36
2007.09.02
Про strlist


8-1164902378
Ангела
2006-11-30 18:59
2007.09.02
Есть ли компонент как Image , но


1-1182682785
vr-online
2007-06-24 14:59
2007.09.02
POST и GET по HTTPS


15-1186046769
Kolan
2007-08-02 13:26
2007.09.02
Нарушаете ли вы инкапсуляцию намерянно?


2-1186492191
poroshm
2007-08-07 17:09
2007.09.02
не могу использовать RandomFrom почему?