AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Fmx ListBox Darstellungsfehler als Tile
Thema durchsuchen
Ansicht
Themen-Optionen

Fmx ListBox Darstellungsfehler als Tile

Ein Thema von Rollo62 · begonnen am 9. Jul 2015 · letzter Beitrag vom 13. Jul 2015
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.174 Beiträge
 
Delphi 12 Athens
 
#1

Fmx ListBox Darstellungsfehler als Tile

  Alt 9. Jul 2015, 15:20
Hallo zusammen,

ich möchte unter RadXE8 Upd1 mit Firemonkey die ListBox nutzen, mit Images aus einer ImageList
in einem separatem DatenModul.

Weil das im Orginal ein viel zu kleines Bild zeigt (ala 16x16 Icon), habe ich es mit
Code:
procedure TForm1.ListBoxItem1ApplyStyleLookup(Sender: TObject);
versucht.

Ich habe auch Versuche mit Styles gemacht, aber das führt bei mir zu anderen Problemen.
Deshalb würde ich gerne einfach folgendes hinbekommen:
ImageList --> ListBox --> ItemIndex --> linksbündiges Bild in max. Höhe

Code:
function Styles_Apply_Get(obj : TListBoxItem;
                             var sTxt : TText; var sDet : TText; var sImg : TGlyph) : Boolean;
var
  fmxImg : TFmxObject;
  fmxTxt : TFmxObject;
  fmxDet: TFmxObject;

begin
  Result := False;
  sTxt  := nil;
  sDet  := nil;
  sImg  := nil;

  if not Assigned(obj) then
    Exit;

  if (obj is TListBoxItem) then
  begin

    fmxTxt := (obj as TListBoxItem).FindStyleResource('text');
    fmxDet := (obj as TListBoxItem).FindStyleResource('accessorydetail');
    fmxImg := (obj as TListBoxItem).FindStyleResource('glyphstyle');


    if Assigned(fmxImg) and (fmxImg is TGlyph) then
    begin
      sImg := fmxImg as TGlyph;

      sImg.Align  := TAlignLayout.MostLeft;
      Result := True;
    end;


  end;

end;


  if Styles_Apply_Get(Sender as TListBoxItem,
                      sTxt, sDet, sImg) then
  begin
    sImg.HitTest     := False;

    rc := sImg.BoundsRect;
    rc.Width := (Sender as TListBoxItem).Height -1;
    rc.Height := (Sender as TListBoxItem).Height -1;
    sImg.SetBounds(rc.Left, rc.Top, rc.Right, rc.Bottom );

  end;

Damit kann ich mir den 'GlyphStyle' als TGlyph holen und die Größe etwas anpassen an die ListBoxItem Höhe.
Soweit so gut.

Das Problem:
Es sieht auf den mobilen Platformen anders aus als geplant, mit Tiles statt einem ge-stretch-tem Bild.
Auf Win/Mac ist es so wie gedacht, Ios/Android nicht.
Habe schon mit Retina Scaleing, etc.herumgespielt, ich komme aber nicht drauf wie man das abstellen kann.

Im Anhang Bilder der Platformen und Sources für ein kleines Demo.

Vielleicht ist ListBoxItem1ApplyStyleLookup je der falsche Weg ?

Rollo
Angehängte Grafiken
Dateityp: jpg Clipboard01_Win.jpg (16,2 KB, 24x aufgerufen)
Dateityp: jpg Clipboard02_Mac.jpg (44,3 KB, 22x aufgerufen)
Dateityp: jpg Clipboard03_Ios.jpg (29,4 KB, 16x aufgerufen)
Dateityp: jpg Clipboard04_And.jpg (26,1 KB, 17x aufgerufen)
Angehängte Dateien
Dateityp: zip T11_ListBox.zip (4,47 MB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Rollo62

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

AW: Fmx ListBox Darstellungsfehler als Tile

  Alt 9. Jul 2015, 15:39
noch ein Hinweis:

Es liegt wohl nicht an den ListBoxItems an sich.
Denn wenn ich über die Items jeweils TGLyphs lege passiert dasgleiche.

Clipboard05.jpg

Es scheint also ein Problem des TGLyphs zu sein, das ein Image als Tile darstellt.

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.560 Beiträge
 
Delphi 12 Athens
 
#3

AW: Fmx ListBox Darstellungsfehler als Tile

  Alt 10. Jul 2015, 00:08
Sieht so aus, als ob bei der TGlyph-Komponente unter IOS bzw. Android alle Bitmaps, die kleiner als der anzuzeigende Bereich sind mit Wrapmode Tile gezeichnet werden.

Du kannst die Sache umgehen, indem Du ausreichend große Bitmaps in Deine Imagelist aufnimmst, z.B. 128x128 Bildpunkte (siehe damit Dein Programm auf IOS in der Anlage), damit die dann in den anzuzeigenden Bereich eingepasst werden.
Angehängte Grafiken
Dateityp: png ios.png (185,3 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
Rollo62

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

AW: Fmx ListBox Darstellungsfehler als Tile

  Alt 11. Jul 2015, 08:40
Hallo Harry,

dankesehr für den entscheidenden Tip, manchmal sieht man den Wald vor Bäumen nicht
Das muss ich in deinem XE7-Buch wohl überlesen haben, da sind auf jeden Fall jede Menge gute Tips für VCL-FMX Umsteiger wie mich drin.
Ich freue mich schon auf die nächste Ausgabe.

Eigentlich bin davon ausgegangen das die Bilder schon gross genug wären.
Also werden die Bilder wahrscheinlich intern noch mit dem Retina ScreenScale Faktor verkleinert ?

Das sollte dann auch direkt mit der ImageList ohne Verrenkungen funktionieren ?
Das werde ich gleich mal ausprobieren, wäre ja dann endlich das was ich eigentlich möchte.

Welche Empfehlung gibt es es denn wohl für eine Mindestgröße damit es aus allen Plattformen korrekt aussieht ?
Der ScreenScale Faktor kann ja im Moment bis zu 3 sein.

Ergebnis:
Nach dem Test bekomme ich das leider immer noch nicht so hin wie in deinem Anhang:

Ich habe die Größe in der ImageList schrittweise auf 512x1512 erhöht.
Clipboard07.jpg
Ich war mir aber gar nicht sicher ob diese Stelle überhaupt immer für die Bildgröße verantwortlich ist, oder ob das nur für das Speichern
benutzt wird (darauf hat es jedenfalls Einfluss).

Danach wird der Screenshot im 1sten ListItem dasImage immer noch als Tile gezeichnet (auf z.B. IOS Simulator).
Aber jedenfalls ist das Image jetzt schonmal größer, ohne die ganzen OnApplyLookup Verrenkungen.
Clipboard06.jpg

Das 2. ImageListItem habe ich mit Width Height noch vergrößert, aber das vergrößert nur das Ganze Glyph, und das Image bleibt
fitted im ListBoxItem, so wie gedacht.

Im 3. habe ich mal an den Margins rumgespielt (so würde ich das normalerweise nicht machen), es tut aber auch nicht so wie erwartet.

Code:
    if (Sender as TListBoxItem).Index = 1 then
    begin
      sImg.Width := 128;
      sImg.Height := 128;
    end;

    if (Sender as TListBoxItem).Index = 2 then
    begin
      sImg.Margins.Left  := -20;
      sImg.Margins.Right := 20;
      sImg.Margins.Top   := -20;
      sImg.Margins.Bottom := 20;
    end;
Die Tiles sind aber in keinem Fall weg, was könnte hier noch anders ein ?
Wie gesagt, die Tiles sehe ich nur unter iOS, iOS Simulator und Android.
Wie hast du das wegbekommen ?


Rollo

Geändert von Rollo62 (11. Jul 2015 um 08:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.560 Beiträge
 
Delphi 12 Athens
 
#5

AW: Fmx ListBox Darstellungsfehler als Tile

  Alt 11. Jul 2015, 09:34
Hallo Harry,

dankesehr für den entscheidenden Tip, manchmal sieht man den Wald vor Bäumen nicht
Das muss ich in deinem XE7-Buch wohl überlesen haben, da sind auf jeden Fall jede Menge gute Tips für VCL-FMX Umsteiger wie mich drin.
Freut mich, wenn mein Buch Dir eine Hilfe war / ist.

TGlyph gibt es erst seit XE8, daher konntest Du im XE7-Buch dazu nichts finden, im Buch zu XE8 wird es aber enthalten sein.

Welche Empfehlung gibt es es denn wohl für eine Mindestgröße damit es aus allen Plattformen korrekt aussieht ?
Der ScreenScale Faktor kann ja im Moment bis zu 3 sein.
Ich würde den maximal vorgesehenen Anzeigebereich des TGlyphs in Pixeln mal 2 nehmen, das sollte momentan eigentlich reichen. Wobei ich mir aber im Moment nicht sicher bin, ob das derzeitige Anzeigeverhalten ein Fehler ist.

Ergebnis:
Nach dem Test bekomme ich das leider immer noch nicht so hin wie in deinem Anhang:

Ich habe die Größe in der ImageList schrittweise auf 512x1512 erhöht.
Es reicht nicht, die Einstellungen der Pixel-Größe im Dialog zu verändern. Man muss dort Bilder mit der tatsächlichen Pixelgröße reinladen. Ich hatte Deine Imagelist ganz gelöscht und dann 3 neue Bilder mit physischer Größe von jeweils 128x128 reingeladen, dann geht's.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Fmx ListBox Darstellungsfehler als Tile

  Alt 11. Jul 2015, 10:23
Projekt und Bilder im Anhang.

Je nach Skalierungsfaktor zwischen der logischen und physikalischen Auflösung wird in dem Bild ein "1", "1,5", "2" oder "3" stehen.

Einfach mal ausprobieren
Angehängte Dateien
Dateityp: zip dp_185830.zip (34,7 KB, 12x aufgerufen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz