Avatar billede whitehawk Nybegynder
27. september 2006 - 14:46 Der er 6 kommentarer

Sammenligning af elementer i to listboxes

jeg har to listboxes og en knap på en form.
Når jeg trykker på knappen skal følgende ske.
Først itereres der gennem elementerne i listbox1, derefter gennem listbox2. Hvis et element i listbox1 også findes i listbox2, så skal elementet slettes fra listbox1.

Hvad er den nemmeste/bedste løsning?
Avatar billede martinlind Nybegynder
27. september 2006 - 15:10 #1
brug Items.IndexOf()
Avatar billede whitehawk Nybegynder
27. september 2006 - 15:15 #2
kan du vise et eksempel?
Avatar billede whitehawk Nybegynder
27. september 2006 - 15:30 #3
asdfsdafdhgfdghggfgh
Avatar billede pigbear Nybegynder
28. september 2006 - 15:21 #4
Prøv fx. dette:

Drop 3 listboxe og en button på din form og indsæt følgende kode i button1click !

procedure TForm1.Button1Click(Sender: TObject);
Var
fil : textfile;
Filnavn1,Filnavn2,tmp,tmp2:String;
i,j : Cardinal;
begin
Filnavn1:='c:\fil1.txt';
Filnavn2:='c:\fil2.txt';

listbox1.clear;
listbox2.clear;

  assignFile(fil,Filnavn1);
  reset(fil);
  while not eof(fil) do
  Begin
  readln(fil,tmp);
  listbox1.Items.Add(tmp);
  end;
  closeFile(fil);


  assignFile(fil,Filnavn2);
  reset(fil);
  while not eof(fil) do
  Begin
  readln(fil,tmp);
  listbox2.Items.Add(tmp);
  end;
  closeFile(fil);

    i:=0;
    j:=0;
    while (i <= listbox1.items.count -1) Do
    begin
    tmp:=listbox1.Items.Strings[i];
    For j:=0 to listbox2.items.count -1 Do
    Begin
      tmp2:=listbox2.Items.Strings[j];
      If tmp = tmp2 Then
      Begin
      Listbox3.Items.add(tmp);
      end;
    end;
    inc(i);
    end;

    i:=0;{Slet data i listbox1 ud fra data i listbox3}
    while (i <= listbox3.items.count-1) Do
    begin
    tmp:=listbox3.Items.strings[i];
    listbox1.items.delete(listbox1.Items.IndexOf(tmp));
    inc(i);
    end;
end;


Mvh

PigBear
Avatar billede hrc Mester
05. oktober 2006 - 14:24 #5
Hvad med dette her?

  procedure FilterStrings(aStrings1, aStrings2 : TStrings);
  var
    i, Index : integer;
  begin
    // Lad IndexOf arbejde på den mindste af listerne
    if aStrings1.Count < aStrings2.Count then
    begin
      for i := 0 to aStrings2.Count - 1 do
      begin
        Index := aStrings1.IndexOf(aStrings2[i]);
        if Index >= 0 then
          aStrings1.Delete(Index);
      end;
    end;
    else
      for i := aStrings1.Count - 1 downto 0 do
        if aStrings2.IndexOf(aStrings1[i]) >= 0 then
          aStrings1.Delete(i);
  end;

Kaldes således:

  FilterStrings(Listbox1.Items,Listbox2.Items);

Den bedste løsning var om man fyldte begge samtidigt og der førte strengen til den ene eller andet liste.
Avatar billede hrc Mester
05. oktober 2006 - 14:26 #6
... tror ikke meget på den "optimerede" version ovenfor. Dette her er sikkert fuldt ud tilstrækkeligt.

  procedure FilterStrings(aStrings1, aStrings2 : TStrings);
  var
    i : integer;
  begin
    for i := aStrings1.Count - 1 downto 0 do
      if aStrings2.IndexOf(aStrings1[i]) >= 0 then
        aStrings1.Delete(i);
  end;
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