ListView

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

ListView

Сообщение sergey-911 » 18.01.2005 (Вт) 0:41

Доброго времени суток уважаемые.
1) Есть на форме ListView, в виде таблицы. В последнем столбце храню идентификаторы. Ширину колонки его ставлю = 0. При наведении на столбец можно этот столбец раздвинуть и посмотреть иды, что не желательно. Как запретить это действие.
2) СверхуListView, над каждым полем этой самой таблицы есть текстовое поле. Пользователь туда заносит условие поиска в БД, затем идет заполнение таблица найденными записями. Нужно, стобы при изменении пользователем ширины столбца таблицы ListView длина текстового поля для ввода поска становилось равным ширине колонки. Как сделать ширину текстовоо поля равной ширине соответствующей колонки в таблице - я знаю. А вот при каком событии - для меня вопрос! Все перепробовал. Для самого ListView есть свойство mouse move, вот только оно не срабатывает при раздвижении колонок сей таблицы.
Буду признателен любой информации. Спасибо.
С уважением, Сергей.

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 18.01.2005 (Вт) 2:30

У каждого итема листвью есть место, где можно хранить идентификатор. Называется lParam. Его не видно, и ничего прятать не надо.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.01.2005 (Вт) 5:53

Это место назвается свойством Tag.
Кто тут лечил от переAPIзма?
Изображение

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

ListView

Сообщение sergey-911 » 18.01.2005 (Вт) 7:24

Привет всем. Спасибо за ответы. Но lParam мне не подойдет, т.к. иногда необходимы не одно поле, а несколько полей отвести под идентификаторы в таблице. А вот свойство Tag - про него поподробней, если можно. А еще лучше ссылку на пример, или скинте пример на маил.
А как насчет второго вопроса?
Спасибо.
С уважением, Сергей.

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Re: ListView

Сообщение Юстас » 18.01.2005 (Вт) 12:39

sergey-911 писал(а):Но lParam мне не подойдет, т.к. иногда необходимы не одно поле, а несколько полей отвести под идентификаторы в таблице. А вот свойство Tag - про него поподробней, если можно.


Как заметил tyomitch, это практически одно и тоже. Если lParam не подходит, значит и Tag не подойдёт :) И количество информации, хранимой в этом месте, может быть любое (в пределах выделенной твоей программе памяти - до 2 Гб). Достаточно занести в этот Tag/lParam указатель на какую-нибудь область памяти, например, у тебя какая-то своя пользовательская структура с несколькими полями

Код: Выделить всё
Type ITEMTAG
    Parameter1  As  Long
    Parameter2  As  String
    Parameter3  As  Byte
End Type

Dim MyItemlParam As ITEMTAG
    MyItemlParam.Parameter1=12345
    MyItemlParam.Parameter2="Some String"
    MyItemlParam.Parameter3=255
   
   MyLV1.ListItems(8).Tag = VarPtr(MyItemlParam)


И в твоём lParam/Tag записана куча информации. Сколько и какой - решаешь сам.

tyomitch, от переapiзма можно вылечиться у доктора DOS :) А вот кто вылечит от переCOMизма? Имхо, лечить надо, иначе бы не возникали вопросы, подобные данному.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.01.2005 (Вт) 13:34

В Tag можно без проблем положить массив. И вытаскиваться оттуда он будет без CopyMemory.
Даже и структуру можно, если очень постараться (=объявить её в публичном классе).

Так даже проще - не нужно вести отдельный массив структур с данными, всё хранится непосредственно в Tag-е.
Изображение

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 18.01.2005 (Вт) 14:40

К чему массивы? Зачем громоздить класс ? Все достается одной строкой кода:

RtlMoveMemory VarPtr(ItemData), CLng(ListView1.ListItems(3).Tag), Len(ItemData)

Вот пример с записью и считыванием произвольной информации в lParam:
Вложения
lParam.zip
(2.02 Кб) Скачиваний: 26

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.01.2005 (Вт) 17:35

Угу... А если итем не один, а двести?
А если они добавляются и удаляются динамически?
Замаешься массив ItemData-ов синхронизировать ;-)
Изображение

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 18.01.2005 (Вт) 19:03

Мда.....

Если синхронизация представляет из себя такую проблему :) и загоняет в тупик, то что же, пользуйтесь невидимыми субитемами:)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.01.2005 (Пт) 8:05

Юстас писал(а):Мда.....

Если синхронизация представляет из себя такую проблему :) и загоняет в тупик, то что же, пользуйтесь невидимыми субитемами:)
...или массивами/структурами в Tag-е ;-)
Изображение

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 21.01.2005 (Пт) 10:51

Вариант - хранить идентификаторы (если они конечно уникальные) в свойстве Key (как строку с разделителями) и парсить при обращении.

PUNK-GRUNGER
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 10.06.2004 (Чт) 14:22
Откуда: Украина, Николаев

Сообщение PUNK-GRUNGER » 21.01.2005 (Пт) 12:34

Ребята, ИМХО, TAG специальо для таких целей - всякие идентификаторы хранить :) Благо дело к каждому итему листвьюва можно прикрутить свой Таг (а к нему и массив при желании).

Что-то типа:
With ListView.ListItems.Add
.Text = "Текст"
.Tag = "первая штука"
End With

Где первая штука идентификатор соббсна :)
«Каждому программисту ЭВМ выдает то, что он заслуживает» (c)

PUNK-GRUNGER
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 10.06.2004 (Чт) 14:22
Откуда: Украина, Николаев

Сообщение PUNK-GRUNGER » 21.01.2005 (Пт) 12:37

Забыл ...
Насчет второго:

А события попробуй ColumnClick и любые с Column. Вообще еще глянь какой-нибудь ReSize.

txtText.Width = ListView.ListColumn(Index).Width

Если я все правильно понял...
«Каждому программисту ЭВМ выдает то, что он заслуживает» (c)

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 23.01.2005 (Вс) 0:56

Спасибо за ответ. Сообытие Сolumn Click не подходит, т.к. происходит не щелчек мышкой по столбику ListView, а изменение размеров (уменьшение или увеличение) столбика ListView. Методично перебрал все события в LictView, нужного не оказалось. Единственный, предполагаемый выход - расчитать область заголовков ListView, и при наведении мыши в область - выполнять нужное действие по таймеру. Но, вот с расчетом области - беда. Функция GetCursorPos расчитывает координаты в пикселях. А мне нужно в твипах. Спасибо всем за помощь, но проблему решить пока не удалось.
С уважением, Сергей.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.01.2005 (Вс) 9:44

Функции ScaleX и ScaleY переводят пикселы в твипы.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.01.2005 (Вс) 9:46

PUNK-GRUNGER писал(а):Ребята, ИМХО, TAG специальо для таких целей - всякие идентификаторы хранить :) Благо дело к каждому итему листвьюва можно прикрутить свой Таг (а к нему и массив при желании).

Дык, я именно об этом и говорил с самого начала ;-)
Изображение

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 23.01.2005 (Вс) 11:37

Спасибо, попробую!
С уважением, Сергей.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 17

    TopList