• 0
Kitty

TListView Как разместить программно TTimeEdit в ListView?

Вопрос

Приложение создается для платформы Андроид.
Из INI файла читается время и помещается в список. Рисунок прилагается. Для размещения этого времени справа в списке я использую стандартный пример, который идет в Samples студии:

const System::UnicodeString sText = L"CA";
void __fastcall TForm1::ListView1UpdatingObjects(const TObject *Sender, const TListViewItem *AItem,
		  bool &AHandled)
{
 TListItemText * LCaption = reinterpret_cast<TListItemText*>((const_cast<TListViewItem*>(AItem))->Objects->FindObject(sText));
 if (LCaption == NULL)
	{
		LCaption = new TListItemText((TListItem*)AItem);
		LCaption->Name = sText;
		LCaption->Align = TListItemAlign::Trailing;
		LCaption->VertAlign = TListItemAlign::Trailing;
		LCaption->PlaceOffset->X = 15;
		LCaption->PlaceOffset->Y = 12;
		LCaption->TextAlign = TTextAlign::Center;
		LCaption->Trimming = TTextTrimming::Character;
		LCaption->IsDetailText = True;
		LCaption->Width = 90;
		LCaption->Height = 45;
	}
}

//в другом месте программы цикл и в нем фрагмент заполнения:
TListViewItem * item = ListView1->Items->Add();
//*********************
//в (*It).first например значение: 08:00:00
item->Data[sText] = TValue::From<UnicodeString>((*It).first);

Подскажите, пожалуйста, как вместо простого текста в этих местах размещать программно компонент TTimeEdit чтобы читать в него значения, и иметь возможность править эти значения времени прямо в ListView?

Спасибо.

post-132-0-10091900-1406033051.jpg

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


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

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

  • 0

Могу помочь реализовать это в ListBox + Stylebook. ListView практически не использую.

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


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

Спасибо, можно выложить урок?

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


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

У меня оба варианта не работают. Как правильно?

void __fastcall TMainForm::Button3Click(TObject *Sender)
{
//ItemAppearance=Custom
ListView1->BeginUpdate();
 for (int i = 0; i < 10; i++)
  {
   TListViewItem * item = ListView1->Items->Add();
   item->Text = "Текст: " + IntToStr(i);
   item->Detail = "Детальный текст: " + IntToStr(i);
   TTimeEdit * VideoTimeEdit = new TTimeEdit(item->Parent);
   VideoTimeEdit->Parent = item->Parent;
   VideoTimeEdit->Position->X = 140;
   VideoTimeEdit->Position->Y = 10;
   VideoTimeEdit->TimeFormatKind = 1;
  }
ListView1->EndUpdate();
 
}
void __fastcall TMainForm::Button3Click(TObject *Sender)
{
//ItemAppearance=Custom
TListViewItem * item;
TTimeEdit * VideoTimeEdit;
ListView1->BeginUpdate();
int j = 0;
 for (int i = 0; i < 10; i++)
  {
   item = new TListViewItem(ListView1);
   item->Text = "Текст: " + IntToStr(i);
   item->Detail = "Детальный текст: " + IntToStr(i);
   VideoTimeEdit = new TTimeEdit(item->Parent);
   VideoTimeEdit->Parent = item->Parent;
   VideoTimeEdit->Position->X = 140;
   VideoTimeEdit->Position->Y = 10 ;
   VideoTimeEdit->TimeFormatKind = 1;
   ListView1->AddObject(item);
  }
ListView1->EndUpdate();
}
//Could not find a match for 'TListViewItem::TListViewItem(TListView *)'

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


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

Главные отличия TListView от TListBox в:

  1. TListBoxItem - контрол, TListViewItem - нет
  2. В TListBoxItem можно добавлять любые контролы, используя Parent. В TListVIewItem - нет.
  3. TListVIewItem хранит только данные для отображения
  4. TListVIewItem сам выполняет отрисовку хранимых данных через метод Render
  5. За счет собственно ручной отрисовки в TListVIewItem достигается прирост скорости и малое потребление памяти (хранение только актуальных данных)
  6. Чтобы создать свой вариант TListViewItem, нужно создать свой класс итема, в нем реализовать требуемые данные (например время) и создать in-place редактор для редактирования времени, зарегистрировать его и тд.

P.S. В вашем случае, проще использовать Master-Detail подход. При котором по нажатию на итем, будет открываться вкладка для редактирования информации об итеме, в том числе время через TTimeEdit. Это будет быстрее и проще.

 

P.S.P.S. Если же вы все-таки хотите создать свой итем, будьте готовы, что придется детально изучить, как это делается в самом TListVew.

Евгений Корепов и Kitty понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

  • Похожие публикации

    • Автор: ENERGY
      Привет.
      Я к своему стыду так и не научился толком работать с TListView. 
      TListBox это сделать просто, а вот как это сделать в TListView... Это сложный компонент.
      Подскажите как правильно реализовать.
      Нужно добавить с правой стороны каждого Item иконку избранное, которая работала бы как чекбокс - если нажать по ней то звездочка становится желтой и без заливки (Checked/unchecked) .
      Насколько я понял в GlyphButton нельзя добавить картинку.. Как же тогда это сделать?
      Спасибо.
    • Автор: Евгений Корепов
      Господа и товарищи, помогите тупому мне! Столкнулся с странным. Под windows все отлично работает, а под android не могу добиться загрузки картинок. Мозг уже сломал.
      Собрал тестовый проект - в ListView (DynamicAppearance) добавляем 4 ListViewItem, в ListViewUpdatingObjects все создаем и грузим картинки из инета (потоки и прочее убрал для упрощения). Картанка слева, текст (URL) справа, проще некуда. Прилагаю к сообщению архив проекта и код.
      unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, FMX.ListView, System.Net.HTTPClient, FMX.Objects; type TFormMain = class(TForm) ListView: TListView; procedure ListViewUpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean); procedure FormShow(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } ListViewUpdate : Boolean; procedure MyListViewUpdateObjects(const AListView: TListView; const AItem: TListViewItem); procedure InitListView(AListView : TListView); function LoadImageFromURL(AURL : String) : TBitmap; end; var FormMain: TFormMain; implementation {$R *.fmx} procedure TFormMain.FormCreate(Sender: TObject); begin ListViewUpdate:=False; end; procedure TFormMain.FormShow(Sender: TObject); begin InitListView(ListView); end; procedure TFormMain.InitListView(AListView : TListView); Var AListViewItem : TListViewItem; AImageURL : String; begin AImageURL:='http://kayfolom.ru/images/test/'; ListViewUpdate:=True; AListViewItem:=AListView.Items.Add; AListViewItem.Data['ImageURL']:=AImageURL + 'logo.png'; ListViewUpdate:=False; AListViewItem.Adapter.ResetView(AListViewItem); ListViewUpdate:=True; AListViewItem:=AListView.Items.Add; AListViewItem.Data['ImageURL']:=AImageURL + '000487806d3a2ab98aeb2c47b810fc8b.jpg'; ListViewUpdate:=False; AListViewItem.Adapter.ResetView(AListViewItem); ListViewUpdate:=True; AListViewItem:=AListView.Items.Add; AListViewItem.Data['ImageURL']:=AImageURL + '0012ef6cb42e95268a4cd1d832a2b93a.jpg'; ListViewUpdate:=False; AListViewItem.Adapter.ResetView(AListViewItem); ListViewUpdate:=True; AListViewItem:=AListView.Items.Add; AListViewItem.Data['ImageURL']:=AImageURL + '0022454ccb4f81a701cb3a3c89d52d2f.jpg'; ListViewUpdate:=False; AListViewItem.Adapter.ResetView(AListViewItem); end; procedure TFormMain.ListViewUpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean); begin if Not ListViewUpdate then begin MyListViewUpdateObjects(Sender as TListView, AItem); AHandled:=True; end; end; procedure TFormMain.MyListViewUpdateObjects(const AListView: TListView; const AItem: TListViewItem); Var AName : TListItemText; AImage : TListItemImage; AvailableWidth, ImageWidth, ImageHeight : single; function SetupTextObject(const AName, AText : String; AFontSize : Single; AFontStyles : TFontStyles; AWidth, AHeight, X , Y : Single; AAlign, AVertAlign: TListItemAlign; ATextAlign, ATextVertAlign: TTextAlign) : TListItemText; begin Result:=TListItemText(AItem.View.FindDrawable(AName)); if Result=Nil then Result:=TListItemText.Create(AItem); Result.Name:=AName; Result.Width:=AWidth; Result.WordWrap:=True; Result.Font.Size:=AFontSize; Result.Font.Style:=Result.Font.Style + AFontStyles; Result.Trimming:=TTextTrimming.None; Result.Text:=AText; Result.PlaceOffset.X:=X; Result.PlaceOffset.Y:=Y; Result.Align:=AAlign; Result.VertAlign:=AVertAlign; Result.TextAlign:=ATextAlign; Result.TextVertAlign:=ATextVertAlign; Result.Height:=AHeight; end; function SetupImageObject(const AName : String; AWidth, AHeight, X , Y : Single; AAlign, AVertAlign: TListItemAlign) : TListItemImage; Var AImageURL : String; begin Result:=TListItemImage(AItem.View.FindDrawable(AName)); if Result=Nil then begin Result:=TListItemImage.Create(AItem); AImageURL:=AItem.Data['ImageURL'].AsString; Result.Bitmap:=LoadImageFromURL(AImageURL); end; Result.Name:=AName; Result.Width:=AWidth; Result.Height:=AHeight; Result.PlaceOffset.X:=X; Result.PlaceOffset.Y:=Y; Result.Align:=AAlign; Result.VertAlign:=AVertAlign; Result.ScalingMode:=TImageScalingMode.StretchWithAspect; end; begin AvailableWidth:=AListView.Width - AListView.ItemSpaces.Left - AListView.ItemSpaces.Right; // Изображение размещаем слева ImageWidth:=AvailableWidth / 3; ImageHeight:=AvailableWidth / 3; AImage:=SetupImageObject('Image', ImageWidth, ImageHeight, 0, 0, TListItemAlign.Leading, TListItemAlign.Leading); // Текст справа AName:=SetupTextObject('Name', AItem.Data['ImageURL'].AsString, 14, [], AvailableWidth - ImageWidth, ImageHeight, ImageWidth, 0, TListItemAlign.Leading, TListItemAlign.Leading, TTextAlign.Center, TTextAlign.Center); AItem.Height:=Round(ImageHeight + AListView.ItemSpaces.Top + AListView.ItemSpaces.Bottom); end; function TFormMain.LoadImageFromURL(AURL : String) : TBitmap; Var AHTTPClient : THTTPClient; AStream : TMemoryStream; HTTPResponse : IHTTPResponse; begin Result:=Nil; AHTTPClient:=THTTPClient.Create; AStream:=TMemoryStream.Create; try HTTPResponse:=AHTTPClient.Get(AURL, AStream); finally if HTTPResponse.StatusCode=200 then Result:=TBitmap.CreateFromStream(AStream); end; end; end.  
      test092 ListView with Image.7z
    • Автор: chaplin.u@gmail.com
      Использую TTimeEdit чтобы задать период времени а на телефоне стоит режим 12 часов и TTimeEdit показывает 2 АМ т.д. 
      Как его принудительно перевести в режим 24 часа независимо от установок в телефоне ?
    • Автор: Евгений Корепов
      При расчете высоты TListItemText приходилось использовать костыль - указывать размер шрифта отличный от 12 (например 12.01 и т.д.), если эти пренебречь, то расчет высоты не работал и текст или резался или высота итема оказывалась гораздо больше текста. Проблема в том, что на стадиях расчета высоты, к TListItemText еще не применен стиль, и параметры шрифта не соответствуют тому как будет выглядеть окончательный вариант на экране.
      Для правильного расчета высоты нужно выдернуть шрифт из стиля, делается это вот так:
      Var AFontObject : TFontObject; AListItemText : TListItemText; ... AListItemText:=TListItemText(AItem.View.FindDrawable(AName)); if AListItemText=Nil then AListItemText:=TListItemText.Create(AItem); AFontObject:=(AListView.FindStyleResource('font') as TFontObject); if Assigned(AFontObject) then AListItemText.Font.Assign(AFontObject.Font); //Теперь вычисление высоты имеет смысл и не нужно задавать размер шрифта - он берется из стиля. AListItemText.Height:=CalculateHeight(AListItemText, AListView, FTextLayout); Или можно затолкать это действие в функцию вычисления высоты:
      function CalculateHeight(const AListItemText : TListItemText; const AListView : TListView; const FTextLayout : TTextLayout) : Single; Var AFontObject : TFontObject; begin FTextLayout.BeginUpdate; try FTextLayout.Text:=AListItemText.Text; FTextLayout.MaxSize:=TPointF.Create(AListItemText.Width, TTextLayout.MaxLayoutSize.Y); AFontObject:=(AListView.FindStyleResource('font') as TFontObject); if Assigned(AFontObject) then FTextLayout.Font.Assign(AFontObject.Font) else FTextLayout.Font.Assign(AListItemText.Font); FTextLayout.WordWrap:=AListItemText.WordWrap; FTextLayout.Trimming:=AListItemText.Trimming; FTextLayout.HorizontalAlign:=AListItemText.TextAlign; FTextLayout.VerticalAlign:=AListItemText.TextVertAlign; finally FTextLayout.EndUpdate; end; // Result:=FTextLayout.Height * 1.4; // Теперь этот костыль не нужен Result:=FTextLayout.Height; end; Внимание! Если вы заполняете еще невидимый на экране ListView, не забудьте выполнить ListView.ApplyStyleLookup перед добавлением Items, иначе не получите правильный размер шрифта из стиля.
    • Автор: ENERGY
      Меня это проблема преследует со времен VCL...
      Подскажите как же ее решить...
      FMX TListView - ItemAppearanceName = ImageListItem.   Лежит fmx TimageList, в настройках указано 16x16 и прорачный цвет clNone, добавил одну иконку 16x16 с прозрачностью. Если запустить под Windows 10  все ок. Если запустить под Android то при выделении (selected) вместо прозрачности белый цвет. В результате иконка некрасиво обрамлена в белом квадрате.. Иконку делал в Axiallis IconWorkShop, сохранил как ico,  Пробовал заливать белым вместо прозрачного, и затем ставить в TimageList белый как прозрачный - тоже самое...
      Что же делать...
    • Автор: gresaggr
      Добрый день.
      Подскажите, пожалуйста, как можно реализовать на Berlin для Андроида такую таблицу без StringGrid'а (динамически)?

       
    • Автор: Равиль Зарипов (ZuBy)
      Ссылка: http://blog.rzaripov.kz/2016/12/3-modernlistview.html
      Автор: Зарипов Равиль @ZuBy
      Описание:  Реализация динамической подгрузки контента:
      Бесконечный скроллинг (например как лента в ВК) Паджинация/Пагинация (постраничная загрузка)
    • Автор: AlexG
      Добрый вечер, друзья!
      Кто в курсе, подскажите - возможен ли плавный скроллинг содержимого TListView при работе приложения под Windows?
      Если с мобильным вариантом все ОК, на "автомате" - т.е. плавный скроллинг там работает по умолчанию, то с работой под Windows что-то не понятно как это включить/реализовать.
      Например, чтобы сделать плавный скролл содержимого TListBox, достаточно написать
      TScrollBox(__listbox1___).AniCalculations.Animation := True; А есть ли что-то аналогичное для TListView?
      Заранее благодарен за ответы!
    • Автор: Равиль Зарипов (ZuBy)
      Ссылка: http://blog.rzaripov.kz/2016/11/2-modernlistview.html
      Автор: Зарипов Равиль @ZuBy
      Описание: Как сделать режим мультивыделения в TListView

    • Автор: Равиль Зарипов (ZuBy)
      Ссылка: http://blog.rzaripov.kz/2016/11/1-modernlistview.html
      Автор: Зарипов Равиль @ZuBy
      Описание: Чуть подробней о горизонтальном режиме

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу