2
votes

I've created an app in Delphi 10.1 Berlin using Windows as the Master View. I dropped a TListView on the form and customized it using the new Toggle Design Mode. I added a TImageObjectAppearance and several TTextObjectAppearance items. I added code to set the image for the TImageObjectAppearance and the text items have various font sizes and style. I also have 3 TImage components on the form that I use to assign to the TImageObjectAppearance.Bitmap based on a value.

When I compile it for Win32 and run it eveything looks great. The bitmap images display based on the value on each row of the TListView. When I switch the Style to Android and the View to Android 10" Tablet the IDE throws this error:

"Cannot assign a TAppearanceObjectItem to a TAppearanceObjectItem."

The View still says Android 10" Tablet but the actual view on the form is still a Windows form. So my first question is what the heck is that error all about? I thought Delphi was supposed to be able to compile to all these different targets/devices using the same code. That's certainly not happening. But wait, there's more...

So I switched back to Style: Windows and View: Master. I clicked on the TImageObjectAppearance item on the form and pressed the Delete key and I got this error:

"Cannot delete a persistent reference from the designer."

But if you click on the item in the Structure window and press Delete it deletes just fine. Bug? I would say so. Anyway, there's more.I deleted the TImageObjectAppearance item from the Structure window and then switched back to Style: Android and View: Android 10" Tablet and guess what...I get the same error. But there is not TImageObjectAppearance on the form! So I completely delete the TListView custom items in Windows | Master view and start fresh using Android 10" Tablet view. I add all the custom appearance objects, including the TImageObjectAppearnce.But when I compile it for a 10" Android tablet and run it on my Galaxy Tab S2, 1) No images appear.Here's the code I wrote to set the images. (There are 3 TImage components on the form that I use for the TImageObjectAppearance items.) This code works just fine when compiling for Win32.

function TdmVisual.AddOrUpdateItem(AItem: TListViewItem; AMGDL: Integer): TListViewItem;
var
  LObject: TListItemImage;

begin
  Result         := AItem;
  LObject        := Result.Objects.FindObjectT<TListItemImage>('imgRating');
  LObject.Bitmap := TBitmap.Create;

  if AMGDL < 70 then
    LObject.Bitmap.Assign(fmMain.iLow.Bitmap)
  else if (AMGDL >= 70) and (AMGDL <= 130) then
    LObject.Bitmap.Assign(fmMain.iGreen.Bitmap)
  else if (AMGDL > 130) and (AMGDL <= 180) then
    LObject.Bitmap.Assign(fmMain.iYellow.Bitmap)
  else
    LObject.Bitmap.Assign(fmMain.iRed.Bitmap);
end;

My second (3rd or 4th) question is why does the above code not work when compiling for Android and what's the proper way to assign images to a TImageObjectAppearance in code?

Thanks -Barry

1
Where is your AddOrUpdateItem function called from? Also, it doesn't seem right that you are returning from a function a value that was passed as a param. Why not just use a var parameter?nolaspeaker
Let's just ignore the method as its written and focus on the real question: What's the proper way to assign images to a TImageObjectAppearance in code? And the project target is Android. The code within the procedure works when the target is Win32 but not Android.BDirks

1 Answers

0
votes

this is a bug

""Cannot assign a TAppearanceObjectItem to a TAppearanceObjectItem" has been logged as a bug in our quality portal:"

https://community.embarcadero.com/forum/ui/1953-fmx-tlistview-switching-between-windows-android