Kopiowanie z listboxa do listboxa

0

Witam. Męczę się z tym już od kilku godzin i nie mogę tego napisać. Procedura polega na kopiowaniu Jednego elementu z pierwszego listboxa do drugiego Listboxa. Jednak gdy Element został już kiedyś skopiowany, procedura zaznacza tylko dawniej skopiowany element zamiast go kopiowac ponownie.

procedure TForm1.Button1Click(Sender: TObject);
var
  index:integer;
begin
  if Listbox2.Items.Count <> -1 then
  begin
    index := ListBox2.Items.Count-1;
    while (index > 0) and (CompareText(Listbox1.Items.Strings[Listbox1.ItemIndex],ListBox2.Items[index]) < 0) do
      Dec(index);
    if CompareText(Listbox1.Items.Strings[Listbox1.ItemIndex], ListBox2.Items[index]) = 0 then
      ListBox2.ItemIndex := index;
  end;
  Listbox2.Items.Add(Listbox1.Items[Listbox1.Itemindex]);
end;

Bardziej pokręcić już się nie da

I dlaczego nie można na tym forum edytowac postów...

procedure TForm1.Button1Click(Sender: TObject);
var
  index:integer;
begin
  if Listbox2.Items.Count <> -1 then
  begin
    index := ListBox2.Items.Count-1;
    while (index > 0) and (CompareText(Listbox1.Items.Strings[Listbox1.ItemIndex],ListBox2.Items[index]) < 0) do
      Dec(index);
    if CompareText(Listbox1.Items.Strings[Listbox1.ItemIndex], ListBox2.Items[index]) = 0 then
      ListBox2.ItemIndex := index;
  end;
  Listbox2.Items.Add(Listbox1.Items[Listbox1.Itemindex]);
end;

A może ktoś odpowie?

1

Coś strasznie namotałeś. Najprościej będzie chyba jak poniżej. IndexOf zwraca indeks elementu bez względu na wielkośc liter. A jeżeli Tobie zależy na rozróżnianiu wielkości liter to zamiast sprawdzać IndexOf zrób sobie pętle po elementach DestinationLB i przerywaj ją Breakiem jeżeli wykryje element o takiej samej nazwie jak pobrany z SourceLB i podstawiaj przed Break wartość zmiennej dla pętli do tej zmiennej DestIdx. O ile dobrze Ciebie zrozumiałem i o takie coś jak poniżej Ci chodziło, a jak nie to wytłumacz, pokobminuje wtedy w inny sposób.

procedure COpyLBItem(SourceLB, DestinationLB : TListBox; IndexOfItemToCopy : integer);
var
  SrcIdx, DestIdx : integer;
begin
  if (IndexOfItemToCopy > -1) and (IndexOfItemToCopy < SOurceLB.Items.Count) then
  begin
    SrcIdx := SourceLB.ItemIndex;
    if SrcIdx > -1 then
    begin
      DestIdx := DestinationLB.Items.IndexOf(SourceLB.Items[SrcIdx]);
      if DestIdx = -1 then
      begin
        DestinationLB.Items.Add(SourceLB.Items[SrcIdx]);
      end
      else
      begin
        DestinationLB.ItemIndex := DestIdx;
      end;
    end;
  end;
end;

Przykład użycia:

  COpyLBItem(ListBox1, ListBox2, ListBox1.ItemIndex);
1

Istnieje coś takiego jak:
TListBox.items.IndexOf('tekst');

1

Izupełnię swoją odpowiedź. Jeżeli pytającemu zależy - a tak można zgadywać z jego kombinacji z tym kodem co podał - na rozróżnianiu wielkości liter, to można to zrobić, tak jak poniżej. I dodam, że bez Sensu jest sprawdzanie czy ilośc elementów w jakimkolwiek ListBoxie czy tego typu komponencie jest różna od -1. Bo zawsze będzie różna od -1, gdyż najmniejsza ilośc przy pustej liście będzie 0.

procedure COpyLBItem(SourceLB, DestinationLB : TListBox; IndexOfItemToCopy : integer);
var
  I, SrcIdx, DestIdx : integer;
begin
  if (IndexOfItemToCopy > -1) and (IndexOfItemToCopy < SOurceLB.Items.Count) then
  begin
    SrcIdx := SourceLB.ItemIndex;
    if SrcIdx > -1 then
    begin
      DestIdx := -1;
      for I := 0 to DestinationLB.Items.Count - 1 do
      begin
        if SourceLB.Items[SrcIdx] = DestinationLB.Items[I] then
        begin
          DestIdx := I;
          Break;
        end;
      end;
      if DestIdx = -1 then
      begin
        DestinationLB.Items.Add(SourceLB.Items[SrcIdx]);
      end
      else
      begin
        DestinationLB.ItemIndex := DestIdx;
      end;
    end;
  end;
end;
1
procedure TForm1.Button1Click(Sender: TObject);
var
  i:Integer;
  s:string;
begin
  with ListBox1 do s:=Items[ItemIndex];//element do ew. skopiowania
  with ListBox2 do
  begin
    i:=Items.IndexOf(s);//szukamy tego elementu w ListBox2
    if i=-1 then//jeśli nie znaleziono
      Items.Add(s)//dodajemy
    else//jeśli znaleziono
      ItemIndex:=i;//zaznaczamy
  end;
end;
0

Wszyscy dostają plusika, dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1