29. november 2000 - 13:37Der er
15 kommentarer og 2 løsninger
Drag og drop
Jeg har en listbox med en masse navne i, de navne vil jeg gerne kunne trække over i nogle nye listboxe\'e som jeg har oprettet dynamisk. Hvordan gør jeg det
for i:= 0 to 3 do begin ListColumn := _ListView.Columns.Add; ListColumn.Caption := IntToStr(Random(5000)); ListColumn.Alignment := taCenter; ListColumn.AutoSize :=TRUE; end;
__ListView.Columns.Assign(_ListView.Columns);
for i:= 0 to 15 do begin ListItem := _ListView.Items.Add; ListItem.Caption := IntToStr(Random(5000)); ListItem.SubItems.Add(IntToStr(Random(5000))); ListItem.SubItems.Add(IntToStr(Random(5000))); ListItem.SubItems.Add(IntToStr(Random(5000))); end; end;
procedure TForm1.ListViewDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := Source is TListView; end;
procedure TForm1.ListViewDragDrop(Sender, Source: TObject; X, Y: Integer); var ListItem : TListItem; DragPos : Integer; begin DragPos :=(Sender as TListView).Items.IndexOf((Sender as TListView).GetItemAt(X,Y));
if DragPos = -1 then DragPos := (Sender as TListView).Items.Count;
ListItem := (Source as TListView).Selected; (Sender as TListView).Items.Insert(DragPos); (Sender as TListView).Items[DragPos].Assign(ListItem); (Source as TListView).Items.Delete((Source as TListView).Items.IndexOf((Source as TListView).Selected)); end;
procedure TForm1.ListViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var DragItem: Integer; begin if Button = mbLeft then begin DragItem := (Sender as TListView).Items.IndexOf((Sender as TListView).GetItemAt(X,Y));
if (DragItem > -1) and (DragItem < (Sender as TListView).Items.Count) then (Sender as TListView).BeginDrag(False); end; end;
procedure TForm1.ListViewKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var i : Integer; begin if key <> 39 then exit; if not Boolean(__ListView.Items.Count) then exit; i := _ListView.Items.IndexOf(_ListView.Selected);
if i> __ListView.Items.Count-1 then i := __ListView.Items.Count-1;
UHA hvor ser dit program fint ud... Men ser du, jeg fatter ikke så meget af hvad der sker i programmet så kunne du omskrive det så det passer lidt mere til mit spørgsmål ???
procedure TMainForm.FormCreate(Sender: TObject); begin Height := 410; Width := 720; FastListBox.MultiSelect := True; // Tillad drag af mere end et navn. FastListBox.DragMode := dmAutomatic; // Enable dragging from listbox. end;
procedure TMainForm.buCreateListboxClick(Sender: TObject); begin // Opret en dynamisk Listbox. With TlistBox.Create(Self) Do Begin Parent := Self; Top := 32; Left := 224; Height := 273; Width := 121;
procedure TMainForm.ListBoxDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := Source Is TListBox; end;
procedure TMainForm.ListBoxDragDrop(Sender, Source: TObject; X, Y: Integer); Var lbReceiver : TListBox; lbSource : TListBox; Index : Integer; aStr : String; begin lbReceiver := Sender As TListBox; // Listbox der droppes på. lbSource := Source As TListbox; // Listbox der dragges fra.
For Index := 0 To lbSource.Items.Count-1 Do If lbSource.Selected[Index] Then Begin aStr := lbSource.Items[Index]; lbReceiver.Items.Add(aStr); End; end;
Ok nu har jeg vist svar på alle mine spørgsmål for denne gang
Jeg vælger at give jer begge point Delphi fordi han kom med en konkret løsning på mit problem med hensyn til drag-drop Borrisholt for løsningen af spørgsmål 2 Hilsen Anders
Den løsning er sku\' for nem Jens! Du sletter kun den ene linie der har focus. Drag operationen er lavet således at mere end en linie er selected.
Umiddelbart kan du gøre det således: procedure TMainForm.ListBoxDragDrop(Sender, Source: TObject; X, Y: Integer); Var lbReceiver : TListBox; lbSource : TListBox; Index : Integer; aStr : String; begin lbReceiver := Sender As TListBox; // Listbox der droppes på. lbSource := Source As TListbox; // Listbox der dragges fra.
For Index := lbSource.Items.Count-1 Downto 0 Do // NB: Ned af! If lbSource.Selected[Index] Then Begin aStr := lbSource.Items[Index]; lbReceiver.Items.Add(aStr);
lbSource.Items.Delete(Index); // Ny linie End; end;
Ulempen er her, at i og med der skal slettes bagfra, så overføres dine \'navne\' i omvendt rækkefølge. Det KAN selvfølgeligt være ligegyldigt eller alternativt kan du sætte din listbox til at være sorteret. Hvis linierne SKAL overføres i den samme rækkefølge kan du gøre følgende (en dobbeltloop, hvor kopiering foretages først hvorefter loop to sletter linierne):
procedure TMainForm.ListBoxDragDrop(Sender, Source: TObject; X, Y: Integer); Var lbReceiver : TListBox; lbSource : TListBox; Index : Integer; aStr : String; begin lbReceiver := Sender As TListBox; // Listbox der droppes på. lbSource := Source As TListbox; // Listbox der dragges fra.
For Index := 0 To lbSource.Items.Count-1 Do If lbSource.Selected[Index] Then Begin aStr := lbSource.Items[Index]; lbReceiver.Items.Add(aStr); End;
For Index := lbSource.Items.Count-1 DownTo 0 Do If lbSource.Selected[Index] Then lbSource.Items.Delete(Index); end;
Fusk, hans svar på spørgsmål to var \'forkert\'...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.