Вопросы по TListView

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Вопросы по TListView

Сообщение qivi » 31.03.2010 11:11:27

Возможно ли элементу TListView использовать картинку из "вне", а не из TImageList?
Последний раз редактировалось qivi 20.04.2010 11:46:31, всего редактировалось 1 раз.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Прикрутить картинку TListView из вне... возможно?

Сообщение qivi » 01.04.2010 13:37:22

Означает ли всеобщее молчание невозможность моего желания?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Прикрутить картинку TListView из вне... возможно?

Сообщение скалогрыз » 01.04.2010 14:05:30

есть желание фичи, но нет желания читать документацию?! ;)

ах... желания и страсти... они терзают душу и тело!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Вопросы по TListView

Сообщение qivi » 20.04.2010 11:50:23

Лишней темой марать форум не стал, решил тут спросить.

К какому событию TListView можно прикрутить процедуру которая если не выбранно ни одного элемента TListView блокирует некоторые кнопки?
OnChange (если не ошибаюсь любое изменение) не отрабатывает как надо?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Вопросы по TListView

Сообщение Mr.Smart » 20.04.2010 12:08:48

TActionList вам в руки!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Вопросы по TListView

Сообщение alaken » 20.04.2010 12:26:52

qivi писал(а):Лишней темой марать форум не стал, решил тут спросить.

К какому событию TListView можно прикрутить процедуру которая если не выбранно ни одного элемента TListView блокирует некоторые кнопки?
OnChange (если не ошибаюсь любое изменение) не отрабатывает как надо?

TListView.OnSelectItem (проверятй параметр Selected)
TListView.OnExit - Потеря фокуса компонентом TListView
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Вопросы по TListView

Сообщение qivi » 21.04.2010 13:02:39

А у события OnSelectItem есть антипод? То есть в если я в OnSelectItem активирую кнопки, мне же их надо где то деактивировать...

Чем может быть полезен OnExit честно сказать не понял... даже когда компонент теряет фокус в нём может быть выделен объект, напротив, можно снять выделение с объектов щелчком на свободном пространстве компонента...
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Вопросы по TListView

Сообщение alaken » 22.04.2010 07:43:44

вы говорили куда прикрутить процедуру я вам показал...
разжовываю:

TListView.OnSelectItem (проверяй параметр Selected)

Код: Выделить всё
procedure TForm1.ListView1SelectItem ( Sender: TObject; Item: TListItem; Selected: Boolean ) ;
begin
  if
    not Selected
  then
    SetBtnState;
end; 

procedure TForm1.ListView1Exit ( Sender: TObject ) ;
begin
  if
    ListView1.SelCount = 0
  then
    SetBtnState;
end;


вот примерно это я имел в виду...

вообще я бы сделал в процедуре изменения состояния кнопок проверку выделенных пунктов и в соответствии устанавливать состояние кнопок
Код: Выделить всё
procedure TForm1.SetBtnState;
begin
  if
    ListView1.SelCount = 0
  then
  begin
     //Set State of Buttons
  end;
end;

procedure TForm1.ListView1SelectItem ( Sender: TObject; Item: TListItem; Selected: Boolean ) ;
begin
    SetBtnState;
end; 

procedure TForm1.ListView1Exit ( Sender: TObject ) ;
begin
  SetBtnState;
end;
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Вопросы по TListView

Сообщение slyubez » 23.09.2023 22:53:44

Апну-ка я эту тему, поделившись одной проблемой, которую таки разгадал. Может, кому пригодится.
Перевожу сейчас на Лазарь относительно небольшой проект с Delphi, чтобы был гуй в Линуксе. Лазарь у меня с GTK2. В нескольких формах есть TListView с ViewStyle=vsReport и включенным RowSelect для отображения текста из таблиц БД. В Item.Data храню числовое представление идентификаторов. Когда я выделяю строчку, в соседнем мемо должен появиться вынутый из базы текст, относящийся к идентификатору, который хватался в обработчике OnSelectItem. В проекте на Delphi все было хорошо. Но каково же было мое удивление, когда в версии для Лазаря у меня в мемо отображались тексты, относящиеся к совершенно другим пунктам. При отладке выяснилось, что при выделении строчки событие OnSelectItem дергалось каждый раз дважды, а предсказать порядок пунктов оказалось невозможным. Восстановить работу удалось приведением обработчиков примерно к такому виду:
Код: Выделить всё
procedure TSelectAntibioticSetForm.AntibioticSetsGridSelectItem(Sender: TObject;
  Item: TListItem; Selected: Boolean);
...
begin
if Item=Nil then Exit;
{$IFDEF FPC}if not Item.Selected then Exit;{$ENDIF}
...
end;

Уже потом нашел вот такую тему на форуме FPC с такой проблемой:
https://forum.lazarus.freepascal.org/in ... ic=28360.0

Добавлено спустя 12 минут 11 секунд:
Сейчас посмотрел доку к Delphi. Результат оказался для меня неожиданным.
С одной стороны:
Vcl.ComCtrls.TListView.OnSelectItem
Description
Occurs when an item is selected in the list view control.
Vcl.ComCtrls.TListView.OnSelectItem inherits from Vcl.ComCtrls.TCustomListView.OnSelectItem. All content below this line refers to Vcl.ComCtrls.TCustomListView.OnSelectItem.
Occurs when an item is selected in the list view control.
Use OnSelectItem to perform actions when an item is selected.
OnSelectItem is an event handler of type Vcl.ComCtrls.TLVSelectItemEvent.


Но с другой -
Vcl.ComCtrls.TLVSelectItemEvent
Description
TLVSelectItemEvent is the type of a list view's TCustomListView.OnSelectItem and TListView.OnSelectItem event handlers.
Sender is the list view object in which an item has been selected or unselected.
Item is the item that has been selected or unselected.
Selected is True if the item has been selected and False if the item has been unselected.

Я в своего рода замешательстве.

Добавлено спустя 1 минуту 53 секунды:
Посмотрю сейчас повнимательнее Delphi-версию.

Добавлено спустя 1 час 29 минут 18 секунд:
Посмотрел. В Delphi обработчик таки также дергается дважды, но такого глюка, который был у меня в Лазаре, не отметилось. Отчего, почему - не знаю. Может в GTK2 действительно какой-то баг есть...
slyubez
постоялец
 
Сообщения: 173
Зарегистрирован: 31.03.2015 08:44:07

Re: Вопросы по TListView

Сообщение Alex2013 » 06.10.2023 01:18:44

slyubez писал(а):Посмотрел. В Delphi обработчик таки также дергается дважды, но такого глюка, который был у меня в Лазаре, не отметилось. Отчего, почему - не знаю. Может в GTK2 действительно какой-то баг есть...


О вспомнил (сам вроде не сталкивался) но кажется такая штука лечится с помощью ListView.BeginUpDate; ... ListView.EndUpDate;

procedure BeginUpdate – блокирует обновление экрана до тех пор,пока не будет выполнен метод EndUpdate. Используется при одновременной вставке нескольких элементов списка для предотвращения мерцания экрана;
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Вопросы по TListView

Сообщение Sharfik » 06.10.2023 05:53:43

:shock: а еще заполняется быстрее
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 766
Зарегистрирован: 20.07.2013 01:04:30

Re: Вопросы по TListView

Сообщение slyubez » 06.10.2023 23:13:15

но кажется такая штука лечится с помощью ListView.BeginUpDate; ... ListView.EndUpDate;

Нет. Мой косяк был не при обновлении ListView, а при выборе строчки в нем. Никакой вставки в это время не происходило.
slyubez
постоялец
 
Сообщения: 173
Зарегистрирован: 31.03.2015 08:44:07

Re: Вопросы по TListView

Сообщение Alex2013 » 07.10.2023 20:27:09

slyubez писал(а):Нет. Мой косяк был не при обновлении ListView, а при выборе строчки в нем. Никакой вставки в это время не происходило.

Прикол в том что иногда ListView делает что-то "не то" даже при простом чтении данных записанных в его полях. Так что попробовать поставить "кавычки" из BeginUpDate ... EndUpDate не помешает. Еще один вариант сделать установку текущего элемент "из самого элемента" ListView1.Items[i].Selected:=True; (И поверять соответственно примерно также )Хотя возможно я снова неврубился в суть проблемы но мне такая штука помогла .

Но зачем мучать обработчик OnSelectItem для получения текущего элемента если есть TListView.Selected и TListView.Selected.Index ?
Зы
И еще procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;Selected: Boolean);
То есть обработчик OnSelectItem действительно вызвется дважды когда Selected: Boolean true и когда false
Что означает что по идее нужно просто проверить .
Код: Выделить всё
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;Selected: Boolean); 
begin
if Selected then
begin
  // заполняем мемо
end;
end;

Уф, по моему это именно то, что не было учтено :idea:
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Вопросы по TListView

Сообщение slyubez » 09.10.2023 12:26:42

Но зачем мучать обработчик OnSelectItem для получения текущего элемента если есть TListView.Selected и TListView.Selected.Index ?

Чтобы получить в момент выделения из Item.Data идентификатор записи для вычитывания из базы в мемо.
slyubez
постоялец
 
Сообщения: 173
Зарегистрирован: 31.03.2015 08:44:07

Re: Вопросы по TListView

Сообщение Alex2013 » 09.10.2023 21:14:08

slyubez писал(а):Чтобы получить в момент выделения из Item.Data идентификатор записи для вычитывания из базы в мемо.

Ну это понятно . Я немного о другом ...
Предположительно у вас как-то так ...
Код: Выделить всё
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;Selected: Boolean);
begin
if Selected then
begin
  // заполняем мемо
Memo1.Lines.text:= PString ( Item.Data)^
end;
end;


А можно сделать иначе . :idea:
Код: Выделить всё
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;Selected: Boolean);
begin

if Selected then
begin
  // заполняем мемо
Memo1.Lines.text:= PString (   ListView1.Selected.data  )^;

end;
end;

Зы
И извиняюсь просмотрел строчку...
{$IFDEF FPC}if not Item.Selected then Exit;{$ENDIF}

Это по идее тоже самое что и if Selected then но возможно что обработка события OnSelectItem вызывается до того как устанавливается Item.Selected ( Или возможно что это именно в нем и происходит )
Тогда возможно что нужно писать как-то так ...
Код: Выделить всё
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;Selected: Boolean);
begin
Inherited ;
if Selected then
begin
  // заполняем мемо
Memo1.Lines.text:= PString ( ListView1.Selected.data  )^;
end;
end;

(Хотя Inherited; в обработчике выглядит как-то странно и вероятно все заработает без него )

Зы Зы
Все проблем с ListView (ИМХО) происходят потому, что он слишком навороченный и многофункциональный... Из него запросто выходит и таблица и древовидный список и галерея картинок + есть мульти выбор и т. д. и т.п.
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 85

Рейтинг@Mail.ru