![]() |
Drag&Drop Problem - TListView???
Hallo,
ich benutze folgenden Tip für Drag&Drop der ListItems in einem ListView: ![]() Finktioniert prima, aber: bei mir ist jeder ListItem in der ListView ist mit einem Thread "verknüpft":
Code:
Dabei ist der Thread so erstellt, dass er Terminiert, wenn er den zugewiesenen ListItem nicht mehr findet. Das Problem ist folgendes: bei Drag&Drop wird der ziehende ListItem gelöscht und einen neuen erstellt:
..
var item: TListItem; thread: TThread; begin item := Form1.ListView1.Items.Add; Thread := TMyThread.create(true, Item); item.Caption := Edit1.Text; item.Data := Pointer(Thread); Thread.resume; end; ..
Code:
procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var DragItem, DropItem, CurrentItem, NextItem: TListItem; begin if Sender = Source then with TListView(Sender) do begin DropItem := GetItemAt(X, Y); CurrentItem := Selected; while CurrentItem <> nil do begin NextItem := GetNextItem(CurrentItem, SdAll, [IsSelected]); if DropItem = nil then DragItem := Items.Add else DragItem := Items.Insert(DropItem.Index); DragItem.Assign(CurrentItem); CurrentItem.Free; CurrentItem := NextItem; end; end; end;
Code:
Der Thread wird sofort auch terminiert. Kann man den Tip irgendwie modernisieren, so dass der ListItem nicht gelöscht, sondern nur an eine andere stelle verschoben wird?
...
CurrentItem.Free; ... Danke! |
DP-Maintenance
Dieses Thema wurde von "Christian Seehase" von "Windows API" nach "VCL-Komponenten und Controls" verschoben.
Es geht um eine VCL-Komponente |
Re: Drag&Drop Problem - TListView???
Hi Romber,
hast das gleiche Problem wie ich im Augenblick. Dabei handelt es sich zwar nur um ein Testprojekt, soll aber ein "großes" werden. Wirst wahrscheinlich eine Funktion in den Thread implementieren müssen, bei dem Du das Handle der des ListItem ändern kannst - und dann den Thread fortfahren. Eine andere Möglichkeit habe ich auch noch nicht gefunden - werde aber noch ein wenig testen. MfG Michael Wollert |
Re: Drag&Drop Problem - TListView???
Meine Lösung:
Delphi-Quellcode:
und klappt ganz gut ;)
listview.Items.BeginUpdate;
try Source := listview.Items[ItemFrom]; Target := listview.Items.Insert(ItemTo); Target.Assign(Source); with TLIThread(Source.Data) do begin Suspend; ListItem := Target; Resume; end; Source.Free; If ItemFrom < ItemTo then ListView.ItemIndex := ListView.ItemIndex -1; Result := ListView.ItemIndex; finally listview.Items.EndUpdate; end; Hoffe geholfen zu haben. Sollte bei Dir auch funktionieren - aber ACHTUNG: Du Erstellst ein "TMyThread" in einem für "TThread"-reservierten Bereich!!! Solltest Du noch anpassen. MfG Michael Wollert |
Re: Drag&Drop Problem - TListView???
Danke, ich werde gleich ausprobieren! :angle:
|
Re: Drag&Drop Problem - TListView???
Zitat:
|
Re: Drag&Drop Problem - TListView???
Hi Romber,
zuerstmal solltest Du ein property in Deiner Klasse anlegen:
Delphi-Quellcode:
Mit der Eigenschaft kannst Du direkt auf den Thread zugreifen und einfach das List-Item ändern.
type
TLIThread = class(TThread) private . . FLI : TListItem; . . protected . . public . . property ListItem : TListItem read FLI write FLI; . . end; So, nun musst Du das Item auch noch in Deiner Anwendung, die den Thread bearbeitet, ändern. Dazu solltest Du den Thread jedoch anhalten, um Zugriffsverletzungen, bzw. Thread-Locks zu vermeiden: Die Prozedur die ich verwende ist im Grunde genommen die gleiche, die auch Du verwendest, nur eben auf das ListItem angepasst:
Delphi-Quellcode:
Na, alle Klarheiten beseitigt? ;)
.
. listview.Items.BeginUpdate; try Source := listview.Items[ItemFrom]; Target := listview.Items.Insert(ItemTo); Target.Assign(Source); with TLIThread(Source.Data) do begin // ab hier wird das neu angelegte Item in den Thread übergeben: Suspend; // Thread kurzfristig anhalten ListItem := Target; // ListItem zuweisen Resume; // Thread fortsetzen end; Source.Free; Einfach fragen, wenn noch was offen sein sollte - ansonsten bedanken ;)) (Tut gut ;) MfG Michael Wolletr |
Re: Drag&Drop Problem - TListView???
Natürlich, Vielen Dank! Meinte ich doch auch! :cheers: :zwinker:
Ich probiere gleich! Was fragen angeht, tue ich doch immer gerne! Nochmal Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 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