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 ListView Icon vertauschen / verschieben (https://www.delphipraxis.net/65103-listview-icon-vertauschen-verschieben.html)

delphinia 12. Mär 2006 13:41


ListView Icon vertauschen / verschieben
 
Hallo,

ich sitze seit 2 Tagen an einem Problem und komme nicht weiter.
Ich möchte gerne in einer TListView ein Icon mit der Maus verschieben. Aber auf ganz bestimmte art und weise!
Und zwar: Icon klicken ziehen und auf einem anderem Icon ablegen und beide tauschen ihren Platz.


Alles was ich bis jetzt habe - was aber nicht richtig funktioniert - ist das *nicht schimpfen für diesen Müll*

*hilfe* Gruss Doreen

Delphi-Quellcode:
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  p2.x := x;
  p2.y := y;
end;

procedure TForm1.ListView1Click(Sender: TObject);
begin
  if (ListView1.Selected <> nil) then
  begin
    ItemIdx := ListView1.Selected.Index;
    p.x := ListView1.Selected.Position.x;
    p.y := ListView1.Selected.Position.y;
  end;
end;

procedure TForm1.ListView1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ListView1.Items.BeginUpdate;


  DropItem := ListView1.GetItemAt(p2.x, p2.y);
  NextItem := ListView1.GetNextItem(DropItem, sdAll, [isFocused]);

  if Assigned(NextItem) then
  begin
    ListView1.Items[NextItem.Index].SetPosition(p2);
    ListView1.Items[ItemIdx].SetPosition(p2);
  end;

  ListView1.Items.EndUpdate;
end;


procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
begin
//
end;

procedure TForm1.ListView1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
//
end;
[edit=r_kerber]Code- durch Delphi-Tags ersetzt. Mfg, r_kerber[/edit]

Matze 12. Mär 2006 14:31

Re: ListView Icon vertauschen / verschieben
 
Hallo Doreen :hi:

Zitat:

Zitat von delphinia
Alles was ich bis jetzt habe - was aber nicht richtig funktioniert - ist das *nicht schimpfen für diesen Müll*

Der Ansatz ist doch nicht schlecht. Ich sehe, dass du dich bemüht hast und das zählt, du zeigst Eigeninitiative. Da schimpft garantiert keiner. :D

Ich habe es schnell so zusammengebastelt und bei mir funktioniert es ganz gut:

Delphi-Quellcode:
procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  StartItem, TargetItem: TListItem; // Start-/Ziel-Item
  TempImgIndex: Integer; // ImageIndex temporär speichern
begin
  if not (Sender = Source) then
    Exit;

  StartItem := ListView1.Selected;
  TargetItem := ListView1.GetItemAt(X, Y);

  // Indizes vertauschen
  TempImgIndex := TargetItem.ImageIndex;
  TargetItem.ImageIndex := StartItem.ImageIndex;
  StartItem.ImageIndex := TempImgIndex;

  // Falls ViewStyle auf "vsIcon" oder "vsSmallIcon" gesetzt ist,
  // ist das zu empfehlen (s. marabus Beitrag)
  ListView1.Arrange(arDefault);
end;

procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := (Sender = Source)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListView1.DragMode := dmAutomatic;
end;

marabu 12. Mär 2006 14:43

Re: ListView Icon vertauschen / verschieben
 
Hallo Matthias,

da der Code nur mit ausgeschaltetem MultiSelect funktioniert, musst du das DragItem nicht erst ermitteln - es ist identisch mit ListView.Selected. Nach dem Vertauschen solltest du noch Arrange(arDefault) auf der ListView ausführen, da es sonst zu unschönen Lücken kommt.

Grüße vom marabu

delphinia 12. Mär 2006 14:54

Re: ListView Icon vertauschen / verschieben
 
danke danke :thumb:
funktioniert sehr sehr sehr gut ;)

Nun erstmal schauen was du gemacht hast und wo meine gedankenfehler waren!

Matze 12. Mär 2006 14:59

Re: ListView Icon vertauschen / verschieben
 
Hi

@marabu: Ah, das wusste ich nicht und habe es oben eingefügt. Nun entfällt die globale Variable, sehr schön. :)

@delphinia: Bittesehr.


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