Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2013, 22:06   #1
Icabod
Новичок
Джуниор
 
Регистрация: 07.08.2013
Сообщений: 18
Печаль Обновление listview без снятия чебоксов с элементов

Привет, очень, очень нужна помощь! (
Дело в том, что я написал программку, которая ищет на диске вредоносные файлы. При сканировании поток пишет в tstringlist, а после сканирования результаты отображаются в listview. Как правильно вывести результаты в listview? Если выбранный файл обрабатывается,то элемент, который ему соответствует в tstringlist удаляется и listview вновь перезаполняется. а как сделать так, чтобы допустим, если вирус не удалось удалить, то на выбранном елементе listview сменилась иконка, но не снялись чекбоксы на других выбранных элементах? Отмеченных элементов может быть много, вот в чем проблема. Может, кто поможет?
если хотите быть в безопасности, поставьте патч на дыру в жопе!
Icabod вне форума Ответить с цитированием
Старый 07.08.2013, 22:39   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
При сканировании поток пишет в tstringlist, а после сканирования результаты отображаются в listview.
Почему не сразу в ЛистВью?
Цитата:
Если выбранный файл обрабатывается,то элемент, который ему соответствует в tstringlist удаляется
А я бы по другому делал - выбранные файлы подсвечивал в Листе другим фоном - синим, а те, что обработать не удалось Красным. Насчет чекбоксов - нужно знать как ты сделал их изменения.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.08.2013, 22:46   #3
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

В TStringList в свойство Objects при выделении сохраняйте TObject(1), а при снятии Objects[i] := nil.
ReportCube вне форума Ответить с цитированием
Старый 07.08.2013, 22:50   #4
Icabod
Новичок
Джуниор
 
Регистрация: 07.08.2013
Сообщений: 18
По умолчанию

Код:
function FindItem(item: tobject): boolean;
  var
    i: integer;
  begin
    Result := false;
    for i := 0 to Form1.ListView3.items.Count - 1 do
    begin
      if TMyStr(item).origname = TMyStr
        (Form1.ListView3.items[i].SubItems.Objects[0]).origname then
        Result := true
    end;
  end;

  procedure TForm1.showthreats;
  var

    i: integer;
    resultat: string;
    tstate: glstatus;

    lvs: tlistitem;
    rlist: tlist;

    ftype: cardinal;
    fname: string;
    vname: string;
    aname: string;
    status: cardinal;
    tstrlst: tstringlist;
  begin
    CriticalSection.Enter;
    tstrlst := tstringlist.create;
    tstrlst.Sorted := true;
    tstrlst.Duplicates := dupignore;
    rlist := report.LockList;
    resultat := 'Угрозы не обнаружены';

    try

      for i := rlist.Count - 1 downto 0 do
        tstrlst.AddObject(TMyStr(rlist[i]).origname, TMyStr(rlist[i]));
      report.clear;

      for i := tstrlst.Count - 1 downto 0 do
        report.Add(TMyStr(tstrlst.Objects[i]));
      tstrlst.clear;

      for i := rlist.Count - 1 downto 0 do
      begin

        ftype := TMyStr(rlist[i]).ftype;
        fname := TMyStr(rlist[i]).origname;
        vname := TMyStr(rlist[i]).tostr;
        aname := TMyStr(rlist[i]).atype;
        status := TMyStr(rlist[i]).status;

        if FindItem(rlist[i]) = true then
          continue;

        case status of
          ac_none:
            begin
              case ftype of
                K_Autorun, K_HFile, K_Trojan, K_ORPHLink:
                  begin
                    lvs := Form1.ListView3.items.Add;
                    lvs.Caption := fname;
                    lvs.SubItems.AddObject(vname, rlist[i]);
                    lvs.SubItems.Add('Действие не применялось');
                    lvs.ImageIndex := 1;
                  end;
                K_HFolder:
                  begin
                    lvs := Form1.ListView3.items.Add;
                    lvs.Caption := fname;
                    lvs.SubItems.AddObject(vname, rlist[i]);
                    lvs.SubItems.Add('Действие не применялось');
                    lvs.ImageIndex := 0;
                  end;
              end;
            end;
          ac_done:
            begin
              case ftype of
                K_Autorun, K_HFile, K_Trojan:
                  begin
                    lvs := Form1.ListView3.items.Add;
                    lvs.Caption := fname;
                    lvs.SubItems.AddObject(vname, rlist[i]);
                    lvs.SubItems.Add('Дезинфицирован');
                    lvs.ImageIndex := 1;
                  end;
                K_ORPHLink:
                  begin
                    lvs := Form1.ListView3.items.Add;
                    lvs.Caption := fname;
                    lvs.SubItems.AddObject(vname, rlist[i]);
                    lvs.SubItems.Add('Удален');
                    lvs.ImageIndex := 1;
                  end;
                K_HFolder:
                  begin
                    lvs := Form1.ListView3.items.Add;
                    lvs.Caption := fname;
                    lvs.SubItems.AddObject(vname, rlist[i]);
                    lvs.SubItems.Add('Атрибуты изменены');
                    lvs.ImageIndex := 0;
                  end;
              end;
если хотите быть в безопасности, поставьте патч на дыру в жопе!
Icabod вне форума Ответить с цитированием
Старый 07.08.2013, 22:51   #5
Icabod
Новичок
Джуниор
 
Регистрация: 07.08.2013
Сообщений: 18
По умолчанию

Код:
 TMyStr(rlist[i]).RemoveSelf;
            end;
          ac_deny:
            begin
              case ftype of
                K_Autorun, K_HFile, K_Trojan:
                  begin
                    lvs := Form1.ListView3.items.Add;
                    lvs.Caption := fname;
                    lvs.SubItems.AddObject(vname, rlist[i]);
                    lvs.SubItems.Add('Не поддается дезинфекции');
                    lvs.ImageIndex := 2;
                  end;
                K_ORPHLink:
                  begin
                    lvs := Form1.ListView3.items.Add;
                    lvs.Caption := fname;
                    lvs.SubItems.AddObject(vname, rlist[i]);
                    lvs.SubItems.Add('Не удален');
                    lvs.ImageIndex := 2;
                  end;
                K_HFolder:
                  begin
                    lvs := Form1.ListView3.items.Add;
                    lvs.Caption := fname;
                    lvs.SubItems.AddObject(vname, rlist[i]);
                    lvs.SubItems.Add('Атрибуты не изменены');
                    lvs.ImageIndex := 2;
                  end;
              end;
            end;
          ac_notfound:
            begin
              case ftype of
                K_Autorun, K_HFile, K_Trojan:
                  begin
                    lvs := Form1.ListView3.items.Add;
                    lvs.Caption := fname;
                    lvs.SubItems.AddObject(vname, rlist[i]);
                    lvs.SubItems.Add('Файл не найден');
                    lvs.ImageIndex := 5;
                    listview3.items[lvs.Index].Checked:=true;
                  end;
                K_ORPHLink:
                  begin
                    lvs := Form1.ListView3.items.Add;
                    lvs.Caption := fname;
                    lvs.SubItems.AddObject(vname, rlist[i]);
                    lvs.SubItems.Add('Файл не найден');
                    lvs.ImageIndex := 5;
                     listview3.items[lvs.Index].Checked:=true;
                  end;
                K_HFolder:
                  begin
                    lvs := Form1.ListView3.items.Add;
                    lvs.Caption := fname;
                    lvs.SubItems.AddObject(vname, rlist[i]);
                    lvs.SubItems.Add('Файл не найден');
                    lvs.ImageIndex := 5;
                    listview3.items[lvs.Index].Checked:=true;
                  end;
              end;
              TMyStr(rlist[i]).RemoveSelf;
            end;
        end;
      end;

      ZeroMemory(@tstate, sizeof(tstate));
      for i := rlist.Count - 1 downto 0 do
      begin
        case TMyStr(rlist[i]).ftype of
          K_Autorun, K_Trojan, K_HFile, K_ORPHLink:
            begin
              tstate.virfound := true;
              Form1.JvGradientHeaderPanel2.GradientStartColor := clred;
              Form1.JvGradientHeaderPanel2.GradientendColor := clwhite;
              Form1.JvGradientHeaderPanel2.labelCaption :=
                'Обнаружены угрозы ! ';              break;            end;
          K_HFolder:
            begin
              if tstate.virfound = false then
              begin
                Form1.JvGradientHeaderPanel2.GradientStartColor := $00144EFA;
                Form1.JvGradientHeaderPanel2.GradientendColor := clwhite;
                Form1.JvGradientHeaderPanel2.labelCaption :=
                  'Найдены скрытые объекты';
              end;
            end;
        end;
      end;
      if (rlist.Count = 0) or (Form1.ListView3.items.Count = 0) then
      begin
        Form1.JvGradientHeaderPanel2.labelCaption := 'Угрозы не обнаружены';
        Form1.JvGradientHeaderPanel2.GradientStartColor := $0066945C;
        Form1.JvGradientHeaderPanel2.GradientendColor := clwhite;
      end;

    finally
      tstrlst.Free;
      report.UnlockList;
      CriticalSection.Leave;
    end;
  end;
если хотите быть в безопасности, поставьте патч на дыру в жопе!
Icabod вне форума Ответить с цитированием
Старый 07.08.2013, 22:52   #6
Icabod
Новичок
Джуниор
 
Регистрация: 07.08.2013
Сообщений: 18
По умолчанию

Цитата:
Почему не сразу в ЛистВью?
файл сканируют несколько процедур. если хотя бы одна вернула true, значит зараза. а если несколько вернули true, то возникают дубликаты. а список их не допускает.
если хотите быть в безопасности, поставьте патч на дыру в жопе!
Icabod вне форума Ответить с цитированием
Старый 07.08.2013, 22:56   #7
Icabod
Новичок
Джуниор
 
Регистрация: 07.08.2013
Сообщений: 18
По умолчанию

Цитата:
А я бы по другому делал - выбранные файлы подсвечивал в Листе другим фоном - синим, а те, что обработать не удалось Красным. Насчет чекбоксов - нужно знать как ты сделал их изменения.
Подсветка это крайнее дело друг. Лучше тогда сделать выбранные елементы недоступными enabled:=false;
если хотите быть в безопасности, поставьте патч на дыру в жопе!
Icabod вне форума Ответить с цитированием
Старый 07.08.2013, 23:01   #8
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Так у Вас есть свой класс TMyStr, в который добавляете свойство Boolean для хранения состояния чеков - в чём проблема?
ReportCube вне форума Ответить с цитированием
Старый 07.08.2013, 23:03   #9
Icabod
Новичок
Джуниор
 
Регистрация: 07.08.2013
Сообщений: 18
По умолчанию

ReportCube, целую руки и ноги. Я просто не знал, что так можно. Спасибо тебе большое! А так в целом код как не грязный? я просто в делфи не давно полез.
если хотите быть в безопасности, поставьте патч на дыру в жопе!
Icabod вне форума Ответить с цитированием
Старый 07.08.2013, 23:09   #10
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Поберегите обоняние
ReportCube вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перемещение элементов Listview Anfall Компоненты Delphi 4 30.03.2012 04:24
Добавление элементов в ListView coNsept Общие вопросы .NET 1 05.03.2012 19:51
[C#] Выбор элементов в listView JonMagon Помощь студентам 1 29.02.2012 19:54
ListView выделение нескольких элементов без Ctrl fezilk25 Общие вопросы Delphi 6 01.08.2011 07:16
Добавление элементов ListView SnakeMan Помощь студентам 4 30.11.2007 11:54