Autor Beitrag
sTk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

Win 2000, Win XP
Turbo Delphi Pro, D2005 PE, Lazarus
BeitragVerfasst: Mo 02.01.06 10:24 
Hallo,

ich habe eine TListBox und ein TListView.
Nun will ich die beiden vergleichen und alle Einträge der TListBox, die im TListView nicht vorkommen sollen gelöscht werden.
Wie kann ich das anstellen?

Grüße, Steffen
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 02.01.06 10:45 
Mit der Methode IndexOf von TItems kannst du überprüfen, ob ein Eintrag in der Liste vorhanden ist. Du musst also für jeden Eintrag im Listview eine Schleife durchlaufen in der du überprüfst, ob der Eintrag in der Listbox existiert.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
for i = ListBoxItemsCount - 1 downto 0 do
begin
  s := ListboxItem[i]
  for j = 0 to ListviewItemsCount - 1 do
  begin
     if not ListviewItemsIndexof(s) do
       DeleteItemListbox
  end
end

So würde es im Pronzip aussehen.

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt
sTk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

Win 2000, Win XP
Turbo Delphi Pro, D2005 PE, Lazarus
BeitragVerfasst: Mo 02.01.06 11:21 
Also das funktioniert irgendwie nicht, weil Listview.Items.IndexOf() eine Variable vom Typ TListItem erwartet, ListboxItem[i] liefert allerdings einen String!
chrisdrury
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184

WinXP
D5 Prof
BeitragVerfasst: Mo 02.01.06 11:32 
Vielleicht hilft Dir das weiter:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TForm1.Button1Click(Sender: TObject);
var
  i,l: Integer;
  ListItem: TListItem;
  s: string;
begin
  try
    for i := 0 to ListView1.Items.Count -1 do
    begin
      while lbClients.Items.IndexOf(ListView1.Items[i].Caption) = -1 do
        ListView1.Items.Delete(i);
    end;
  except
  end;
  try
    for l := 0 to lbClients.Items.Count -1 do
    begin
      s := lbClients.Items.Strings[l];
      if ListView1.FindCaption(0,s,false,true,false) = nil then
      begin
        ListItem := ListView1.Items.Add;
        ListItem.Caption := s;
        ListItem.ImageIndex := -1;
      end;
    end;
  except
  end;
end;


lbClients ist die Listbox.
Dies Routine macht es genau anders herum, es werden alle Einträge aus der ListView mit der ListBox verglichen und evtl. fehlende Einträge in der ListView hinzugefügt, in der ListBox nicht vorhandene Einträge werden gelöscht.
sTk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

Win 2000, Win XP
Turbo Delphi Pro, D2005 PE, Lazarus
BeitragVerfasst: Mo 02.01.06 13:19 
Hi!

Listview.FindCaption habe ich aus deinem Beispiel benutzt.

Sieht bei mir dann folgendermaßen aus

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
for i := 0 to Listbox1.Items.Count -1 do
begin
  s := Listbox1.Items.Strings[i];
  if ListView1.FindCaption(0,s,False,True,False) then
    Listbox1.Items.Delete(i);
end;

und das funktioniert bei mir wunderbar!

Danke für die Tipps!

Grüße, Steffen
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 02.01.06 15:54 
user profile iconsTk hat folgendes geschrieben:
Also das funktioniert irgendwie nicht, weil Listview.Items.IndexOf() eine Variable vom Typ TListItem erwartet, ListboxItem[i] liefert allerdings einen String!

also wenn du dir das genauer angeguckt hättest, dann wäre dir aufgefallen, dass das sowieso nur Pseudocode war.