Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

Harry Stahl 5. Mai 2016 14:35

AW: Listview mit Firemonkey
 
Zitat:

Zitat von CHackbart (Beitrag 1337542)
@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

CHackbart 5. Mai 2016 18:30

AW: Listview mit Firemonkey
 
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

Harry Stahl 5. Mai 2016 20:31

AW: Listview mit Firemonkey
 
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;

CHackbart 5. Mai 2016 20:59

AW: Listview mit Firemonkey
 
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

CHackbart 6. Mai 2016 14:24

AW: Listview mit Firemonkey
 
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.

Rollo62 9. Mai 2016 20:20

AW: Listview mit Firemonkey
 
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

Sherlock 10. Mai 2016 06:46

AW: Listview mit Firemonkey
 
Kleine Zwischenfrage zu Deinen Gedanken, Rollo: Warum glaubst Du, daß Bilder aus Dateien zu laden weniger Performant sein soll als sie aus einer SQLite DB zu ziehen? Du weisst, daß SQLite dateibasiert ist? Nur mal so als Denkanstoß ;)

Sherlock

Rollo62 10. Mai 2016 07:02

AW: Listview mit Firemonkey
 
Hallo Sherlok,

ja, richtig.

Ich glaube aber einfach das Datenbanken solche Prozesse super-optimiert haben (Wunschdenken).
Es geht ja um kleinere Thumbnails, größere Bilder würde ich auch immer über Linik nachladen.

Aber wenn man auf MobileDevices eine ListView mit kleinen Vorschaubildern machen möchte wäre doch
eine einfache Datenbank dafür elegant.

Jedenfalls ist mir noch nicht klar was hier generell der Beste Weg ist.

Rollo

Peter666 1. Jun 2016 11:42

AW: Listview mit Firemonkey
 
ich steh gerade ein bisschen auf dem Schlauch, aber gibt es eine Möglichkeit diverse TListViewItems zu verstecken? Sowas wie eine Visible Eigenschaft, als listview.items[1].visible := false ist ja nicht implementiert.

Sherlock 1. Jun 2016 12:00

AW: Listview mit Firemonkey
 
Zitat:

Zitat von Peter666 (Beitrag 1339260)
ich steh gerade ein bisschen auf dem Schlauch, aber gibt es eine Möglichkeit diverse TListViewItems zu verstecken? Sowas wie eine Visible Eigenschaft, als listview.items[1].visible := false ist ja nicht implementiert.

Außer neu aufbauen, und die betreffenden Items nicht mitzuerzeugen ist mir nichts bekannt. Sorry... FMX ist gegenüber VCL leider in sehr vielen Dingen noch furchtbar weit zurück. Mir fällt da als abschreckendes Beispiel noch das TDateEdit ein...Grauslig.

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:25 Uhr.
Seite 3 von 4     123 4      

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