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.
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;
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.
... 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;
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.