Einzelnen Beitrag anzeigen

knaeuel

Registriert seit: 2. Jul 2007
82 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: super-buggy MultiView-Komponente - Tipps? Workarounds?

  Alt 10. Okt 2018, 11:22
ich hab das kleine Beispielprogramm nochmal überarbeitet. es passt sich nun automatisch an die bildschirmbreite an. getestet auf windows, android und ios

es war etwas unangenehm, das hinzubekommen. ich musste tatsächlich die animationen in den frame verlegen, weil ich ansonsten unter android und ios keinen zufgriff auf die eigenschaften der im Stylebook liegenden Animationen erlangt habe.
Unter Windows hats ohne Probleme funktioniert (FindSytelRe, auf iOS und Android gabs erstmal nur auf Umwegen überhaupt zugriff und der wurde dann auch noch ignoriert. Für mein Gefühl ist das ein Bug im Stylebook. Ich habe versucht, zu ergründen, woran es scheitert, aber der debugger/die ide ist dabei mehrfach abgestürzt, dann hatte ich irgendwann keine Lust mehr...

unter Windows, nicht aber unter iOS und Android funktionierte dieser Zugriff auf die Objekte im Stylebook:
Delphi-Quellcode:
var flani:TFloatAnimation;

  flani:=StyleBook1.Style.FindStyleResource('OnShowSlideInLeft', False) as TFloatAnimation;
  if Assigned(flani) then
    flani.StartValue:=-(LayoutForMVFrameLeft.Width+5);

  flani:=StyleBook1.Style.FindStyleResource('OnHideSlideOutLeft', False) as TFloatAnimation;
  if Assigned(flani) then
    flani.StopValue:=-(LayoutForMVFrameLeft.Width+5);
FindStyleResource lieferte unter iOS und Android nur für ganz wenige komponenten aus dem Stylebook einen Wert zurück, meistens aber nil. Die Elemente, die zu finden waren, lagen hierarchisch betrachtet eher oben, aber eine logik habe ich nicht entdeckt.

Das hier war der Ersatz für Android und iOS:

Delphi-Quellcode:
var flani:TFloatAnimation;
    rctngl:TRectangle;
    layout:TLayout;
    i,j:integer;


  //Workaround iOS/Android FindStyleResource: es werden nur weit oben stehende Komponenten sicher gefunden
  layout:=StyleBook1.Style.FindStyleResource('LikeMultiViewLeft', false) as TLayout;
  if Assigned(layout) then
  begin
    for i:=0 to layout.ChildrenCount-1 do
    begin
      if (layout.Children[i] is TRectangle) then
      begin
        if (layout.Children[i] as TRectangle).StyleName='RectangleContentBackgroundLeftthen
        begin
          rctngl:=(layout.Children[i] as TRectangle);
          for j:=0 to rctngl.ChildrenCount-1 do
          begin
            if (rctngl.Children[j] is TFloatAnimation) then
            begin
              if (rctngl.Children[j] as TFloatAnimation).StyleName='OnShowSlideInLeftthen
              begin
                (rctngl.Children[j] as TFloatAnimation).StartValue:=-(LayoutForMVFrameLeft.Width+5);
              end;
              if (rctngl.Children[j] as TFloatAnimation).StyleName='OnHideSlideOutLeftthen
                (rctngl.Children[j] as TFloatAnimation).StopValue:=-(LayoutForMVFrameLeft.Width+5);
            end;
          end;
        end;
      end;
    end;
  end;
aber leider brachte auch das keinen Erfolg. Zwar wurden die Werte tatsächlich überschrieben, aber die Animationen liefen weiterhin so ab, als wären noch die Originalwerte gesetzt. Das war schon verrückt...

wie gesagt, ob es an der TFramstand-Komponente oder an Delphi liegt, habe ich nicht erforscht.

Und weil das so verrückt war, fand ich es sinnig, die funktionierende Version hier nochmal zu posten
Angehängte Dateien
Dateityp: zip MultiViewErsatz.zip (777,7 KB, 6x aufgerufen)
Wolfgang

Geändert von knaeuel (10. Okt 2018 um 13:18 Uhr)
  Mit Zitat antworten Zitat