Вопросы по TListView
Модератор: Модераторы
Вопросы по TListView
Возможно ли элементу TListView использовать картинку из "вне", а не из TImageList?
Последний раз редактировалось qivi 20.04.2010 11:46:31, всего редактировалось 1 раз.
Означает ли всеобщее молчание невозможность моего желания?
есть желание фичи, но нет желания читать документацию?! 
ах... желания и страсти... они терзают душу и тело!
ах... желания и страсти... они терзают душу и тело!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Лишней темой марать форум не стал, решил тут спросить.
К какому событию TListView можно прикрутить процедуру которая если не выбранно ни одного элемента TListView блокирует некоторые кнопки?
OnChange (если не ошибаюсь любое изменение) не отрабатывает как надо?
К какому событию TListView можно прикрутить процедуру которая если не выбранно ни одного элемента TListView блокирует некоторые кнопки?
OnChange (если не ошибаюсь любое изменение) не отрабатывает как надо?
TActionList вам в руки!
qivi писал(а):Лишней темой марать форум не стал, решил тут спросить.
К какому событию TListView можно прикрутить процедуру которая если не выбранно ни одного элемента TListView блокирует некоторые кнопки?
OnChange (если не ошибаюсь любое изменение) не отрабатывает как надо?
TListView.OnSelectItem (проверятй параметр Selected)
TListView.OnExit - Потеря фокуса компонентом TListView
А у события OnSelectItem есть антипод? То есть в если я в OnSelectItem активирую кнопки, мне же их надо где то деактивировать...
Чем может быть полезен OnExit честно сказать не понял... даже когда компонент теряет фокус в нём может быть выделен объект, напротив, можно снять выделение с объектов щелчком на свободном пространстве компонента...
Чем может быть полезен OnExit честно сказать не понял... даже когда компонент теряет фокус в нём может быть выделен объект, напротив, можно снять выделение с объектов щелчком на свободном пространстве компонента...
вы говорили куда прикрутить процедуру я вам показал...
разжовываю:
TListView.OnSelectItem (проверяй параметр Selected)
вот примерно это я имел в виду...
вообще я бы сделал в процедуре изменения состояния кнопок проверку выделенных пунктов и в соответствии устанавливать состояние кнопок
разжовываю:
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;
Апну-ка я эту тему, поделившись одной проблемой, которую таки разгадал. Может, кому пригодится.
Перевожу сейчас на Лазарь относительно небольшой проект с Delphi, чтобы был гуй в Линуксе. Лазарь у меня с GTK2. В нескольких формах есть TListView с ViewStyle=vsReport и включенным RowSelect для отображения текста из таблиц БД. В Item.Data храню числовое представление идентификаторов. Когда я выделяю строчку, в соседнем мемо должен появиться вынутый из базы текст, относящийся к идентификатору, который хватался в обработчике OnSelectItem. В проекте на Delphi все было хорошо. Но каково же было мое удивление, когда в версии для Лазаря у меня в мемо отображались тексты, относящиеся к совершенно другим пунктам. При отладке выяснилось, что при выделении строчки событие OnSelectItem дергалось каждый раз дважды, а предсказать порядок пунктов оказалось невозможным. Восстановить работу удалось приведением обработчиков примерно к такому виду:
Уже потом нашел вот такую тему на форуме FPC с такой проблемой:
https://forum.lazarus.freepascal.org/in ... ic=28360.0
Добавлено спустя 12 минут 11 секунд:
Сейчас посмотрел доку к Delphi. Результат оказался для меня неожиданным.
С одной стороны:
Добавлено спустя 1 минуту 53 секунды:
Посмотрю сейчас повнимательнее Delphi-версию.
Добавлено спустя 1 час 29 минут 18 секунд:
Посмотрел. В Delphi обработчик таки также дергается дважды, но такого глюка, который был у меня в Лазаре, не отметилось. Отчего, почему - не знаю. Может в GTK2 действительно какой-то баг есть...
Перевожу сейчас на Лазарь относительно небольшой проект с 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;
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 действительно какой-то баг есть...
О вспомнил (сам вроде не сталкивался) но кажется такая штука лечится с помощью ListView.BeginUpDate; ... ListView.EndUpDate;slyubez писал(а):Посмотрел. В Delphi обработчик таки также дергается дважды, но такого глюка, который был у меня в Лазаре, не отметилось. Отчего, почему - не знаю. Может в GTK2 действительно какой-то баг есть...
procedure BeginUpdate – блокирует обновление экрана до тех пор,пока не будет выполнен метод EndUpdate. Используется при одновременной вставке нескольких элементов списка для предотвращения мерцания экрана;
Нет. Мой косяк был не при обновлении ListView, а при выборе строчки в нем. Никакой вставки в это время не происходило.но кажется такая штука лечится с помощью ListView.BeginUpDate; ... ListView.EndUpDate;
Прикол в том что иногда ListView делает что-то "не то" даже при простом чтении данных записанных в его полях. Так что попробовать поставить "кавычки" из BeginUpDate ... EndUpDate не помешает. Еще один вариант сделать установку текущего элемент "из самого элемента" ListView1.Items.Selected:=True; (И поверять соответственно примерно также )Хотя возможно я снова неврубился в суть проблемы но мне такая штука помогла .slyubez писал(а):Нет. Мой косяк был не при обновлении ListView, а при выборе строчки в нем. Никакой вставки в это время не происходило.
Но зачем мучать обработчик 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;
Чтобы получить в момент выделения из Item.Data идентификатор записи для вычитывания из базы в мемо.Но зачем мучать обработчик OnSelectItem для получения текущего элемента если есть TListView.Selected и TListView.Selected.Index ?
Ну это понятно . Я немного о другом ...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;
Код: Выделить всё
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;
Зы Зы
Все проблем с ListView (ИМХО) происходят потому, что он слишком навороченный и многофункциональный... Из него запросто выходит и таблица и древовидный список и галерея картинок + есть мульти выбор и т. д. и т.п.
