Avatar billede smith1 Nybegynder
02. november 2004 - 20:35 Der er 11 kommentarer og
3 løsninger

move items i en listbox

Jeg bruger den kode til at flytte items i min listbox, men jeg har en kopie af min listbox i en Tstringlist og den skal også flytte den samme item i min Tstringlist så det passer med listboxen. har prøvet selv uden held

dragmode := dmAutomatic.

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
var
  DropIndex: Integer;
  TempStr  : String;
begin
  with TListBox(Sender) do
  begin
    DropIndex := ItemAtPos(Point(X,Y), True);
    if (DropIndex > -1) and (DropIndex <> ItemIndex) then
    begin
      TempStr          := Items[DropIndex];
      Items[DropIndex] := Items[ItemIndex];
      Items[ItemIndex] := TempStr;
      ItemIndex        := DropIndex;
    end;
  end;
end;


procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  DropIndex: Integer;
begin
  DropIndex := TListBox(Sender).ItemAtPos(Point(X,Y),False);
  with TListBox(Source) do
  begin
    TListBox(Sender).Items.Insert(DropIndex, Items[ItemIndex]);
    Items.Delete(ItemIndex);
  end;
end;
Avatar billede stoney Nybegynder
02. november 2004 - 21:07 #1
Clear din stringlist og assign items fra listbox'en efter du
har flyttet rundt på items

dinstringlist.clear;
dinstringlist.AddStrings(listbox1.Items);

Stoney
Avatar billede smith1 Nybegynder
02. november 2004 - 21:16 #2
kan det ikke gøres på en anden måde..? så jeg "bare" kan flytte items plads i min Tstringlist.
Avatar billede stoney Nybegynder
02. november 2004 - 21:56 #3
sikkert, hvad er problemet ?

Det er 2 liniers kode og hastigheden kan ikke være noget problem

Stoney
Avatar billede smith1 Nybegynder
02. november 2004 - 22:06 #4
det er fordi der står ikke det samme i Tstringlist og listbox. jeg ved godt at jeg sagde en kopi, men der der står ikke det samme de høre bare samme.
Avatar billede smith1 Nybegynder
03. november 2004 - 17:38 #5
nogle der kan hjælpe??
Avatar billede hreiff Nybegynder
04. november 2004 - 14:57 #6
Kan du ikke bare køre 2 parallelle ombytninger:

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
var
  DropIndex: Integer;
  TempStr  : String;
begin
  DropIndex := ItemAtPos(Point(X,Y), True);
  if (DropIndex > -1) and (DropIndex <> ItemIndex) then
  begin
    with TListBox(Sender) do
    begin
      TempStr          := Items[DropIndex];
      Items[DropIndex] := Items[ItemIndex];
      Items[ItemIndex] := TempStr;
    end;
    with MyListbox do
    begin
      TempStr          := Items[DropIndex];
      Items[DropIndex] := Items[ItemIndex];
      Items[ItemIndex] := TempStr;
    end;
    TListBox(Sender).ItemIndex := DropIndex;
    MyListBox.ItemIndex        := DropIndex;
  end;
end;
Avatar billede smith1 Nybegynder
04. november 2004 - 18:11 #7
koden virker ikke.. har prøvet at køre 2 parallelle ombytninger, men kunne ikke finde ud af det.
Avatar billede hreiff Nybegynder
05. november 2004 - 07:45 #8
Prøv det her: (det virker).
2 listbox'e på formen (kunne også være en listbox og en TStringList)

procedure TForm1.FormCreate(Sender: TObject);
begin
  with listbox1 do
  begin
    clear;
    items.add('abc');
    items.add('def');
    items.add('ghi');
    items.add('jkl');
    items.add('mno');
  end;
  with listbox2 do
  begin
    clear;
    items.add('ABC');
    items.add('DEF');
    items.add('GHI');
    items.add('JKL');
    items.add('MNO');
  end;
end;

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
var
  DropIndex: Integer;
  TempStr  : String;
  ombyt: boolean;
  i,j: integer;
begin
  with TListBox(Sender) do
  begin
    ombyt := false;
    DropIndex := ItemAtPos(Point(X,Y), True);
    if (DropIndex > -1) and (DropIndex <> ItemIndex) then
    begin
      i := ItemIndex;
      j := DropIndex;
      ombyt := true;

      TempStr          := Items[DropIndex];
      Items[DropIndex] := Items[ItemIndex];
      Items[ItemIndex] := TempStr;
      ItemIndex  := DropIndex;
    end;
  end;
  if ombyt then
  begin
    with Listbox2 do
    begin
      TempStr  := Items[j];
      Items[j] := Items[i];
      Items[i] := TempStr;
      ItemIndex:= j;
    end;
  end;
end;
Avatar billede hreiff Nybegynder
05. november 2004 - 10:18 #9
Eller lidt forenklet:

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
var
  Index,DropIndex: Integer;
  TempStr  : String;
begin
  Index := TListBox(Sender).ItemIndex;
  DropIndex := TListBox(Sender).ItemAtPos(Point(X,Y), True);
  if (DropIndex > -1) and (DropIndex <> Index) then
  begin
    with TListBox(Sender) do
    begin
      TempStr          := Items[DropIndex];
      Items[DropIndex] := Items[Index];
      Items[Index] := TempStr;
      ItemIndex  := DropIndex;
    end;
    with Listbox2 do  {eller den TStringList der skal byttes om}
    begin
      TempStr  := Items[DropIndex];
      Items[DropIndex] := Items[Index];
      Items[Index] := TempStr;
      ItemIndex:= DropIndex;
    end;
  end;
end;
Avatar billede smith1 Nybegynder
06. november 2004 - 22:17 #10
kan ikke få det til at virke med en Tstringlist

[Error] Main.pas(1058): Undeclared identifier: 'Items'
[Error] Main.pas(1061): Undeclared identifier: 'ItemIndex'
[Fatal Error] Contact.dpr(5): Could not compile used unit 'Main.pas'
Avatar billede hreiff Nybegynder
08. november 2004 - 06:46 #11
Her med en TStringList: (Der er kommet en button på - Indholdet af listen kopieres over i Listbox2 ved tryk på knappen)


var Liste: TStringList;


procedure TForm1.FormCreate(Sender: TObject);
begin
  with listbox1 do
  begin
    clear;
    items.add('abc');
    items.add('def');
    items.add('ghi');
    items.add('jkl');
    items.add('mno');
  end;
  Liste := tstringlist.create;
  with liste do
  begin
    clear;
    add('ABC');
    add('DEF');
    add('GHI');
    add('JKL');
    add('MNO');
  end;
end;

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
var
  Index,DropIndex: Integer;
  TempStr  : String;
begin
  Index := TListBox(Sender).ItemIndex;
  DropIndex := TListBox(Sender).ItemAtPos(Point(X,Y), True);
  if (DropIndex > -1) and (DropIndex <> Index) then
  begin
    with TListBox(Sender) do
    begin
      TempStr          := Items[DropIndex];
      Items[DropIndex] := Items[Index];
      Items[Index] := TempStr;
      ItemIndex  := DropIndex;
    end;
    TempStr  := Liste[DropIndex];
    Liste[DropIndex] := Liste[Index];
    Liste[Index] := TempStr;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to Liste.count-1 do
    ListBox2.items.add(Liste[i]);
end;
Avatar billede smith1 Nybegynder
08. november 2004 - 08:45 #12
jeg har ikke to listbox!! en listbox og en tstringlist.... jeg vil ikke bruge 2 listbox til det.
Avatar billede hreiff Nybegynder
08. november 2004 - 08:52 #13
Ok, så undlader du bare at overføre indholdet til listbox2 (Button1Click)
Jeg havde det bare med for at se om det virkede (Det gør det)
Avatar billede smith1 Nybegynder
08. november 2004 - 17:49 #14
takker
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester