Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
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 всё ещё съезжает при обновлении? Тогда мы идём к Вам.
Это блять должно быть интересно всем, кто работает TListView.
Повсеместно используется плохая практика: сперва очистить лист, потом перезаполнить, хотя правильно не очищать, а просто менять информацию.
Понятно. Ты еще очень далек даже о того, чтобы задуматься о необходимости некоторых паттернов.
Объяснять тебе про биндинг, это всё равно что объяснять про false sharing тому, кто вчера впервые увидел компьютер.
>>виндовые контролы - это графические элементы управления (кнопки, списки, поля ввода и т.п.).
Существует огромное количество таких элементов под Windows от разных вендоров.
Ты о каких?
>>Мне это нахуй не нужно. Понимаешь?
Ты не можешь знать нужно тебе это или нет, пока не попробуешь.
Парадокс балба.
Всё, что ты перечислил базируется на стандартных оконных классах винды, как ты выразился "win32api-контролах". Можно управлять отрисовкой и поведением, но база всегда одна.
Стертор, ты видимо считаешь что все программы под виндуос пользуются только теми контролами, которые есть в Win32API, а всё остальное это просто красивые обертки, так?
Ну типа MFC нужно чтобы их С++ уметь ListBox, твой TListBox нужен чтобы из дельфей, WinForms нужны чтобы уметь их из .NET, да?
Было бы круто, если бы это было так.
А ты не задумывался почему они по разному выглядят, например?
@Существует огромное количество таких элементов под Windows от разных вендоров
если честно, я только о кутишных и знал. Вот они уж точно отвязаны от винды.
Под кедровое вино сильно пидарасит, особенно дельфовые проги. Вся халтура прогера сразу наружу вылезет... Если он, допустим, вместо фреймов заюзал контролы-панели, они тупо смешаются.
Если Вы не понимаете, о чем речь, я объясню.
Я писал прогу, вроде диспетчера задач, 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.
> Тогда я смекнул, что вовсе необяательно очищать/перезаполнять список элементами, нужно просто менять информацию содержащуюся в них и корректировать количество элементов.
У меня кстати все интерфейсы в дельфи на этой идее построены, только не listview, а scrollbox+flowpanel и на него фреймы добавляются и удаляются синхронизируясь с "моделью". С помощью генериков это можно сделать одной функцией и передавать туда тип фрейма и список данных. А все эти байндинги не нужны, одна переголова.
// 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;
Идите напаскаль со своим паскалем, заебали! Идите наебель со своим паскалем, заебали! Идите напаскаль со своим хуем, запаскаль со своим паскалем, заебали!#вореции
Понятно. Ты еще очень далек даже о того, чтобы их С++ уметь ListBox, твой TListBox нужен чтобы их С++ уметь ListBox нужен чтобы их С++ уметь их из .NET, да? #вореции
Повсеместно используется плохая практика: сперва очистить лист, потом перезаполнить, хотя правильно не очищать, а просто менять информацию.
MVC в делфи не завезли? Все ещё кипятите вручную пихаете данные в list?
Теперь MVVM и binding
Как в WPF, наприер
https://www.tutorialspoint.com/mvvm/mvvm_wpf_data_bindings.htm
Не завезли, потому что он ненужен. А что, где-то не вручную? Код набирается силой мысли?
* OpenWire Visual Live Binding - 3rd-party Visual Data Binding tool
* LiveBindings
Виндовые контролы везде одинаковы.
Объяснять тебе про биндинг, это всё равно что объяснять про false sharing тому, кто вчера впервые увидел компьютер.
лол, что такое "виндовые контролы"?
@Ты еще очень далек даже о того, чтобы задуматься о необходимости некоторых паттернов.
Мне это нахуй не нужно. Понимаешь?
Существует огромное количество таких элементов под 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-контролах". Можно управлять отрисовкой и поведением, но база всегда одна.
Стертор, ты видимо считаешь что все программы под виндуос пользуются только теми контролами, которые есть в Win32API, а всё остальное это просто красивые обертки, так?
Ну типа MFC нужно чтобы их С++ уметь ListBox, твой TListBox нужен чтобы из дельфей, WinForms нужны чтобы уметь их из .NET, да?
Было бы круто, если бы это было так.
А ты не задумывался почему они по разному выглядят, например?
Бля, что ты несешь?..
@А ты не задумывался почему они по разному выглядят, например?
По разному выглядят потому, что отрисовкой управляет приложение - банальная скинизация.
не существует понятия "оконный класс винды". В Win32API вообще нету классов.
fixed, спасибо гестино
Все что я перечислил базируется на виндовых окнах, а вовсе не на контролах.
Хотя это просто настройки окна, а не контролы.
У Qt окно виндовое, а вот у виджетов может не быть хендла.
если честно, я только о кутишных и знал. Вот они уж точно отвязаны от винды.
А так вот тебе еще 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 и на него фреймы добавляются и удаляются синхронизируясь с "моделью". С помощью генериков это можно сделать одной функцией и передавать туда тип фрейма и список данных. А все эти байндинги не нужны, одна переголова.
А можно какой-нибудь обрезок или примерчик, как это сделать покрасивше?
>>Повсеместно
хи-хи-хи
#вореции