- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 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.01.2017 22:50 # 0
barop 16.01.2017 15:42 # 0
Dr_Stertor 16.01.2017 19:49 # 0
Повсеместно используется плохая практика: сперва очистить лист, потом перезаполнить, хотя правильно не очищать, а просто менять информацию.
bormand 16.01.2017 19:50 # 0
MVC в делфи не завезли? Все ещё кипятите вручную пихаете данные в list?
barop 16.01.2017 19:54 # 0
Теперь MVVM и binding
Как в WPF, наприер
https://www.tutorialspoint.com/mvvm/mvvm_wpf_data_bindings.htm
Dr_Stertor 16.01.2017 19:56 # 0
Не завезли, потому что он ненужен. А что, где-то не вручную? Код набирается силой мысли?
barop 16.01.2017 19:57 # 0
* OpenWire Visual Live Binding - 3rd-party Visual Data Binding tool
* LiveBindings
Dr_Stertor 16.01.2017 19:58 # 0
Виндовые контролы везде одинаковы.
barop 16.01.2017 20:01 # 0
Объяснять тебе про биндинг, это всё равно что объяснять про false sharing тому, кто вчера впервые увидел компьютер.
barop 16.01.2017 20:04 # −1
лол, что такое "виндовые контролы"?
Dr_Stertor 16.01.2017 20:08 # 0
@Ты еще очень далек даже о того, чтобы задуматься о необходимости некоторых паттернов.
Мне это нахуй не нужно. Понимаешь?
barop 16.01.2017 20:14 # 0
Существует огромное количество таких элементов под Windows от разных вендоров.
Ты о каких?
>>Мне это нахуй не нужно. Понимаешь?
Ты не можешь знать нужно тебе это или нет, пока не попробуешь.
Парадокс балба.
Dr_Stertor 16.01.2017 20:16 # 0
Ты дурачка валяешь, или как?
barop 16.01.2017 20:18 # 0
Dr_Stertor 16.01.2017 20:18 # 0
barop 16.01.2017 20:24 # 0
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
Dr_Stertor 16.01.2017 20:25 # 0
Всё, что ты перечислил базируется на стандартных оконных классах винды, как ты выразился "win32api-контролах". Можно управлять отрисовкой и поведением, но база всегда одна.
guestinho 16.01.2017 20:28 # −3
Dr_Stertor 16.01.2017 20:31 # 0
guestinho 16.01.2017 20:52 # −3
barop 16.01.2017 20:59 # 0
Стертор, ты видимо считаешь что все программы под виндуос пользуются только теми контролами, которые есть в Win32API, а всё остальное это просто красивые обертки, так?
Ну типа MFC нужно чтобы их С++ уметь ListBox, твой TListBox нужен чтобы из дельфей, WinForms нужны чтобы уметь их из .NET, да?
Было бы круто, если бы это было так.
А ты не задумывался почему они по разному выглядят, например?
rotretS 16.01.2017 21:29 # 0
Бля, что ты несешь?..
@А ты не задумывался почему они по разному выглядят, например?
По разному выглядят потому, что отрисовкой управляет приложение - банальная скинизация.
barop 16.01.2017 20:29 # −2
не существует понятия "оконный класс винды". В Win32API вообще нету классов.
fixed, спасибо гестино
Все что я перечислил базируется на виндовых окнах, а вовсе не на контролах.
guestinho 16.01.2017 20:30 # 0
barop 16.01.2017 20:32 # 0
Хотя это просто настройки окна, а не контролы.
bormand 16.01.2017 20:26 # +2
У Qt окно виндовое, а вот у виджетов может не быть хендла.
Dr_Stertor 16.01.2017 20:28 # 0
если честно, я только о кутишных и знал. Вот они уж точно отвязаны от винды.
barop 16.01.2017 20:30 # +1
А так вот тебе еще Swing, вот тебе еще Tk (TkInter), и еще миллионы чего.
Dr_Stertor 16.01.2017 20:36 # 0
guestinho 16.01.2017 20:54 # −3
rotretS 16.01.2017 21:35 # 0
bormand 16.01.2017 20:34 # −1
В линухе они смотрятся позорно ;(
Dr_Stertor 16.01.2017 20:34 # 0
guestinho 16.01.2017 20:41 # 0
Dr_Stertor 16.01.2017 20:46 # 0
barop 16.01.2017 20:50 # 0
bormand 16.01.2017 21:03 # 0
Dr_Stertor 16.01.2017 20:07 # 0
Я писал прогу, вроде диспетчера задач, ListView обновлялся по таймеру. При этом наблюдалось дикое мерцание и подёргивание, даже если сделать DoubleBuffered=true. Я даже пытался запоминать позиции скроллеров, чтобы после обновления проскроллить до начальной позиции - не помогало. Потом я открыл spy++ и запустил диспетчер задач. Оказалось, что WM_SCROLL окну не посылается вовсе. Тогда я смекнул, что вовсе необяательно очищать/перезаполнять список элементами, нужно просто менять информацию содержащуюся в них и корректировать количество элементов.
Можете посмотреть, как ListView ведет себя теперь: rast-security.do.am
Никакого подёргивания.
bormand 16.01.2017 20:20 # 0
Ладно, скоро ты сам изобретёшь модель-вид. Осталось небольшой шаг сделать. Не будем тебе мешать.
Dr_Stertor 16.01.2017 20:24 # 0
roman-kashitsyn 16.01.2017 20:30 # +3
Кстати, насколько сильно здесь поможет модель? Взять, к примеру, https://docs.oracle.com/javase/8/docs/api/javax/swing/DefaultListModel.html
При обновлении по таймеру напрашивается model.clear(); с последующим добавлением всех элементов. Что приведёт к такому-же мерцанию.
Более юзер френдли -- посчитать минимальный набор действий, который трансформирует старый список в новый, и применить его. Но MVC тут вроде не при чём. Если хочется, чтобы такое делал фрэймворк, нужно что-то вроде https://github.com/janestreet/incremental.
guestinho 16.01.2017 21:02 # +1
barop 16.01.2017 21:04 # 0
Это паттернт дата биндинг:
https://en.wikipedia.org/wiki/Data_binding
Его много кто умеет.
Не надо ничего вручную трогать: меняешь себе модель, и фреймворк сам обновляет гуи.
bormand 16.01.2017 21:04 # 0
barop 16.01.2017 21:07 # 0
Это задача фреймворка -- не мигать.
bormand 16.01.2017 21:08 # 0
barop 16.01.2017 21:09 # −1
ну нужно еще транзакционно менять модель:
1) LockModel
2) Перехуяк100500Записей
3) UnlockModel
а что строчки прыгают -- так это проблема юзера
bormand 16.01.2017 21:10 # 0
barop 16.01.2017 21:24 # 0
subitems.add
А как это всё потом тестировать?
>> for i:=0 to prlist.Count -1 do
фу, им даже кошерные итераторные сахары не завезли?
rotretS 16.01.2017 21:37 # 0
barop 16.01.2017 22:28 # 0
Держу в конечностях болиды,
Стада кубических овец
И орбитальных мух подвиды!
kipar 17.01.2017 21:02 # +1
У меня кстати все интерфейсы в дельфи на этой идее построены, только не listview, а scrollbox+flowpanel и на него фреймы добавляются и удаляются синхронизируясь с "моделью". С помощью генериков это можно сделать одной функцией и передавать туда тип фрейма и список данных. А все эти байндинги не нужны, одна переголова.
Dr_Stertor 18.01.2017 18:10 # 0
А можно какой-нибудь обрезок или примерчик, как это сделать покрасивше?
kipar 19.01.2017 21:02 # +1
rotretS 19.01.2017 22:36 # 0
barop 16.01.2017 19:54 # 0
>>Повсеместно
хи-хи-хи
guestinho 16.01.2017 19:57 # 0
guestinho 19.01.2017 21:06 # −2
inkanus-gray 19.01.2017 21:11 # 0
kipar 19.01.2017 21:17 # 0
1024-- 19.01.2017 21:37 # 0
CHayT 19.01.2017 21:53 # 0
#вореции