Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 19.05.2017
Сообщений: 17

Виртуальный режим в ListView

14.02.2018, 15:22. Показов 1626. Ответов 16

Студворк — интернет-сервис помощи студентам
Добрый день!
Задача состоит в том, чтобы считать данные файла любого размера и вывести их в hex на экран.
С файлом работаю через filemapping, вывожу в listview.
На данный момент не понимаю, как организовать виртуальный вывод данных в listview.
А точнее:
1) Нужно переводить в hex только участок, который должен сейчас показываться?
2) В какой момент это делать ^ ?
3) Каким образом записывать в буфер данные, после того как их перевел в hex?

И почему-то при больших размерах файла все виснет и данные не отображаются. (До этого выводил в рич бокс и все полностью выводилось, так что смею предположить, что у listview имеется какое-то ограничение по количеству строк).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.02.2018, 15:22
Ответы с готовыми решениями:

Виртуальный режим в ListView
Добрый день! Задача состоит в том, чтобы считать файл и вывести его содержимое в hex на экран. Вывожу в listview. На данный момент не...

Как перетащить элемент из ListView в другой ListView?
У меня есть форма на ней два ListView хочу из одного ListView в другой ListView перетащить объект. Как это сделать? Подскажите плиз.:wall:

Полноэкранный режим -> оконный режим
Нужно программно перевести игру из полноэкранного режима в оконный, пробовал программно нажать комбинацию alt+Enter, но игра реагирует как...

16
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
14.02.2018, 17:05
MIRM, что за listview? Не знаем таких.
0
0 / 0 / 0
Регистрация: 19.05.2017
Сообщений: 17
14.02.2018, 21:07  [ТС]
outoftime, https://msdn.microsoft.com/ru-... .110).aspx
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
14.02.2018, 21:39
MIRM, это раздел С++ а не C#

Добавлено через 3 минуты
Цитата Сообщение от MIRM Посмотреть сообщение
И почему-то при больших размерах файла все виснет и данные не отображаются.
Можете определить на каком количестве данных виснет.
0
0 / 0 / 0
Регистрация: 19.05.2017
Сообщений: 17
14.02.2018, 21:48  [ТС]
outoftime, при размере файла около 2-х мб

Добавлено через 1 минуту
Цитата Сообщение от outoftime Посмотреть сообщение
MIRM, это раздел С++ а не C#
outoftime, так я на c++ и пишу
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
14.02.2018, 21:56
MIRM, ListView в качестве отдельного объекта (не на форме) создается нормально?

Цитата Сообщение от MIRM Посмотреть сообщение
так я на c++ и пишу
ссылка была на c#
0
0 / 0 / 0
Регистрация: 19.05.2017
Сообщений: 17
15.02.2018, 09:42  [ТС]
outoftime, нормально. Я же говорю, если данных не слишком много, то все спокойно выводится.
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
15.02.2018, 14:14
Цитата Сообщение от MIRM Посмотреть сообщение
Я же говорю, если данных не слишком много, то все спокойно выводится.
Ну вот и посмотри в дебагете, что там под капотом происходит когда объектов "слишком много"
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,118
15.02.2018, 15:37
Как-то делал нечто похожее, только на ListBox, но думаю что беда там одна и та же с большими файлами.
Каждое последующее добавление элемента в список занимает чуть больше времени, чем предыдущее. То ли там по всему списку какой алгоритм пробегает, то ли из-за динамического выделения памяти. Но постепенно время добавления становится совсем неприличным. Предел нормальной работы зависит от мощности компа, полагаю. Со стороны выглядит, что программа просто зависает пока заполняются все строки контрола. Если долго ждать, то программа или отвиснет, или развалится из-за нехватки памяти. Делать просмотр описанным образом не вариант. Нужен какой-нибудь скрол для позиционирования и отдельное поле для отрисовки кусочка файла по текущей позиции.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
15.02.2018, 19:21
Цитата Сообщение от MIRM Посмотреть сообщение
смею предположить, что у listview имеется какое-то ограничение по количеству строк
MIRM, как добавляете строки? вот это пробовали?

Before adding multiple items, you can send the control an LVM_SETITEMCOUNT message, specifying the number of items the control will ultimately contain. This message enables the list-view control to reallocate its internal data structures only once rather than every time you add an item.
...
If you are adding a large number of items to a list-view control, you can speed up the process by disabling redrawing before adding the items, then enable redrawing after the items are added. Use the WM_SETREDRAW message to enable and disable redrawing.
0
0 / 0 / 0
Регистрация: 19.05.2017
Сообщений: 17
17.02.2018, 19:21  [ТС]
Цитата Сообщение от schdub Посмотреть сообщение
MIRM, как добавляете строки? вот это пробовали?
schdub,
C++
1
2
3
4
5
6
7
8
9
10
case WM_NOTIFY: {
        NMHDR hdr = *(NMHDR*)lParam;
        if (hdr.code == LVN_GETDISPINFO)
        {
            LV_DISPINFO *pLvdi = (LV_DISPINFO *)lParam;
            pLvdi->item.pszText = Narisuy();
            break;
        }
        break;
    }
Narisuy() - функция формирования строки.
Сейчас, когда я получаю данные файла, у меня принимается это сообщение и срабатывает исключение "Необработанное исключение по адресу 0x009CAF26 в WinAp.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x004E0AC0."
В строчке
C++
1
NMHDR hdr = *(NMHDR*)lParam;
Если честно, уже мозг не варит что к чему...
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
17.02.2018, 20:23
MIRM, что вы хотите получить используя WM_NOTIFY? Покажите свой код (только удалите папки Debug, Release, etc).

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

Использую WM_SETREDRAW нужно перед добавлением большого кол-ва строк отключить перерисовку, а затем ее включить.
0
0 / 0 / 0
Регистрация: 19.05.2017
Сообщений: 17
17.02.2018, 21:38  [ТС]
schdub, вообще с его помощью планировалось выводить на экран содержимое файла в hex виде.
Но похоже, что я еще не учел, что нужно как-то отслеживать, какой именно кусок файла выводить.
Вложения
Тип файла: zip WinAp.zip (23.1 Кб, 8 просмотров)
0
0 / 0 / 0
Регистрация: 19.05.2017
Сообщений: 17
18.02.2018, 14:14  [ТС]
schdub, зачение SetItemCount изменил на ((l.QuadPart/16)+1).
l.quadpart - размер файла; 16 - количество символов в строке. Выдает ту же ошибку.

Добавлено через 15 часов 8 минут
schdub, возможно я понял, почему выскакивает та ошибка. Она выскакивала после нажатия на кнопку, которая открывала диалог с выбором файла. И обрабатывала его:
WM_NOTIFY
Сообщение выполняется при взаимодействии с элементами окна.
Встает вопрос: как исключить эту ситуацию, при нажатии на кнопку?
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
18.02.2018, 14:21
MIRM, у вас не получится использовать ListView для отображения больших файлов из-за ограничений этого контрола - он не предназначен для этого. Посмотрите лучше MSDN: How to Scroll Text
.
1
0 / 0 / 0
Регистрация: 19.05.2017
Сообщений: 17
19.02.2018, 11:09  [ТС]
schdub, понял Вас. Спасибо, буду смотреть

Добавлено через 20 часов 32 минуты
schdub, начал использовать scroll, но возникла проблема: памяти, отведенной под scrollinfo.nMax, может не хватить, если файл особо большого размера.
(По нынешней задумке на экран должен выводиться текст из файла scrollinfo.nPos и до конца экрана. Значит scrollinfo.nMax нужно сразу задать размер, равный размеру файла. Можно конечно подправить сообщения LINEUP,LINEDOWN под PAGEUP,PAGEDOWN и тогда размер скролл бара можно будет чуть уменьшиь, но того тоже может не хватить. Посоветуете что-нибудь?)
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,118
19.02.2018, 14:11
Можно завести собственные переменные для хранения количества строк и текущей позиции любой размерности, например 64х битные. В сообщениях скролинга, в первую очередь, опираться на свои переменные и изменять именно их. Таким образом для больших диапазонов скрол бар можно заставить работать в псевдо режиме, когда в него установлено одно значение, а по факту все действия осуществляются над другим. Может конечно есть другой вариант, но я так выкручивался. Приведу косочек кода для наглядности, правда с использованием MFC.
C++
1
2
3
4
5
6
7
8
9
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
void CHexView::SetVScrollPos(long long lPos)
{
    if (lPos > m_lVScrollMax)
        lPos = m_lVScrollMax;
    if (lPos < 0)
        lPos = 0;
 
    m_lVScrollPos = lPos;
 
    int iScrollPos = (m_lVScrollMax < cHexViewScrollLimit) ? (int)m_lVScrollMax : (int)(cHexViewScrollLimit*lPos/m_lVScrollMax);
    SetScrollPos(SB_VERT, iScrollPos, FALSE);
 
    unsigned uFlags = 0;
    if (lPos == 0)
        uFlags |= ESB_DISABLE_LTUP;
    if (lPos == m_lVScrollMax)
        uFlags |= ESB_DISABLE_RTDN;
 
    EnableScrollBar(SB_VERT, 0);
    if (uFlags != 0)
        EnableScrollBar(SB_VERT, uFlags);
}
 
void CHexView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    if (!pScrollBar)
    {
        switch (nSBCode)
        {
            case SB_TOP:
                SetVScrollPos(0);
                Invalidate();
                break;
            case SB_PAGEUP:
                if (m_lVScrollPos > 0)
                {
                    SetVScrollPos(m_lVScrollPos - m_iVScrollPage);
                    Invalidate();
                }
                break;
            case SB_ENDSCROLL:
                if (m_bVScrollHideDrag)
                {
                    m_bVScrollDrag = false;
                    Invalidate();
                }
                break;
            case SB_LINEUP:
                if (m_lVScrollPos > 0)
                {
                    SetVScrollPos(m_lVScrollPos - 1);
                    Invalidate();
                }
                break;
            case SB_LINEDOWN:
                if (m_lVScrollPos < m_lVScrollMax)
                {
                    SetVScrollPos(m_lVScrollPos + 1);
                    Invalidate();
                }
                break;
            case SB_PAGEDOWN:
                if (m_lVScrollPos < m_lVScrollMax)
                {
                    SetVScrollPos(m_lVScrollPos + m_iVScrollPage);
                    Invalidate();
                }
                break;
            case SB_BOTTOM:
                SetVScrollPos(m_lVScrollMax);
                Invalidate();
                break;
            case SB_THUMBPOSITION:
                if (m_lVScrollMax < cHexViewScrollLimit)
                    SetVScrollPos(nPos);
                else
                    SetVScrollPos(nPos * m_lVScrollMax / cHexViewScrollLimit);
                Invalidate();
                break;
            case SB_THUMBTRACK:
                if (m_bVScrollHideDrag)
                    m_bVScrollDrag = true;
                if (m_lVScrollMax < cHexViewScrollLimit)
                    SetVScrollPos(nPos);
                else
                    SetVScrollPos(nPos * m_lVScrollMax / cHexViewScrollLimit);
                Invalidate();
                break;
        }
    }
 
    CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.02.2018, 14:11
Помогаю со студенческими работами здесь

Виртуальный режим ListView
Добрый день! Есть задача, отображать табличные данные, которые пересчитываются по истечении таймера. Использую компонент ListView в...

Виртуальный режим TListView.
В официальном руководстве вроде бы сказано, что при включении виртуального режима (OwnerData = true) ListView помещает текущие, уже...

Виртуальный режим в дочерних окнах
Для открытия дочернего окна из главного всегда использую следующий код. private void конфигурацияToolStripMenuItem_Click(object sender,...

Что такое виртуальный и относительный виртуальный адрес?
Прив. Хочу разобрать одну программку, дизассемблировал ее и начал разбиратся. При помощи API Monitor нашел адрес функции, которая...

Как узнать почему включается энергосберегающий режим.И выключить навсегда этот режим?
Вообщем дело такое, гаснет монитор и появляется сообщение &quot;Енергосберегающий режим&quot; и в играх и даже когда не играю, монитор LG...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru