AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Listview mit Firemonkey

Ein Thema von Peter666 · begonnen am 3. Mai 2016 · letzter Beitrag vom 1. Jun 2016
Antwort Antwort
CHackbart

Registriert seit: 22. Okt 2012
267 Beiträge
 
#1

AW: Listview mit Firemonkey

  Alt 4. Mai 2016, 20:53
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
Angehängte Grafiken
Dateityp: jpg image.jpg (129,0 KB, 31x aufgerufen)

Geändert von CHackbart ( 4. Mai 2016 um 21:08 Uhr)
  Mit Zitat antworten Zitat
CHackbart

Registriert seit: 22. Okt 2012
267 Beiträge
 
#2

AW: Listview mit Firemonkey

  Alt 5. Mai 2016, 10:41
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
  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: Listview mit Firemonkey

  Alt 5. Mai 2016, 12:02
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.
Angehängte Grafiken
Dateityp: jpg OnTheFly.jpg (34,7 KB, 30x aufgerufen)
Angehängte Dateien
Dateityp: zip ManyImages.zip (53,9 KB, 15x aufgerufen)

Geändert von Harry Stahl ( 5. Mai 2016 um 12:32 Uhr)
  Mit Zitat antworten Zitat
CHackbart

Registriert seit: 22. Okt 2012
267 Beiträge
 
#4

AW: Listview mit Firemonkey

  Alt 5. Mai 2016, 12:40
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

Geändert von CHackbart ( 5. Mai 2016 um 13:37 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: Listview mit Firemonkey

  Alt 5. Mai 2016, 14:35
@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
Ja, hatte hier schon mal eine Frage beantwortet. Ging zwar um Drag & Drop von Items zwischen zwei Listviews, ist aber alles dabei, was Du brauchst:

http://www.delphipraxis.net/187248-d...-listview.html
  Mit Zitat antworten Zitat
CHackbart

Registriert seit: 22. Okt 2012
267 Beiträge
 
#6

AW: Listview mit Firemonkey

  Alt 5. Mai 2016, 18:30
Hmm, danke - ich dachte das geht etwas leichter aber es sind ja FMXObjekte, deswegen wohl eher nicht.

Wie verschiebe ich eigentlich in der Liste einen Eintrag, ohne die Liste neu zu erstellen?

Christian
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

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

AW: Listview mit Firemonkey

  Alt 5. Mai 2016, 20:31
Also, mir ist da kein spezieller Befehl zum Verschieben bekannt (Listview.exchange funktioniert nicht mit ListviewItems).

Du musst es also selber erledigen:

Delphi-Quellcode:
procedure TForm19.ListView1DragDrop(Sender: TObject; const Data: TDragObject;
  const Point: TPointF);
var
  obj: IControl;
  idx, add: Integer;
  lvi: TListviewItem;
  f: TFMXObject;
begin
 obj := ObjectAtPoint (Screen.MousePos);

 if obj <> NIL then begin
   Idx := GetIndexATPos (ListView1, Point);

   if Idx <> -1 then begin
     // verschieben vor oder nach aktueller Selektion
     if TListViewItem (Data.Source).Index > Idx then begin
       add := 1;
     end else begin
       add := 0;
       inc (idx);
     end;

     ListView1.BeginUpdate;
     lvi := Listview1.Items.AddItem(idx);
     lvi.Text := TListViewItem (Data.Source).Text;
     lvi.Detail := TListViewItem (Data.Source).Detail;
     lvi.bitmap.Assign(TListViewItem (Data.Source).bitmap);
     Listview1.Items.Delete (TListViewItem (Data.Source).Index+add);
     ListView1.EndUpdate;
     Listview1.Selected := lvi;
   end;
 end;
end;
  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 07:36 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