Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Verschieben der Items innerhalb einer CheckListBox per Drag&


lexmy3 - Mi 04.01.06 11:25
Titel: Verschieben der Items innerhalb einer CheckListBox per Drag&
Hallo

Ich versuche die Items innerhalb einer CheckListBox verschieben zu konnen per Drag&Drop, doch es macht nicht was ich will. Kann einer vieleicht ein Tip geben???

Habe diesen Quellcode hier gefunden und auf mein Prog. umgeschrieben, doch es bewegt sich die Ganze CheckListBox und nicht die Items innerhalb WARUM???

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
//Akzeptieren der Items in der CheckListBox ////////////////////
procedure TFormGeneral.CheckListBoxGeneralDragOver(Sender, Source: TObject;
  X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
    Accept := Source is TCheckListBox;
end;


// Drag&Drop innerhalb der CheckListBox/////////////////////////////////////
procedure TFormGeneral.CheckListBoxGeneralDragDrop(Sender, Source: TObject;
  X, Y: Integer);
var
  iTemp : integer;
  ptTemp : TPoint;
  szTemp : String;

begin
{Ändern Sie den x, y Koordinaten in eine TPoint-Aufzeichnung}
  ptTemp.x:=x;
  ptTemp.y:=y;  

   {Verwende eine While-Schleife statt for-Schleife wegen Items
   welche von listboxes entfernt werden, den das eine Exeption verhindert}

  iTemp := 0;
  While iTemp <= TCheckListBox(Source).Items.Count-1 do
  begin

    {Suchen nach den ausgewählten Items, welche zu bewegen sind}
    if TCheckListBox(Source).selected[iTemp] then
    begin

       {benutze With um den Code leichter lesen zu können}
      With Sender as TCheckListBox do
      begin

      {hier muss eine vorläufige Variable verwenden werden,denn wenn der Item
      gelöscht wird, wird sich das Indexieren ändern}

        szTemp := TCheckListBox(Source).items[iTemp];

      { Löscht den Item, der geschleppt(Drag) wird}
        TCheckListBox(Source).items.Delete(iTemp);

{Fügt den Item in die richtige Position in CheckListBox ein, auf der es fallengelassen wird}
        items.Insert(itemAtPos(ptTemp,true),szTemp);
      end;  
    end;
    inc(iTemp);
  end;
end;


Mfg

Lexmy3


Kroko - Mi 04.01.06 11:29

Items ist vom Typ TStrings und da gibt es Excchange als Methode :!:


lexmy3 - Mi 04.01.06 11:36

user profile iconKroko hat folgendes geschrieben:
Items ist vom Typ TStrings und da gigt es Excchange als Methode :!:


Hey es geht, musste nur im Objektinspector unter Eigenschaften DragKind auf dkDrag umstellen!!!!!!!!!!!

Und es geht doch!!!!!!!!!

Trotzdem Danke

mfg

Gruß aus Frankfurt


Kroko - Mi 04.01.06 11:42

user profile iconlexmy3 hat folgendes geschrieben:
...

Und es geht doch!!!!!!!!!

...


Wenn man nach Byte bezahlt wird schon :P


lexmy3 - Mi 04.01.06 12:11

user profile iconKroko hat folgendes geschrieben:
user profile iconlexmy3 hat folgendes geschrieben:
...

Und es geht doch!!!!!!!!!

...


Wenn man nach Byte bezahlt wird schon :P


Hey,
wenn du eine andere/kürzere Möglichkeit hast dann bin ich gerne bereit es umzuändern.


lexmy3 - Mi 04.01.06 12:30

So So nach deiner Kritik habe ich noch einwenig rum gestöbert und dies entdeckt.

Das geht auch und ist um einige Zeilen kürzer!!!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
                 // DRAG&DROP  innerhalb der CheckListBox //

procedure TFormSewage.CheckListBoxSewageDragOver(Sender, Source: TObject;
  X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := Source is TCheckListBox;  //akzeptieren der Items innerhalb der CheckListBox
//oder
//if source is TCheckListbox then accept:=true else accept:=false;
end;

procedure TFormSewage.CheckListBoxSewageDragDrop(Sender, Source: TObject;
  X, Y: Integer);
begin
CheckListBoxSewage.Items.Move(CheckListBoxSewage.ItemIndex,CheckListBoxSewage.ItemAtPos(point(x,y),true));
end;


Mfg

Willi