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
265 Beiträge
 
#1

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.479 Beiträge
 
Delphi 11 Alexandria
 
#2

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
265 Beiträge
 
#3

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.479 Beiträge
 
Delphi 11 Alexandria
 
#4

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
CHackbart

Registriert seit: 22. Okt 2012
265 Beiträge
 
#5

AW: Listview mit Firemonkey

  Alt 5. Mai 2016, 20:59
Ah Danke, ja so hab ich das auch in der Art gemacht. Es widerstrebt mir aber das als "saubere" Lösung zu akzeptieren

Kann ich eigentlich das Bild für den Drag-Effekt weniger verwaschen darstellen?

Delphi-Quellcode:
procedure TfrmSettingsSort.lvStationsMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Single);
var
  r: TRectF;
  bmp: TBitmap;
begin
  if (ssLeft in Shift) and (lvStations.Selected <> NIL) then
  begin
    r := lvStations.GetItemRect(lvStations.ItemIndex);

    bmp := TBitmap.Create(round(lvStations.Width), round(lvStations.Height));
    try
      bmp.Canvas.BeginScene;
      lvStations.PaintTo(bmp.Canvas, RectF(0, 0, bmp.Width, bmp.Height));
      bmp.Canvas.EndScene;

      FDragBitmap.SetSize(round(r.Width), round(r.Height));
      FDragBitmap.Canvas.BeginScene;

      FDragBitmap.Canvas.DrawBitmap(bmp, r, RectF(0, 0, FDragBitmap.Width,
        FDragBitmap.Height), 1);
      FDragBitmap.Canvas.EndScene;
    finally
      bmp.Free;
    end;
    BeginInternalDrag(lvStations.Selected, FDragBitmap);
  end;
end;
Christian

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

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

AW: Listview mit Firemonkey

  Alt 6. Mai 2016, 14:24
Falls sich jemand wundert, warum Drag&Drop nicht auf Mobilgeräten geht. Hier ist ein Workaround: http://lookinside.free.fr/delphi.php?FMXBasedDragDrop

Im Prinzip muss man eine eigene Klasse für IFMXDragDropService hinzufügen.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.932 Beiträge
 
Delphi 12 Athens
 
#7

AW: Listview mit Firemonkey

  Alt 9. Mai 2016, 20:20
Wenn man wirklich 2500+ Bitmaps laden will dann sollte man die vielleicht nicht alle im Speicher halten.
Mit dem Ansatz von Harry könnte man ein Fenster in den Daten laden, und die Bitmaps entsprechend nachladen.

Weil ich mit diversen LowMemory Applikation Events zu kämpfen hatte (habe) frage ich mich ständig:
Wie speichere ich am Besten meine Bilder (Thumbnails) auf den Mobile Devices ?

- Nachladen von File ist nicht so besonders performat
- Gespeichert in Sqlite Datenbank, aber legt Sqlite das doch wieder voll im Speicher an ?
- Irgendeine andere Datenbank-Lösung, statt Sqlite ?
FdMemoryTable liegt wohl auch komplett im Speicher, oder nicht ?
- Benutzen eines OnCalculateFields Events, um die Bitmaps dynamisch zu generieren ?
- Speichern in einer eigens dafür erstellten Klasse ?

Die perfekte Antwort dafür suche ich noch, es scheint alles Vor- und Nachteile zu haben.

Rollo
  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 04:39 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