Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Doppelte Einträge in Listbox verhindern


mjeheuer - Mi 24.01.07 20:05
Titel: Doppelte Einträge in Listbox verhindern
Hallo zusammen

Ich habe zwar schon einige wenige vergleichbare Tips im Indernet zum Thema gefunden, aber irgendwie klappts bei mir nicht.
Ich will Daten aus einer MySQL Datenbank auslesen (Städtenamen) und diese in eine Listbox eintragen. Natürlich sollen dabei doppelte Einträge nicht übertragen werden.
Ich habe gelesen das dieses aussieben der doppelten Einträge am besten über eine TStringListe gehen soll, daher habe ich erst die Daten in ein TStringList (liste) eingelesen und nach Abschluß in die Listbox kopiert. Leider werden trotzdem immer noch alle doppelten (und mehr) Städtenamen in die Listbox eingetragen.

Sieht jemand was ich falsch mache?? :?:


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:
29:
30:
var liste: TStringList;
begin
[...]
      try
        Form1.qrMain.Sql.Text:='select ORT from SWITCHE';
        Form1.qrMain.Open;
        
        //vorbereitungen
        liste:=TStringList.Create;
        liste.Clear;
        liste.Duplicates:=dupIgnore;
        liste.BeginUpdate;

        //einlesen der Daten
        while not Form1.qrMain.Eof do
         begin
           liste.Add(Form1.qrMain.FieldByName('ORT').AsString);
           Form1.qrMain.Next;
         end;

        //kopieren in die ListBox
        liste.EndUpdate;
        StadtListBox.Items.Assign(liste);
        Form1.qrMain.Close;

      finally

         liste.Free;
         Form1.dbMain.Connected:=false;
      end//try



Gruß
Michael


Andidreas - Mi 24.01.07 20:26


Delphi-Quelltext
1:
2:
if ListBox.Items.IndexOf('STADT') -1 then
   ListBox.Items.Add('STADT');


Fügt den Eintrag nur hinzu, wenn dieser noch nicht vorhanden ist.


Narses - Mi 24.01.07 21:27

Moin!

Ich schätze mal, die Orte unterscheiden sich in Gross-/Kleinschreibung? ;)

Probier mal das:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
//vorbereitungen  
liste := TStringList.Create;  
// liste.Clear; // nach dem Erzeugen ist die Liste immer leer... ;)
liste.Duplicates := dupIgnore;  
liste.CaseSensitive := FALSE; // CharCase ignorieren
liste.BeginUpdate;  
...

cu
Narses


Delete - Mi 24.01.07 21:34

wieso nicht:


Delphi-Quelltext
1:
2:
3:
4:
5:
begin
[...]
      try
        Form1.qrMain.Sql.Text:='select distinct ORT from SWITCHE';
        Form1.qrMain.Open;


dann hast du doch keine doppelten zeilen.


mjeheuer - Mi 24.01.07 21:59

Zitat:

Ich schätze mal, die Orte unterscheiden sich in Gross-/Kleinschreibung? ;)


Hallo Narses

Nee, die Namen sind alle exakt identisch :wink:
Ich habe es jetzt so gemacht wie Grenzgänger es vorgeschlagen hat. Funktioniert wunderprächtig.

Gruß
Michael


mjeheuer - Mi 24.01.07 22:00

user profile iconAndidreas hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
if ListBox.Items.IndexOf('STADT') -1 then
   ListBox.Items.Add('STADT');


Fügt den Eintrag nur hinzu, wenn dieser noch nicht vorhanden ist.


Hallo Andidreas

Danke für den Tip :)

gruß
Michael


mjeheuer - Mi 24.01.07 22:03

user profile iconGrenzgaenger hat folgendes geschrieben:
wieso nicht:


Delphi-Quelltext
1:
2:
3:
4:
5:
begin
[...]
      try
        Form1.qrMain.Sql.Text:='select distinct ORT from SWITCHE';
        Form1.qrMain.Open;


dann hast du doch keine doppelten zeilen.


Hallo Grenzgänger

Danke für den Tip. Genauso habe ich es gemacht und es funktioniert wunderbar. :D
Es ist auch kein Geschwindigkeitsverlust bemerkbar (bis jetzt rund 2000 Einträge in der Datenbank)

Gruß
Michael