Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Listview mit Firemonkey (https://www.delphipraxis.net/189101-listview-mit-firemonkey.html)

TiGü 4. Mai 2016 09:20

AW: Listview mit Firemonkey
 
Wie wäre es, wenn du extra ein TImage/TPaintbox oberhalb der Liste hättest und nur dort das Vorschaubild des aktuell selektierten/fokussierten Items anzeigst?

himitsu 4. Mai 2016 11:05

AW: Listview mit Firemonkey
 
Zitat:

Zitat von Luckie (Beitrag 1337398)
2500 Eintrage? Da scrollt man sich ja zu Tode, wenn man was sucht.

UND jeder Eintrag ist auch noch mindestens 130 Pixel hoch ... 325.000 Pixel (300 bis 600 Bildschirme lang)

Ein Grid/Liste mit Filterfunktion wäre da fast schon angebracht.

Luckie 4. Mai 2016 11:28

AW: Listview mit Firemonkey
 
Zitat:

Zitat von himitsu (Beitrag 1337449)
Zitat:

Zitat von Luckie (Beitrag 1337398)
2500 Eintrage? Da scrollt man sich ja zu Tode, wenn man was sucht.

UND jeder Eintrag ist auch noch mindestens 130 Pixel hoch ... 325.000 Pixel (300 bis 600 Bildschirme lang)

Ein Grid/Liste mit Filterfunktion wäre da fast schon angebracht.

Ich stelle mir das ganze gerade auf einem Smartphone vor. :mrgreen:

Sir Rufo 4. Mai 2016 11:57

AW: Listview mit Firemonkey
 
Grundsätzlich stellt das kein Problem dar wenn man sich so bekannte Shopping-Apps von amazon oder ebay anschaut. Bislang habe ich dort keine Probleme gehabt auch mit riesigen Trefferlisten.

(Nein, gerade eine Trefferliste mit 1250 Einträge angeschaut - kein Problem und langsam ist es auch nicht)
(Und noch eine mit >13000 Einträgen machte auch keine Probleme)

bernau 4. Mai 2016 11:59

AW: Listview mit Firemonkey
 
Zitat:

Zitat von Luckie (Beitrag 1337398)
2500 Eintrage? Da scrollt man sich ja zu Tode, wenn man was sucht.

Immer diese Fragen nach dem Sinn oder Unsinn. ( Die Kritik gilt nicht nur für dich, Luckie.)

Die Frage war ja nicht, ob es sinnvoll ist 2500 zu verwenden, sondern eine andere.

Wir kennen den Kontext nicht. Und ja, manchmal ist es einfacher in einer großen Liste mit scrollen etwas zu suchen, als vorher einen Filter einzugeben.

stahli 4. Mai 2016 12:11

AW: Listview mit Firemonkey
 
Da will ich auch mal...

Ich finde auch, dass ein Control/Framework generell performant mit großen Listen klar kommen muss.
Ob man dann (zusätzlich) Filterung, Gruppierung und Umsortierung anbietet steht auf einem anderen Blatt.
WENN man (z.B. auch nur in einem Wartungsbereich) eine reale komplette Liste einsehen will, sollte das auf jeden Fall schnell und problemlos möglich sein.

CHackbart 4. Mai 2016 20:53

AW: Listview mit Firemonkey
 
Liste der Anhänge anzeigen (Anzahl: 1)
Oh sinnvoll ist sowas schon. Bei meiner Sat>IP Anwendung habe ich im ungünstigsten Fall 3000 Einträge wenn ich Astra 19.2, 23. 28 und Hotbird 13 berücksichtige. Das wäre schon nett, wenn das performant gelistet werden könnte, zumal die Dekodierung von Mpeg2 und H264 mitunter arg an Leistung benötigt. Da ist das schon ein bisschen peinlich, wenn da die simple Liste mehr Leistung verbrät als die Videodarstellung :?

CHackbart 5. Mai 2016 10:41

AW: Listview mit Firemonkey
 
Ich habe gestern vergessen zu erwähnen, dass du bei der Treeview-Komponente von Kernowsoftware auf Mobilen Geräten im OnScrollviewChange Ereignis ClearCache(TksClearCacheType.ksClearCacheNonVisibl e); aufrufen solltest.
Ansonsten cached er dir (in der aktuellen Version zumindest) jeden Eintrag und eh du dich versiehst ist der Speicher deines Telefons bzw. Tablets voll. Die Geschwindigkeit ist jetzt auch nicht das Nonplusultra, aber es ist erträglich. Eine reine virtuelle Treeview-Komponente wäre sicherlich besser. Mal gucken ob ich damit mal beginne :)

Harry Stahl 5. Mai 2016 12:02

AW: Listview mit Firemonkey
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe meine beiden weiter oben gemachten Vorschläge mal umgesetzt und hab somit Deinen Beispielcode etwas geändert und im Painting-Event Source eingefügt, der die Bitmaps quasi "on the fly" erzeugt.

Maximal leben immer nur 60 Bitmaps zur gleichen Zeit, abhängig von der Variable Range, die Du halt bei Bedarf ändern kannst. Der Speicher wird also kaum belastet.

So wird die Liste quasi ohne Verzögerung erstellt und auch das Zeichnen erfolgt ohne Verzögerung (jedenfalls auf dem PC, wie es auf dem mobilen Teil ist, musst Du selber ausprobieren, hab hier gerade nichts im Zugriff zum Testen --> Hier wäre eine kurze Rückmeldung von Interesse).

Delphi-Quellcode:
procedure TForm19.Button1Click(Sender: TObject);
var
   i: integer;
   item: TListViewItem;
begin
   ListView1.BeginUpdate;
   for i := 0 to 4000 do
   begin
     item := ListView1.Items.Add;
     item.Text := format('channel %d', [i]);
     item.Detail := 'lorem ipsum' + sLineBreak + 'lorem ipsum';
//     item.Bitmap.SetSize(128,128);
//     item.Bitmap.Clear (TAlphaColorRec.red);
   end;
   ListView1.EndUpdate;
end;

procedure TForm19.ListView1Painting(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
var
  lvi: TListViewItem;
  L, start, stop, range, TopItem: Integer;
begin
  if Listview1.ItemCount = 0 then exit;

  range := 20;

  TopItem := Round (Listview1.ScrollViewPos / Listview1.ItemAppearance.ItemHeight);

  Start := TopItem;
  Stop := Start + range;

  for L := Start to Stop-1 do begin
    if L <= Listview1.ItemCount-1 then begin
      lvi := Listview1.Items[L];

      if lvi.Bitmap.Width = 0 then begin
         lvi.Bitmap.SetSize(128,128);
         lvi.Bitmap.Clear (TAlphaColorRec.red);
      end;
    end;
  end;

  // Bei Bedarf

  if Start > 50 then begin
    for L := Start-20 downto 0 do begin
      lvi := Listview1.Items[L];

      if lvi.Bitmap.Width <> 0 then begin
        lvi.Bitmap.SetSize(0,0);
      end;
    end;
  end;

  if Stop + 20 <= Listview1.ItemCount-1 then begin
    for L := Stop + 20 to Listview1.ItemCount-1 do begin
      lvi := Listview1.Items[L];

      if lvi.Bitmap.Width <> 0 then begin
        lvi.Bitmap.SetSize(0,0);
      end;
    end;
  end;
end;
Anliegend ein Screenshot und das Demo-Projekt (mit Delphi Seattle erstellt).

Edit: Habe doch noch ein mobiles Teil gefunden (Samsung GT-N5100) und schnell mal selbst geteset. Das funktioniert absolut flüssig, null Verzögerung, dabei ist das Gerät noch nicht mal das schnellste. Man sollte aber für Range mehr als 20 Zeilen wählen, da auf größeren Geräten diese Anzahl schnell erreicht ist. 40-60 wären da wohl besser.

Edit2: Wenn ich es mir genau überlege, könnte man die benötigte Range (also Anzahl der ListItems, die in der ListView maximal zur gleichen Zeit sichtbar sind) auch anhand der Höhe der Listview berechnen.

CHackbart 5. Mai 2016 12:40

AW: Listview mit Firemonkey
 
Hey, ich hab ja ein echtes Projekt hier - da kann ich das ganze gleich mal mit dem ksTableView gegentesten. Ich poste dann mal die Performance.

Erstaunlicherweise ist das sogar ein bisschen schneller als die Variante mit ksTableView und es lädt nicht so viele Bilder im Hintergrund.

Eventuell musst man noch testen ob TopItem < 0 ist bzw. Stop >= Items.Count.

@Harry: Das ist eventuell etwas ab vom Thema, aber hast du ne Idee wie ich mit ListView einen Eintrag via Drag&Drop verschieben kann? Die Ereignisse haben ja kein Target-Objekt, sondern nur die Position.

Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:40 Uhr.
Seite 2 von 4     12 34      

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