Школоло / Говнокод #21976 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
lst:=proclist.Selected;
  if assigned(lst) then
  begin
    tp:=tmyproc(lst.SubItems.Objects[0]);
    S:=tp.exename;
    P:=tp.PID;
  end
  else
  begin
    S:='';
    P:=0;
  end;
  ID:=-1;
  proclist.Items.BeginUpdate;
  try
  //////////////////////////////////////////////////////////
  if prlist.Count > 0 then
  while proclist.Items.Count > prlist.Count do
  begin
    lst:=proclist.Items[proclist.Items.Count-1];
    lst.Delete;
  end;

  while proclist.Items.Count < prlist.Count do
  with proclist.Items.Add do
  begin
    caption:='';
    subitems.Add('');
    subitems.add('');
    subitems.add('');
    subitems.add('');
    subitems.add('');
    subitems.add('');
  end;
 /////////////////////////////////////////////////////////
  for i:=0 to prlist.Count -1 do
  begin
    tp:=(prlist.Objects[i] as tmyproc);
    with proclist.items[i] do
    begin
      if tp.isHidden then
      begin
        Inc(HidProcs);
        ImageIndex:=8;
      end
      else
      ImageIndex:=7;
      if (s <> emptystr) and (p=tp.pid) and (s=tp.exename) then
      ID:=Index;
      Caption:=tp.ExeName;
      with Subitems do
      begin
        Objects[0].Free;
        Objects[0]:=tp;
        Strings[0]:=tp.ModulePath;
      end;
      subitems.Strings[1]:=IntToStr(tp.PID);

Ваш ListView всё ещё съезжает при обновлении? Тогда мы идём к Вам.

Запостил: rotretS rotretS, (Updated )

Комментарии (62) RSS

  • #ListView #Clear ненужОн #экономия памяти #не мерцает
    Ответить
    • Это блять должно быть интересно всем, кто работает TListView.
      Повсеместно используется плохая практика: сперва очистить лист, потом перезаполнить, хотя правильно не очищать, а просто менять информацию.
      Ответить
      • > просто менять информацию
        MVC в делфи не завезли? Все ещё кипятите вручную пихаете данные в list?
        Ответить
        • @MVC в делфи не завезли?
          Не завезли, потому что он ненужен. А что, где-то не вручную? Код набирается силой мысли?
          Ответить
          • * DSharp 3rd-party Data Binding tool
            * OpenWire Visual Live Binding - 3rd-party Visual Data Binding tool
            * LiveBindings
            Ответить
            • Не надо разводить демагогию. Это к теме поста абсолютно не относится.
              Виндовые контролы везде одинаковы.
              Ответить
              • Понятно. Ты еще очень далек даже о того, чтобы задуматься о необходимости некоторых паттернов.
                Объяснять тебе про биндинг, это всё равно что объяснять про false sharing тому, кто вчера впервые увидел компьютер.
                Ответить
              • >>Виндовые контролы везде одинаковы.

                лол, что такое "виндовые контролы"?
                Ответить
                • виндовые контролы - это графические элементы управления (кнопки, списки, поля ввода и т.п.).

                  @Ты еще очень далек даже о того, чтобы задуматься о необходимости некоторых паттернов.

                  Мне это нахуй не нужно. Понимаешь?
                  Ответить
                  • >>виндовые контролы - это графические элементы управления (кнопки, списки, поля ввода и т.п.).
                    Существует огромное количество таких элементов под Windows от разных вендоров.
                    Ты о каких?

                    >>Мне это нахуй не нужно. Понимаешь?
                    Ты не можешь знать нужно тебе это или нет, пока не попробуешь.
                    Парадокс балба.
                    Ответить
                    • @Существует огромное количество таких элементов под Windows от разных вендоров.

                      Ты дурачка валяешь, или как?
                      Ответить
                      • Ага, ну то-есть ты даже не догадываешься что существует более одного вида контролов, да?
                        Ответить
                        • Пруф в студию. Покажи мне контролы, которые не базируются на стандартных оконных классах винды.
                          Ответить
                            • Ох, епта... Горе ты моё, луковое, как говорится.

                              Всё, что ты перечислил базируется на стандартных оконных классах винды, как ты выразился "win32api-контролах". Можно управлять отрисовкой и поведением, но база всегда одна.
                              Ответить
                                • Виндовые оконные классы хранятся в либах shell32, user32, commctrl... все не помню. Если твоя прога их грузит - значит, ты проиграл.
                                  Ответить
                                  • ComCtl32.dll.

                                    Стертор, ты видимо считаешь что все программы под виндуос пользуются только теми контролами, которые есть в Win32API, а всё остальное это просто красивые обертки, так?

                                    Ну типа MFC нужно чтобы их С++ уметь ListBox, твой TListBox нужен чтобы из дельфей, WinForms нужны чтобы уметь их из .NET, да?

                                    Было бы круто, если бы это было так.

                                    А ты не задумывался почему они по разному выглядят, например?
                                    Ответить
                                    • @Ну типа MFC нужно чтобы их С++ уметь ListBox, твой TListBox нужен чтобы из дельфей, WinForms нужны чтобы уметь их из .NET, да?

                                      Бля, что ты несешь?..

                                      @А ты не задумывался почему они по разному выглядят, например?

                                      По разному выглядят потому, что отрисовкой управляет приложение - банальная скинизация.
                                      Ответить
                              • >>базируется на стандартных оконных классах винды
                                не существует понятия "оконный класс винды". В Win32API вообще нету классов.
                                fixed, спасибо гестино

                                Все что я перечислил базируется на виндовых окнах, а вовсе не на контролах.
                                Ответить
                            • Qt виджеты :3

                              У Qt окно виндовое, а вот у виджетов может не быть хендла.
                              Ответить
                              • @Существует огромное количество таких элементов под Windows от разных вендоров
                                если честно, я только о кутишных и знал. Вот они уж точно отвязаны от винды.
                                Ответить
                              • я перечислил только MS.
                                А так вот тебе еще Swing, вот тебе еще Tk (TkInter), и еще миллионы чего.
                                Ответить
              • > Виндовые контролы везде одинаковы.
                В линухе они смотрятся позорно ;(
                Ответить
                  • Под кедровое вино сильно пидарасит, особенно дельфовые проги. Вся халтура прогера сразу наружу вылезет... Если он, допустим, вместо фреймов заюзал контролы-панели, они тупо смешаются.
                    Ответить
            • Если Вы не понимаете, о чем речь, я объясню.
              Я писал прогу, вроде диспетчера задач, ListView обновлялся по таймеру. При этом наблюдалось дикое мерцание и подёргивание, даже если сделать DoubleBuffered=true. Я даже пытался запоминать позиции скроллеров, чтобы после обновления проскроллить до начальной позиции - не помогало. Потом я открыл spy++ и запустил диспетчер задач. Оказалось, что WM_SCROLL окну не посылается вовсе. Тогда я смекнул, что вовсе необяательно очищать/перезаполнять список элементами, нужно просто менять информацию содержащуюся в них и корректировать количество элементов.

              Можете посмотреть, как ListView ведет себя теперь: rast-security.do.am
              Никакого подёргивания.
              Ответить
              • > нужно просто менять информацию содержащуюся в них и корректировать количество элементов
                Ладно, скоро ты сам изобретёшь модель-вид. Осталось небольшой шаг сделать. Не будем тебе мешать.
                Ответить
                • > Ладно, скоро ты сам изобретёшь модель-вид. Не будем тебе мешать.

                  Кстати, насколько сильно здесь поможет модель? Взять, к примеру, https://docs.oracle.com/javase/8/docs/api/javax/swing/DefaultListModel.html
                  При обновлении по таймеру напрашивается model.clear(); с последующим добавлением всех элементов. Что приведёт к такому-же мерцанию.
                  Более юзер френдли -- посчитать минимальный набор действий, который трансформирует старый список в новый, и применить его. Но MVC тут вроде не при чём. Если хочется, чтобы такое делал фрэймворк, нужно что-то вроде https://github.com/janestreet/incremental.
                  Ответить
                    • Не только.

                      Это паттернт дата биндинг:
                      https://en.wikipedia.org/wiki/Data_binding

                      Его много кто умеет.

                      Не надо ничего вручную трогать: меняешь себе модель, и фреймворк сам обновляет гуи.
                      Ответить
                      • Роман про то, что модель в данном случае поменять нетривиально. Один фиг мёрджить, как сейчас Стертор руками делает.
                        Ответить
                        • Если фремворк занимается отображением модели в гуй то ты можешь её очистить и заполнить снова без всяких миганий.

                          Это задача фреймворка -- не мигать.
                          Ответить
                          • Ну ок. Тогда остаётся просто отсортировать по какому-то стабильному полю, чтобы строчки не прыгали.
                            Ответить
                            • конечно)
                              ну нужно еще транзакционно менять модель:

                              1) LockModel
                              2) Перехуяк100500Записей
                              3) UnlockModel


                              а что строчки прыгают -- так это проблема юзера
                              Ответить
                                • ага, а потом руками пересобирает свой контрол
                                  subitems.add

                                  А как это всё потом тестировать?

                                  >> for i:=0 to prlist.Count -1 do
                                  фу, им даже кошерные итераторные сахары не завезли?
                                  Ответить
                                    • Я есть инопланетный жрец,
                                      Держу в конечностях болиды,
                                      Стада кубических овец
                                      И орбитальных мух подвиды!
                                      Ответить
              • > Тогда я смекнул, что вовсе необяательно очищать/перезаполнять список элементами, нужно просто менять информацию содержащуюся в них и корректировать количество элементов.
                У меня кстати все интерфейсы в дельфи на этой идее построены, только не listview, а scrollbox+flowpanel и на него фреймы добавляются и удаляются синхронизируясь с "моделью". С помощью генериков это можно сделать одной функцией и передавать туда тип фрейма и список данных. А все эти байндинги не нужны, одна переголова.
                Ответить
                • @У меня кстати все интерфейсы в дельфи на этой идее построены, только не listview

                  А можно какой-нибудь обрезок или примерчик, как это сделать покрасивше?
                  Ответить
                  • // TODO: replace list to iterator
                    procedure TfmMain.SyncFramesList<T, FR>(Input: TList<T>; Output: TList<FR>;
                      Parent: TfmxObject);
                    var
                      oldn, newn, i: Integer;
                      Item: T;
                      Frame: FR;
                    begin
                      oldn := Output.Count;
                      newn := Input.Count;
                      if oldn < newn then
                      begin
                        for i := oldn to newn - 1 do
                        begin
                          Frame := FR.Create(fmMain);
                          Frame.Name := FR.ClassName + '_' + IntToStr(Integer(Parent)) + '_' +
                            IntToStr(i);
                          Output.Add(Frame);
                          Parent.AddObject(Frame);
                        end;
                      end
                      else
                      begin
                        for i := oldn - 1 downto newn do
                        begin
                          Frame := Output[i];
                          Output.Delete(i);
                          Frame.Release;
                          Frame.Free;
                        end;
                      end;
                    
                      for i := 0 to Input.Count - 1 do
                      begin
                        Output[i].SetModel(Input[i]);
                        Output[i].ShowData
                      end;
                    end;
                    Ответить
      • Я так понимаю, вопрос был в том, работает ли кто-то с TListView.
        Ответить
        • Идите напаскаль со своим паскалем, заебали! Идите наебель со своим паскалем, заебали! Идите напаскаль со своим хуем, запаскаль со своим паскалем, заебали!#вореции
          Ответить
          • Понятно. Ты еще очень далек даже о того, чтобы их С++ уметь ListBox, твой TListBox нужен чтобы их С++ уметь ListBox нужен чтобы их С++ уметь их из .NET, да?
            #вореции
            Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8