Перейти к содержанию
Fire Monkey от А до Я
  • 0

walexw

Вопрос

rad studio 10 seattle + таблица SQLite
В таблице 3 поля
LastName - varchar
FirstName - varchar
recClose - bool
Считываю в listView (ItemAppearance = ImageListItemBottomDetailRightButton) две строки и справа кнопка
Мне надо, чтобы кнопка была видна только у записей у которых recClose = 0, Пишу цикл
for (FDQuery->First(); !FDQuery->Eof; FDQuery->Next())
{
       TListViewItem* item = ListView->Items->Add();
       item->Text    = FDQuery->FieldByName("LastName")->AsString;
       item->Detail  = FDQuery->FieldByName("FirstName")->AsString;
       if   (!FDQuery->FieldByName("recClose")->AsBoolean)
             item->Objects->TextButton->Visible  = false;
}
На экране, хоть тресни кнопка видна всегда. Пытаюсь подобраться к объекту "кнопка" - пишет не существует еще.
Но что интересно, стоит использовать эту же процедуру второй раз, т.е. в работающем приложении еще раз зайти
на закладку при открытии которой срабатывает считывание, все становится на свои места.
Вторую неделю бьюсь с этой проблемой.
Подскажите кто знает, как заставить прятаться кнопку с первого раза.
Вариант, сразу два раза прочитать, или перепрочитать после завершения цикла, пробовал на все лады, нет объекта и все тут.
Спасибо.

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

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

  • 0
  • Модераторы
20 минут назад, walexw сказал:

На экране, хоть тресни кнопка видна всегда. Пытаюсь подобраться к объекту "кнопка" - пишет не существует еще.
Но что интересно, стоит использовать эту же процедуру второй раз, т.е. в работающем приложении еще раз зайти
на закладку при открытии которой срабатывает считывание, все становится на свои места.
Вторую неделю бьюсь с этой проблемой.

сделать <TListView>.Resize; после заполнения

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

сделать <TListView>.Resize; после заполнения

<TListView>.Resize никак не помог. Наоборот он сбросил все в дефолтовое состояние, как в дизайнере формы.
При этом раньше, вторая отработка кода правильно тушила кнопку, а теперь все всегда в дефолт, а там кнопка видна.
Обратиться к ButtonText не получается. Компилятор пропускает код, а при выполнении ошибка.

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

могу порекомендовать только свой способ

тотально всё что нужно создавать самому в OnUpdatingObjects

procedure XXX.CreateItem();
begin
  fUpdating:=true;
  item := ListView.items.Add();
  item.Data['key1']:=value1;
  item.Data['key2']:=value2;
  fUpdating:=false;
  item.Adapter.ResetView(item); // вот тут вызовется OnUpdatingObjects!
end;

procedure XXX.UpdatingObjects();

begin
  if FUpdating then exit;
  h:=5;
  // НАЗВАНИЕ
  aText:=SetupTextObject(sText, AItem.Data['key1'].AsString, freeWidth , -1,
      10, h,
      TListItemAlign.Leading, TListItemAlign.Leading, TTextAlign.Leading, TTextAlign.Leading);
  aText.Font.Style := [TFontStyle.fsBold];
  aText.Font.Size := 18;
  atext.Height := CalculateHeight(atext, lvWallets);
  h:=h+atext.Height;
...

  // линия посредине
  line := aitem.Objects.FindObjectT<TListItemLine>('key2');
  if line=nil then
    line := TListItemLine.Create(AItem);
  line.name := sLine;
  line.width := lvWallets.width - lvWallets.itemspaces.left - lvWallets.itemspaces.right -10 -10;
  line.height := 1;
  line.color := Emerald;
  line.placeOffset.x := 10;
  line.placeOffset.y := h;
  line.lineWidth:=1;
  h:=h+5;
....

  AHandled:=true;
end;

код неточный, только для иллюстрации идеи
 

в этом случае лучше всего режим Dynamic. Там не создаются лишние "предустановленные" элементы Text Detail и т.д.

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0
12 часа назад, ZuBy сказал:

Это все потому что скрытие кнопки делать нужно в OnUpdateObjects 

Да я и рад бы сделать скрытие там, но когда проверяю в OnUpdateObjects наличие кнопки, он пишет:
ObjectButton is NULL и все мои команды относительно кнопки игнорирует, в итоге она остается видимой.
Возможно я что-то не так делаю, поэтому и пишу в форум.
Сейчас буду разбирать код Крапоткина, надеюсь поможет.

Ссылка на комментарий
  • 0
  • Модераторы

В Seattle ничего не нужно мудрить

1) Заполняем список

2) Делаем ресайз TListView

3) В OnUpdateObjects меняем видимость элементов

У меня в проекте 5-6 TListView с кастомными рендорами, все корректно работает.

Ссылка на комментарий
  • 0
  • Модераторы
10 минут назад, krapotkin сказал:

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

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

Из изменении: процедура рендер обзавелась доп. параметрами, и FindObjectT<> (но я думаю FindDrawable никуда не делся?)

У топикстартера Seattle

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0
В ‎10‎.‎06‎.‎2016 в 12:38, ZuBy сказал:

В Seattle ничего не нужно мудрить

1) Заполняем список

2) Делаем ресайз TListView

3) В OnUpdateObjects меняем видимость элементов

У меня в проекте 5-6 TListView с кастомными рендорами, все корректно работает.

ZuBy, не могли бы вы выложить текст одного из OnUpdateObjects, где вы обрабатываете какие-либо свойства TextButton
Спасибо.

Ссылка на комментарий
  • 0
  • Модераторы

Там слишком много кода, чтобы выкладывать. Появится больше вопросов чем ответов. 

Если я хочу скрыть один из элементов, создаю в Data доп. числовой параметр. Затем в событии изменяю видимость в зависимости от его значения. Параметр управляется вне события. 

Сейчас Делфи нет под рукой, но приблизительно так

Aitem.Objects.TextObject.Visible := aitem.data['hide_text'].asinteger <> 1;

Изменено пользователем ZuBy
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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