AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung FMX - ListView - ItemAppearance - Runtime

FMX - ListView - ItemAppearance - Runtime

Ein Thema von sintronic86 · begonnen am 6. Feb 2019 · letzter Beitrag vom 17. Feb 2021
Antwort Antwort
sintronic86

Registriert seit: 7. Dez 2009
Ort: Barsinghausen
90 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

FMX - ListView - ItemAppearance - Runtime

  Alt 6. Feb 2019, 10:53
Hallo Community,

nach langer Zeit, stehe ich mal wieder vor einem Problem, das ich einfach nicht gelöst bekomme.

Ich bin dabei, eine App für Android zu entwickeln. Dort liegt auf der Mainform ein TListView, dessen ItemAppearance auf "DynamicAppearance" steht. Ich habe einige TListItemText unter "Item" reingepackt und ausgerichtet.
Da diese Elemente nicht nach dem "normalen" Prinzip von TAlignLayout.Client etc. arbeiten (bitte berichtigt mich, wenn ich falsch liege), möchte ich die Ausrichtung und Maße dieser Elemente beim ändern der Orientation anpassen.
Dieses habe ich über das ResiceEvent des ListViews als auch über TMessageManager.DefaultManager.SubscribeToMessage(TOrientationChangedMessage, OnOrientationChanged); ausprobiert.

Drehe ich also das Gerät in die Landscape-Ansicht, sollen die TListItemText breiter werden. Leider passiert dort nichts. Führe ich die Änderungs-Procedure allerdings manuell via ButtonClick aus, werden die Änderungen übernommen.

Ich weiß leider überhaupt nicht, woran das liegen kann.

Hier mal die angesprochene Procedure:
Delphi-Quellcode:
var
  LLIT: TListItemText;
  LLVI: TListViewItem;
  LSS : IFMXScreenService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(LSS)) then begin
    if LSS.GetScreenOrientation in [TScreenOrientation.soPortrait, TScreenOrientation.soInvertedPortrait] then begin
      Toast('Portrait');


      for LLVI in lvInventar.Items do begin
        LLIT := TListItemText(LLVI.Objects.FindDrawable('User'));
        LLIT.Width := 150;

        LLIT := TListItemText(LLVI.Objects.FindDrawable('Typ'));
        LLIT.PlaceOffset.X := 250;
        LLIT.Width := 143;
      end;
    end
    else begin
      Toast('Landscape');

      for LLVI in lvInventar.Items do begin
        LLIT := TListItemText(LLVI.Objects.FindDrawable('User'));
        LLIT.Width := 300;

        LLIT := TListItemText(LLVI.Objects.FindDrawable('Typ'));
        LLIT.PlaceOffset.X := 400;
        LLIT.Width := 428;
      end;
    end;
  end;
Hat jemand von euch eine Idee dazu?
Ich bedanke mich schon einmal im Voraus!


PS:
Umgebung: RAD Studio 10.1 Berlin
Testgerät: Samsung Galaxy S8 Plus (kein Emulator)
Björn
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#2

AW: FMX - ListView - ItemAppearance - Runtime

  Alt 6. Feb 2019, 12:19
Delphi-Quellcode:
        LLIT.PlaceOffset.X := 250;
        LLIT.Width := 143;
Also das Verschieben s.o. funktioniert bei mir.
Bist du sicher das es überhaupt in diese Funktion reinspringt ?

Wenn das "OnResize" ist, damit hatte ich auch mal Probleme im Anfang.
Kann sein das es jetzt wieder läuft in Rio, aber seitdem benutze ich für
Portrait/Landscape nur noch die ApplicationEvents statt OnResize.
  Mit Zitat antworten Zitat
sintronic86

Registriert seit: 7. Dez 2009
Ort: Barsinghausen
90 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: FMX - ListView - ItemAppearance - Runtime

  Alt 6. Feb 2019, 12:37
Hey Rollo, danke für die schnelle Antwort.

Ich habe es wie folgt eingebunden:

Delphi-Quellcode:
TfMain = class(TForm)
    ...
  private
    FOrientationChangedId: Integer;
    procedure OnOrientationChanged(const Sender: TObject; const Msg: TMessage);
end;




procedure TfMain.FormCreate(Sender: TObject);
begin
  FOrientationChangedId := TMessageManager.DefaultManager.SubscribeToMessage(TOrientationChangedMessage, OnOrientationChanged);
end;

procedure TfMain.OnOrientationChanged(const Sender: TObject; const Msg: TMessage);
var
  LLIT: TListItemText;
  LLVI: TListViewItem;
  LSS : IFMXScreenService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(LSS)) then begin
    if LSS.GetScreenOrientation in [TScreenOrientation.soPortrait, TScreenOrientation.soInvertedPortrait] then begin
      Toast('Portrait');


      for LLVI in lvInventar.Items do begin
        LLIT := TListItemText(LLVI.Objects.FindDrawable('User'));
        LLIT.Width := 150;

        LLIT := TListItemText(LLVI.Objects.FindDrawable('Typ'));
        LLIT.PlaceOffset.X := 250;
        LLIT.Width := 143;
      end;
    end
    else begin
      Toast('Landscape');

      for LLVI in lvInventar.Items do begin
        LLIT := TListItemText(LLVI.Objects.FindDrawable('User'));
        LLIT.Width := 300;

        LLIT := TListItemText(LLVI.Objects.FindDrawable('Typ'));
        LLIT.PlaceOffset.X := 400;
        LLIT.Width := 428;
      end;
    end;
end;
Der Event wird beim drehen des Displays auch getriggert (habe ich mir via Toast ausgeben lassen). Aber die TListItemText ändern sich leider nicht.


Allerdings habe ich just in diesem Moment eine Lösung gefunden. Allerdings weiß ich nicht, warum das jetzt funktioniert:

Ich befülle die ListView bei jedem Triggern neu, und erstelle die TListViewText per Code mit den entsprechenden Werten. Das funktioniert nun super und (überraschenderweise) auch schnell!
Verstehen tu ich es allerdings überhaupt nicht!
Björn
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#4

AW: FMX - ListView - ItemAppearance - Runtime

  Alt 6. Feb 2019, 13:48
Du kannst ja auch Debuggen, dann siehst du wo genau er hinkommt und wo nicht.
Den Toast würde ich mir sparen.

Leg duch einfach mal zum Test zwei Buttons mit auf die Form,
welche das Verschieben Portrait und Landscape simulieren (ohne Application-Events).
Damit kann ich hier die Texte anpassen.

Bin mir jetzt nicht sicher ob die Application-Events im Thread laufen.
Du kannst ja mal um die Funktionen die deine Texte anfassen
ein TThread.Synchronize legen, zum Testen.

Delphi-Quellcode:
TThread.Synchronize(
   nil,
   procedure
   begin
      // Nur hier die Listview anfassen
   end
);
  Mit Zitat antworten Zitat
sintronic86

Registriert seit: 7. Dez 2009
Ort: Barsinghausen
90 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: FMX - ListView - ItemAppearance - Runtime

  Alt 7. Feb 2019, 16:25
Ich mache das über den Toast, weil ich Android 8.0.0 verwende, auf der (zumindest laut Google) nicht debugt werden kann.

Das Anpassen der Texte funktioniert bei mir auch super, aber nicht das Ändern von Width/Height/PlaceOffset.

Aber wie gesagt, funktioniert es mit dem Neuerstellen beim Wechsel der Orientation sehr gut.
Björn
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: FMX - ListView - ItemAppearance - Runtime

  Alt 7. Feb 2019, 17:29
Schon mal probiert, vor der Änderung der ListviewItems ein Beginupdate und danach Endupdate (also bei der Listview selber, lvInventar) zu setzen?

Mal abgesehen davon, ob das hier hilft, wäre es aus Performance-Gründen jedenfalls immer bei solchen Zugriffen geboten.
  Mit Zitat antworten Zitat
michaelg

Registriert seit: 20. Apr 2008
87 Beiträge
 
#7

AW: FMX - ListView - ItemAppearance - Runtime

  Alt 17. Feb 2021, 14:59
Moin,

stand gerade einem sehr ähnlichen Problem. Ich hatte ein Listview mit DynamicAppearance designed und wollte, dass die Spaltenbreiten sich vergrößern, wenn man im Querformat ist.

Bei ItemDetailAppearance braucht man nur:
Code:
  lv.ItemAppearanceObjects.ItemObjects.Text.PlaceOffset.X:=0;
  lv.ItemAppearanceObjects.ItemObjects.Text.Width:=lv.Width-2;

  lv.ItemAppearanceObjects.ItemObjects.Detail.PlaceOffset.X:=(lv.Width / 2);
  lv.ItemAppearanceObjects.ItemObjects.Detail.Width:=(lv.Width /2)-2;
Bei DynamicAppearance muss man das Objekt raussuchen und es verändern:
Code:
procedure TfMain.lvPosResized(Sender: TObject);
var
  ta:tTextObjectAppearance;

  function FindIt(aName:String):tTextObjectAppearance;
    var
      ca:TCommonObjectAppearance;
    begin
      result:=nil;
      with lvPos do begin
        for ca in ItemAppearanceObjects.ItemObjects.Objects do begin
          if comparetext(ca.Name,aName)=0 then begin
            result:=ca as tTextObjectAppearance;
            exit;
          end;
        end;
      end;
    end;

begin
  with lvPos do begin
    ta:=FindIt('Text');
    if ta<>nil then begin
      ta.Width:=Width-80;
    end;

    ta:=FindIt('Detail');
    if ta<>nil then begin
      ta.Width:=Width-80;
    end;
  end;
Ich sehe gerade, der Eintrag ist uralt, aber was solls. Hab ich auch mal ne Lösung beigesteuert
  Mit Zitat antworten Zitat
Poelser

Registriert seit: 21. Apr 2008
Ort: Europa
145 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: FMX - ListView - ItemAppearance - Runtime

  Alt 17. Feb 2021, 15:10
Ich sehe gerade, der Eintrag ist uralt, aber was solls. Hab ich auch mal ne Lösung beigesteuert
Von Februar 2019? Das ist doch noch nicht alt! Da haben einige schon Knochen ausgegraben...
--
LG aus dem hohen Norden, Edmund
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz