Delphi-PRAXiS

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/)
-   -   Delphi Problem beim Umsortieren v. ListView-Items in vsIcon-Ansicht (https://www.delphipraxis.net/114048-problem-beim-umsortieren-v-listview-items-vsicon-ansicht.html)

PeterPanino 19. Mai 2008 01:14


Problem beim Umsortieren v. ListView-Items in vsIcon-Ansicht
 
Hallo, wer weiß hier einen Rat? Ich haben eine ListView (SortType = stNone), die z.B. 8 Items in der vsIcon-Ansicht anzeigt. Wenn ich nun z.B. Item2 per Drag&Drop nach Position 5 verschiebe (Routine s. unten), so wird dieses Item immer am Ende der Items eingefügt (anstatt an Position 5)! Wenn ich danach aber in die vsReport-Ansicht wechsle, befindet sich das verschobene Item doch an der richtigen Stelle (an Position 5). Wieder zurück in der vsIcon-Ansicht ist das verschobene Item wieder an letzter Stelle!

Wie kann man nun in der vsIcon-Ansicht die gleiche Reihenfolge der Items wie in der vsReport-Ansicht herstellen, d.h. dass sich das verschobene Item an der richtigen Position 5 befindet?

Hier ist der Code für das Drag&Drop innerhalb der ListView:

Delphi-Quellcode:
procedure TMainForm.ListViewDragDrop(Sender, Source: TObject; X, Y: Integer);
var
  currentItem, nextItem, dragItem, dropItem: TListItem;
begin
  if Sender = Source then
  begin
    with TListView(Sender) do
    begin
      dropItem := GetItemAt(X, Y);
      currentItem := Selected;
      while currentItem <> nil do
      begin
        nextItem := GetNextItem(currentItem, TSearchDirection(sdAll), [IsSelected]);
        if Assigned(dropItem) then
          dragItem := Items.Insert(dropItem.Index)
        else
          dragItem := Items.Add;
        dragItem.Assign(currentItem);
        currentItem.Free;
        currentItem := nextItem;
      end;
    end;
  end;
end;

procedure TMainForm.ListViewDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  Accept := Sender = ListView;
end;
ListView.DragMode ist natürlich dmAutomatic.

Ich habe die ListViewDragDrop-Routine im Debugger genau verfolgt: Das verschobene Item wird in der vsIcon-Ansicht tatsächlich an Position 5 eingefügt, aber als letztes Item angezeigt!

toms 19. Mai 2008 05:23

Re: Problem beim Umsortieren v. ListView-Items in vsIcon-Ans
 
Hallo, ist Autoarrange auf True gesetzt?

Dann sollte mein vereinfacher Code funktionieren:

Delphi-Quellcode:
procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  SelItem: TListItem;
begin
  if Sender = Source then
  begin
   SelItem := TListView(Sender).Selected;
   If assigned(SelItem) then
     TListView(Source).Selected.SetPosition(Point(X,Y));
  end;
end;

PeterPanino 19. Mai 2008 11:11

Re: Problem beim Umsortieren v. ListView-Items in vsIcon-Ans
 
Vielen Dank, diese Methode funktioniert wirklich! Jetzt muss ich nur noch den Code so umschreiben, dass dammit auch das Verschieben von mehreren Items auf einmal funktioniert. (Das war ja auch der Grund, weshalb ich den obigen Code verwendet habe). Schönen Tag noch!

PeterPanino 19. Mai 2008 12:04

Re: Problem beim Umsortieren v. ListView-Items in vsIcon-Ans
 
Fehlanzeige! Das Codebeispiel von toms verschiebt das Item zwar visuell, die tatsächliche interne Reihenfolge wird jedoch nicht verändert! Folgender Code, mit dem ich die Reihenfolge der Items NACH dem Verschieben eines Items abfrage, beweist dies:

Delphi-Quellcode:
for i := 0 to ListView.Items.Count - 1 do
  s := s + ListView.Items[i].Caption + #13#10;
Clipboard.AsText := s;

e-gon 27. Aug 2015 12:36

AW: Problem beim Umsortieren v. ListView-Items in vsIcon-Ansicht
 
Hallo zusammen,

sorry, dass ich das alte Thema nochmals aufwärme, aber genau das Problem fällt mir nun auch auf die Füße:
Per Drag&Drop kann man im vsIcon-Modus sehr bequem die Icons visuel verschieben, doch die internen Reihenfolge ändert sich nicht! Verschiebe ich beispielsweise das 5. Icon auf die erste Position ist der Index des Items immer noch 4 und nicht 0. Und die Eigenschaft Index ist auch noch schreibgeschützt!

Kann mir jemand sagen wie man nach dem Verschieben den aktuellen Index eines Item herausbekommt? Ich wollte es schon über dessen graphische Position ermitteln. Doch je nach Fenstergröße und Einstellung kann ja das Spacing und die Anzahl Icons pro Zeile unterschiedlich sein.

Auch hier im Forum lässt sich bezüglich dieses Problems nichts finden. Bin ich der Erste mit solch einem Problem?

Gruß
e-gon


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 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