• 0

Вопрос

Delphi Tokyo

ListView->ItemAppearance->ItemAppearance=DynamicAppearance

Есть ImageList c 3 картинками.

Добавляю item-ы в ListView:

procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  Lvi: TListViewItem;
begin
  LsvObjects.BeginUpdate;
  LsvObjects.Items.Clear;
  try
    for i:=0 to 100 do
    begin
      Lvi := LsvObjects.Items.Add;
      Lvi.Tag := i;
      Lvi.Data['ObjectText']  := 'ObjectText '+i.ToString;
      Lvi.Data['StateText']   := 'StateText '+i.ToString;
      Lvi.Data['ConnectText'] := 'ConnectText '+i.ToString;
    end;
  finally
    LsvObjects.EndUpdate;
  end;
end;

в UpdateObjects рандомно выбираю картинку:

procedure TForm1.LsvObjectsUpdateObjects(const Sender: TObject;
  const AItem: TListViewItem);
var
  ...
  oConnectImage: TListItemImage;
  r: integer;
begin
  r:=Random(ImageList1.Count);

  oConnectImage:=aItem.Objects.FindDrawable('ConnectImage') as TListItemImage;
  if (oConnectImage<>nil) then
    oConnectImage.ImageIndex:=r;
  ...
end;

В Windows все нормально. А вот что я вижу на планшетах:

На Dexp:   intel-Tokyo.thumb.png.a1bb604ecb87f98a637b5f61cd6f0ad0.png

На Lenovo:Lenovo-Tokyo.thumb.png.c994ea529008d902de22799bf236e782.png

 

Картинки могут появиться, а могут и нет. Как исправить ситуацию? Вот сам проект.

Про Berlin добавлю вопрос позже.

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


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

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

  • 0

Вот так сделайте:

procedure TForm1.LsvObjectsUpdateObjects(const Sender: TObject;
  const AItem: TListViewItem);
var
  ...
  oConnectImage: TListItemImage;
  r: integer;
begin
  r:=Random(ImageList1.Count);

  oConnectImage:=aItem.Objects.FindDrawable('ConnectImage') as TListItemImage;
  if (oConnectImage<>nil) then
  begin
    oConnectImage.OwnsBitmap:=True;
    oConnectImage.ImageIndex:=r;
  end;
  ...
end;

Добавьте строчку oConnectImage.OwnsBitmap:=True. В соседней теме я долго бился над этим.

Rusland понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
В 15.04.2017 в 11:13, Евгений Корепов сказал:

Добавьте строчку oConnectImage.OwnsBitmap:=True. В соседней теме я долго бился над этим.

К сожалению, это не помогло. Какая-нибудь из картинок обязательно теряется

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

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


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

Попробуйте избавится от ImageList на время тестов, замените на TArray<TBitmap> к примеру. Так же попробуйте после oConnectImage.ImageIndex:=r; делать oConnectImage.Bitmap.SaveToFile('d:\0\'+Автоинкремент+'.jpg'). У меня в подобной ситуации несколько процентов картинок в папке 'd:\0\' были черными, видимо пустые, отказался по этой причине от связки ImageList и ListView.

Изменено пользователем Евгений Корепов
Rusland понравилось это

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


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

Создайте аккаунт или войдите для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

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

    • Автор: Mars M
      Загружаю большой список в ListView, время загрузки где то 5-7 секунд.
      Это много, по этому переделал что бы список загружался динамически, как к концу пролистывается, подгружаются новые данные.
      Все бы хорошо, но вот ScrollBar при загрузке новых данных меняет размер и позицию. 
      Это не очень нравиться
      Можно как то заранее настроить его размер под конечное число итемов?
      Или может как то по другому сделать.
    • Автор: Володимир Антонашко
      Здраствуйте.
      В программе я заполняю Tgrid изображениями из Imagelist по имени фото который есть в ячейке . Код :
      if column.index = 8 then //Загрузка картинок. if not value.IsEmpty then begin column.BeginUpdate; i:=StrToInt(maingr.Cells[column.Index,row]); imageindex:=main_form.ImageList1.Source.IndexOf(IntToStr(i)); column.Canvas.Clear(RowColor.Color); main_form.ImageList1.draw(column.Canvas,bounds,imageindex,100); column.EndUpdate; end; Если я уберу очистку канвы то изображения накладуються. А так как есть следующий раз при вызове DrawColumnCell изображение остается только в последней записи.
      Но такой код в  процедуре SelectCell нормально отображает изображение. На каждый вызов. Даже если изображение в ячейке нету.
      if acol = 8 then begin i:=maingr.Cells[Acol,Arow]; imageindex:=main_form.ImageList1.Source.IndexOf(i); imageviewer1.Bitmap.Clear(TAlphaColors.Null); imageviewer1.Bitmap:=main_form.ImageList1.Bitmap(size,imageindex); end; И по поводу памяти. Как я понял, после того как я присвою изображение ячейке, оно загружается в память. Также когда отображается в ImageViewer.
      Но после удаления строки с изображениям, память остается занята для уже использованных изображений.  То есть при повторном показе память больше не занимается и используется изображение которое было ранее загружено. Думаю это нормальное поведение. Так увеличивается скорость работы программы. Но я собираюсь показывать до 50 фотографий одновременно (средний размер 1мб) из 5-10 тисяч. И мне нужно чтоб после использования изображений память очищалась, иначе программа будет кушать под 10гб оперативной памяти.
    • Автор: Евгений Корепов
      TThread.ForceQueue не работает в Android. Но можно утешить себя тем, что отлично работает в Windows ;-)
      Код следующий:
      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.Memo, FMX.Controls.Presentation, FMX.ScrollBox; type TForm1 = class(TForm) Memo: TMemo; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } procedure MyLog(AMessage : String); procedure TestForceQueue; end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.TestForceQueue; begin MyLog('In main thread start'); TThread.ForceQueue(Nil, procedure begin MyLog('In ForceQueue start'); TThread.Sleep(2000); MyLog('In ForceQueue stop'); end); MyLog('In main thread stop'); end; procedure TForm1.FormShow(Sender: TObject); begin TestForceQueue; end; procedure TForm1.MyLog(AMessage : String); Var ATime : String; LMessage : String; begin DateTimeToString(ATime, 'dd.mm.yyyy hh.nn.ss.zzz', Now); LMessage:=ATime + ' ' + AMessage; TThread.Synchronize(Nil, procedure begin Memo.Lines.Add(LMessage); end); end; end. В Windows все работает как ожидается:
      В андроиде ситуация следующая:
      Т.е. нифига не работает.
      Тестовый проект прилагаю.
      test094 ForceQueue test.7z
    • Автор: Евгений Корепов
      Обнаружил очередной глюк Tokyo - сломали Text в Android. А именно порушили раскраску символов Юникода.
      Воспроизводится просто :
      procedure TFormMain.FormCreate(Sender: TObject); Var Text1: TText; begin Text1:=TText.Create(Self); Text1.Text:='|' + Char($2713) + '|'; Text1.Font.Size:=48; Text1.Color:=TAlphaColorRec.Red; Text1.Align:=TAlignLayout.Client; Text1.TextSettings.HorzAlign:=TTextAlign.Center; Text1.TextSettings.VertAlign:=TTextAlign.Center; FormMain.AddObject(Text1); end; На первом скриншоте этот код выполнен в Berlin, все выглядит как задуманно. На втором скриншоте этот же код в Tokyo.


    • Автор: Евгений Корепов
      Господа и товарищи, помогите тупому мне! Столкнулся с странным. Под 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
    • Автор: x11
      Добавил TTextButtonObjectAppearance. А как выполнить click/tap?
      Предполагается, что будет 2-3 кнопки с разными процедурами.
      На форме лежит TActionList и нужно к кнопками привязать действия, но у кнопки нет Action. Даже событий нет
       
      Вопрос в догонку. А в
    • Автор: Alex7wrt
      Добрый день.
      Хочу принудительно останавливать прокрутку TListView, если его сильно "крутанули". Как это можно реализовать?
      Пробовал с помощью listview1.StopPropertyAnimation('listview1.ScrollViewPos'), но не работает.
    • Автор: walexw
      Проект на Delphi, Seattle
      Добавляю в таблицу новую запись, в моем варианте она становится первой в запросе.
      Обновляю listView который ее отображает.
      Мне надо, чтобы после этого программно отработала процедура клика по этой новой записи.
      Пишу:
      listView.Selected.Index := 0;
      Далее саму процедуру, но не понимаю, что подставить в скобки:
      listViewItemClickEx(const Sender: TObject; ItemIndex: Integer; const [Ref] LocalClickPos: TPointF; const ItemObject: TListItemDrawable);
      Подскажите plz.
    • Автор: rakhmet
      Есть ли способ в FM узнать количество видимых Items у TListView?
    • Автор: rakhmet
      Заполняю в рантайме ListView:
      procedure TAddForm.ConnectClick(Sender: TObject); var LI: TListViewItem; begin with Query do begin Open; while not Eof do begin LI := ListView1.Items.Add; LI.Text := Query.FieldByName('Type').AsString; LI.Detail := Query.FieldByName('Cargo').AsString + #13#10 + Query.FieldByName('Weight').AsString; Next; end; end; end; Как видно, Detail разбивается и заполняется в две строки (оказалось, что так удобнее смотреть).
       
      Но на обеих строках сухие цифры:

       
      Поэтому хотелось бы в начало обеих строчек вставить свои иконки, чтобы в конечном итоге выглядело как-то так:

       
       
      Есть идеи, как это можно сделать? А то товарищ kramler в другой теме писал, что не видит масла стоя перед открытым холодильником - так вот я сейчас уже в таком состоянии, что начинаю забывать, где мой собственный холодильник стоит, не говоря уже о масле в нём 
      И смешно, и грустно...
  • Сейчас на странице   0 пользователей

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