Вопросы по TListView

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

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

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

Вопросы по TListView

Сообщение qivi »

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

Сообщение qivi »

Означает ли всеобщее молчание невозможность моего желания?
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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

ах... желания и страсти... они терзают душу и тело!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

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

К какому событию TListView можно прикрутить процедуру которая если не выбранно ни одного элемента TListView блокирует некоторые кнопки?
OnChange (если не ошибаюсь любое изменение) не отрабатывает как надо?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

TActionList вам в руки!
alaken
постоялец
Сообщения: 221
Зарегистрирован: 18.02.2010 08:02:13

Сообщение alaken »

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

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

TListView.OnSelectItem (проверятй параметр Selected)
TListView.OnExit - Потеря фокуса компонентом TListView
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

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

Чем может быть полезен OnExit честно сказать не понял... даже когда компонент теряет фокус в нём может быть выделен объект, напротив, можно снять выделение с объектов щелчком на свободном пространстве компонента...
alaken
постоялец
Сообщения: 221
Зарегистрирован: 18.02.2010 08:02:13

Сообщение alaken »

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

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;
slyubez
постоялец
Сообщения: 185
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

Апну-ка я эту тему, поделившись одной проблемой, которую таки разгадал. Может, кому пригодится.
Перевожу сейчас на Лазарь относительно небольшой проект с 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 действительно какой-то баг есть...
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

slyubez писал(а):Посмотрел. В Delphi обработчик таки также дергается дважды, но такого глюка, который был у меня в Лазаре, не отметилось. Отчего, почему - не знаю. Может в GTK2 действительно какой-то баг есть...
О вспомнил (сам вроде не сталкивался) но кажется такая штука лечится с помощью ListView.BeginUpDate; ... ListView.EndUpDate;
procedure BeginUpdate – блокирует обновление экрана до тех пор,пока не будет выполнен метод EndUpdate. Используется при одновременной вставке нескольких элементов списка для предотвращения мерцания экрана;
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

:shock: а еще заполняется быстрее
slyubez
постоялец
Сообщения: 185
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

но кажется такая штука лечится с помощью ListView.BeginUpDate; ... ListView.EndUpDate;
Нет. Мой косяк был не при обновлении ListView, а при выборе строчки в нем. Никакой вставки в это время не происходило.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

slyubez писал(а):Нет. Мой косяк был не при обновлении ListView, а при выборе строчки в нем. Никакой вставки в это время не происходило.
Прикол в том что иногда ListView делает что-то "не то" даже при простом чтении данных записанных в его полях. Так что попробовать поставить "кавычки" из BeginUpDate ... EndUpDate не помешает. Еще один вариант сделать установку текущего элемент "из самого элемента" ListView1.Items.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:
slyubez
постоялец
Сообщения: 185
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

Но зачем мучать обработчик OnSelectItem для получения текущего элемента если есть TListView.Selected и TListView.Selected.Index ?
Чтобы получить в момент выделения из Item.Data идентификатор записи для вычитывания из базы в мемо.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

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 (ИМХО) происходят потому, что он слишком навороченный и многофункциональный... Из него запросто выходит и таблица и древовидный список и галерея картинок + есть мульти выбор и т. д. и т.п.
Ответить