Перейти к содержанию
Fire Monkey от А до Я
  • 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;

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 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
1 час назад, krapotkin сказал:

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

 

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

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

 

Ссылка на комментарий
  • 0
2 часа назад, x11 сказал:

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

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

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

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

Изменено пользователем 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
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
3 часа назад, x11 сказал:

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

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

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

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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