• 0
Котэ

Обратится к кастомному полю listview

Вопросы

День добрый всем.

Подскажите как  тут избавится от подобного безобразия 

 

procedure ListView1ItemClickEx(const Sender: TObject;
  ItemIndex: Integer; const LocalClickPos: TPointF;
  const ItemObject: TListItemDrawable);
begin
if ItemObject IS TListItemAccessory then
begin
  ShowMessage((ListOrders.Items[ItemIndex].Objects[0] as TListItemText).Text);
end;
end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 ответов на этот вопрос

  • 0
procedure ListView1ItemClickEx(const Sender: TObject;
  ItemIndex: Integer; const LocalClickPos: TPointF;
  const ItemObject: TListItemDrawable);
begin
if ItemObject IS TListItemAccessory then
begin
  ShowMessage(ListOrders.items[ItemIndex].Data['T'].AsString);
  //ShowMessage((ListOrders.Items[ItemIndex].Objects[0] as TListItemText).Text);
end;
end;

это на память...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вижу 2 способа получения значения:

lvContacts.Items[li.Index].Data['textTel'].AsString

и

lvContacts.Items[li.Index].Objects.FindObjectT<TListItemText>('textTel').Text;

 

Как из них более правильный, оптимизированный? Какой лучше использовать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
16 часов назад, x11 сказал:

более правильный, оптимизированный

более правильный - это СОЗДАВАТЬ лист по мотивам некоей структуры в программе, она же - модель данных. и брать все нужные значения оттуда.

модно. стильно. молодежно

а хранить данные на экране - моветон

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Ок, как найти, какой лист какой записи таблицы принадлежит?

У ListItem есть стандартное свойство KeyID?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, krapotkin сказал:

а хранить данные на экране - моветон

 

Я не храню данные на экране, они все в базе. Если они и хранятся на экране, то это разработчик ListView их хранит, а не я.

Но представьте такую ситуацию. Пользователь заполняет некую форму данных какого-нибудь объекта. Физически данные хранятся в двух-трёх таблицах, связанных по внешнему ключу друг с другом. Пока пользователь все данные вводит в визуальные элементы окна, нет смысла записывать их в базу. Например, ListView может отображать контакты: ФИО, телефон, эл. адрес. Но при вводе пользователь может ошибиться и нужно дать ему возможность исправить текст. Поэтому, пока пользователь не нажал кнопку Сохранить объект базу, нет смысла хранить их в базе, но где-то их ранить надо...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, x11 сказал:

но где-то их ранить надо...

и это "где-то" - не лист-вью

и я первый раз слышу, что разработчик листвью дал вам вводить данные прямо в листвью...

зачем листью KeyID? У него есть индекс. Этот же индекс есть и у вашей структуры, в которой вы храните свои данные. А там уже KeyID или что хотите храните

Изменено пользователем krapotkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
13 минуты назад, krapotkin сказал:

и я первый раз слышу, что разработчик листвью дал вам вводить данные прямо в листвью...

 

А я такого и не писал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
14 минуты назад, krapotkin сказал:

зачем листью KeyID? У него есть индекс. Этот же индекс есть и у вашей структуры, в которой вы храните свои данные. А там уже KeyID или что хотите храните

т.е. есть свойство Index, в которое я могу записать любое своё число, например ID из базы, как например, в TAG?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

нет.
 

for i:=0 to MySuperDataModel.ListOfSomething.Count-1 do
begin
  CreateListViewItem(MySuperDataModel.ListOfSomething[i]):
end;

procedure TForm1.OnItemClick(...index:integer...);
begin
   something := MySuperDataModel.ListOfSomething[index];
   showMessage(something.SomeTextProperty);
end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Код выше не совсем понял.

Вы предлагаете кроме данных в базе и данных в ListView ещё какую-то структуру создавать?

Забыл написать, что TListView заполняется данными из базы посредством BindSource и в режиме DynamicAppearance.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

да. предлагаю. А если вам лень и вообще bindSource, то вы же сами себе выбрали технологию ))) сами ее и пользуйте.

Тут особо никто с liveBinding не играется, т.к. они уж больно подозрительные, а если что, как известно, никто в делфи ошибки не исправляет.

Да и производительность решения должна быть крайне невысокой.

Предложение в лоб - перейти по датасету на N-ую запись от начала, и дальше оттуда брать все данные. N=index

 

Если бы вы сами создавали итемы, то вы могли бы вообще все данные вставить в свойство Data

item.Data['xxx'] := yyy

...

aaa := item.Data['xxx'].AsInteger;  

Мне при разработке всегда было приятнее иметь железобетонные технологии, даже если они не самые передовые.

Так что модель данных это гораздо лучше прямой работы с датасетом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
16 часов назад, krapotkin сказал:

Мне при разработке всегда было приятнее иметь железобетонные технологии, даже если они не самые передовые.

Так что модель данных это гораздо лучше прямой работы с датасетом

Это описание Модель-Вид-Контроллер, куда уже передовее... LiveBinding может быть неплох для студентов, но лучше уже сразу по взрослому.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Да? Тогда я так до сих пор и не могу нигде узнать, как что-то записать/прочитать в/из header и footer при использовании dynamicappearance.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
23 часа назад, x11 сказал:

Да? Тогда я так до сих пор и не могу нигде узнать, как что-то записать/прочитать в/из header и footer при использовании dynamicappearance.

Оно или нет?

https://community.embarcadero.com/blogs/entry/adding-headers-to-tlistview-programmatically

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Нет, не оно.

Мне нужно у уже существующего Item вытащить значение header. И именно в режиме dynamicappearance.

Здесь, на форуме есть готовый пример, но там просто кошмар, даже приходится модуль MATH подключать.

Т.е. простого, готового из коробки способа разработчики не предоставили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ссылок было уже до кучи

header это такой же итем, и у него точно так же достается текст как и у всех остальных

Name для элемента тоже показывается в редакторе итема

Можно даже просто в обработчике перечислить и посмотреть все имена всех элементов итема, чтобы понять, как там что устроено

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вот и приходится лепить горбатого, чтобы добраться до подвала или заголовка :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 часа назад, x11 сказал:

Вот и приходится лепить горбатого, чтобы добраться до подвала или заголовка :(

наверху Крапоткин Вам все объяснил.... не очень понятно, что Вы не поняли... 

там все просто, как три копейки. почитайте доки. пройдите курсы Ярослава. очень многое прояснится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу