1. Pascal / Говнокод #21976

    −50

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 15 Января 2017

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

    • #ListView #Clear ненужОн #экономия памяти #не мерцает
      Ответить
    • неужели это кому-то интересно?
      Ответить
      • Это блять должно быть интересно всем, кто работает TListView.
        Повсеместно используется плохая практика: сперва очистить лист, потом перезаполнить, хотя правильно не очищать, а просто менять информацию.
        Ответить
        • > просто менять информацию
          MVC в делфи не завезли? Все ещё кипятите вручную пихаете данные в list?
          Ответить
          • MVC устарел
            Теперь MVVM и binding

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

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

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

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

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

                        Ты дурачка валяешь, или как?
                        Ответить
                        • Ага, ну то-есть ты даже не догадываешься что существует более одного вида контролов, да?
                          Ответить
                          • Пруф в студию. Покажи мне контролы, которые не базируются на стандартных оконных классах винды.
                            Ответить
                            • дотнет (ака винформс) контролы
                              https://msdn.microsoft.com/en-us/library/system.windows.forms.control(v=vs.110).a spx

                              MFC контролы
                              https://msdn.microsoft.com/en-us/library/65dtx4a4.aspx

                              Win32API контролы
                              https://msdn.microsoft.com/en-us/library/windows/desktop/hh298349(v=vs.85).aspx

                              WPF контролы
                              https://msdn.microsoft.com/en-us/library/bb655881(v=vs.90).aspx
                              Ответить
                              • Ох, епта... Горе ты моё, луковое, как говорится.

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

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

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

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

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

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

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

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

                                  Все что я перечислил базируется на виндовых окнах, а вовсе не на контролах.
                                  Ответить
                                  • Понятие класс ещё как есть. https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms633587(v=vs.85).aspx
                                    Ответить
                                    • да, спасибо.
                                      Хотя это просто настройки окна, а не контролы.
                                      Ответить
                              • Qt виджеты :3

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

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

                    Кстати, насколько сильно здесь поможет модель? Взять, к примеру, 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


                                а что строчки прыгают -- так это проблема юзера
                                Ответить
                                • Стертор так и делает: proclist.Items.BeginUpdate;
                                  Ответить
                                  • ага, а потом руками пересобирает свой контрол
                                    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.
          >>Повсеместно
          хи-хи-хи
          Ответить
        • Я так понимаю, вопрос был в том, работает ли кто-то с TListView.
          Ответить
    • Идите нахуй со своим паскалем, заебали!
      Ответить
      • Идите напаскаль со своим хуем, заебали!
        Ответить
        • Идите наебель со своим хуем, запаскали.
          Ответить
          • Идите напаскаль со своим паскалем, заебали! Идите наебель со своим паскалем, заебали! Идите напаскаль со своим хуем, запаскаль со своим паскалем, заебали!#вореции
            Ответить
            • Понятно. Ты еще очень далек даже о того, чтобы их С++ уметь ListBox, твой TListBox нужен чтобы их С++ уметь ListBox нужен чтобы их С++ уметь их из .NET, да?
              #вореции
              Ответить

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