Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - in listbox teilstring suchen...


lonley-lovley - So 11.12.05 17:34
Titel: in listbox teilstring suchen...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TOszVerwalt.btsuchenClick(Sender: TObject);
var alles:string;
   z,i : integer;
begin
 i:=0 ;
repeat
alles:=libanzeige.items[i];
z:=pos('. ',alles) ;
delete(alles,1,z+2);
if libanzeige.items[i] <> edbildgang.text
then libanzeige.items.Delete(i);
i:=i+1;
until i= libanzeige.Items.Count ;


ist mein bisheriger quellcode aber der löscht einfach jeden 2. string und ich weiß nciht woran das liegt
es sollen doch nur die geschöscht werden bei denen der teilstring nciht dem eingabewert entspricht

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt.


GTA-Place - So 11.12.05 18:20

Nach einem Teilstring sucht man mit Suche in der Entwickler-Ecke POS();.


lonley-lovley - So 11.12.05 18:27

user profile iconGTA-Place hat folgendes geschrieben:
Nach einem Teilstring sucht man mit Suche in der Entwickler-Ecke POS();.


hab ich doch getan!


Gausi - So 11.12.05 18:30

Hallo und :welcome: in der Entwickler-Ecke!

Ich weiss auch nicht genau, woran das liegt, aber du machst einen prinzipiellen Fehler:

Wenn du eine Liste durchgehen willst, und dabei einige Elemente löschen willst, so ist es empfehlenswert, die Liste von hinten durchzugehen! Warum? Guckst du hier:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
z.B. i=2
0  Null
1  Eins
2  Zwei <---- (löschen, anschließend i erhöhen)
3  Drei
4  Vier

Ergebnis:
0  Null
1  Eins
2  Drei     (Dieser Wert wird einfach übersprungen)
3  Vier <------

Wahrscheinlich stimmt mit deiner Überprüfung noch was nicht, so dass diese immer True liefert, sodass dann jede zweite Zeile gelöscht wird (warum jede Zweite, sollte jetzt klar sein).


GTA-Place - So 11.12.05 18:33

Stimmt, hab ich übersehen. Sry.


lonley-lovley - So 11.12.05 21:00


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:
procedure TOszVerwalt.btsuchenClick(Sender: TObject);
 var  alles: string;
  z, i: integer;
  begin
   for i := libanzeige.Items.Count-1 DownTo 0 do
    begin
      alles := libanzeige.items[i];
        z := pos('. ', alles);
          Delete(alles, 1, z+1); /// Teilstring bleibt übrig
            if edbildgang.text = 'og'
            then
              if alles <> '1'
              then libanzeige.items.Delete(i);
                 if edbildgang.text ='bos'
                 then      if alles <> '2'
                  then libanzeige.items.Delete(i);
                    if edbildgang.text = 'of'
                    then      if alles <> '4'
                     then libanzeige.items.Delete(i);
                       if edbildgang.text ='obf'
                       then      if alles <> '5'
                       then libanzeige.items.Delete(i);
                         if edbildgang.text ='ob'
                         then      if alles <> '6'
                         then libanzeige.items.Delete(i);
                          end;
                          end;


hab jetzt nochma l was neues probiert jetzt werden alle einträge gelöscht weiß jetzt jemand woran das liegt?
sry ür die länge aber kürzer funzt es ja anscheinend auch nicht!

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt.


Lannes - So 11.12.05 23:01

Hallo,

hab den Code mal formatiert, war ja grausam :?

Wie sehen denn die Einträge in der ListBox aus?
Könnte es sein das der Reststring nie eine '1' '2' u.s.w. ist?
Eventuell fällt Dir jetzt selbst etwas auf.

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:
31:
32:
procedure TOszVerwalt.btsuchenClick(Sender: TObject);  
var  alles: string;
      z, i: integer;
begin
 for i := libanzeige.Items.Count-1 DownTo 0 do
   begin
   alles := libanzeige.items[i];
   z := pos('. ', alles);
   Delete(alles, 1, z+1); /// Teilstring bleibt übrig

   if edbildgang.text = 'og' then
     if alles <> '1' then
       libanzeige.items.Delete(i);

   if edbildgang.text ='bos' then
     if alles <> '2' then
       libanzeige.items.Delete(i);

   if edbildgang.text = 'of' then
     if alles <> '4' then
       libanzeige.items.Delete(i);

   if edbildgang.text ='obf' then
     if alles <> '5' then
       libanzeige.items.Delete(i);

   if edbildgang.text ='ob' then
     if alles <> '6' then
       libanzeige.items.Delete(i);

   end;
end;


lonley-lovley - So 11.12.05 23:11
Titel: doch
also ich habs gerade getestet und hab mir den rest string ausgeben lassen der ist 1 gewesen :( ich weiß echt nicht mehr weiter


lonley-lovley - So 11.12.05 23:13
Titel: einträge
ach ja meine einträge sehen so aus
nachname,vorname;kl. nummer/ tutor
umgesetzt also
Mustermann, Max;kl. 123 /Müller

und die erste zahl gibt den bildungsgang an in diesem fall OG max mustermann macht also abitur;)


Lannes - So 11.12.05 23:49

Hallo,

mit Delete(alles, 1, z+1); löscht Du nur den Teil bis zur ersten Zahl.

Aus 'Mustermann, Max;kl. 123 /Müller' wird '123 /Müller'.
Also ist alles immer ungleich '1' und alle Items werden gelöscht.

Wenn Du nur auf die erste Zahl nach '. ' prüfen willst,
kannst Du direkt auf sie zugreifen:

Delphi-Quelltext
1:
2:
3:
4:
5:
  z := pos('. ', alles);
  //Delete(alles, 1, z+1); //brauchst Du nicht mehr
  if edbildgang.text = 'og' then
    if alles[z+2] <> '1' then
      libanzeige.items.Delete(i);


lonley-lovley - So 11.12.05 23:52

user profile iconLannes hat folgendes geschrieben:
Hallo,

mit Delete(alles, 1, z+1); löscht Du nur den Teil bis zur ersten Zahl.

Aus 'Mustermann, Max;kl. 123 /Müller' wird '123 /Müller'.
Also ist alles immer ungleich '1' und alle Items werden gelöscht.

Wenn Du nur auf die erste Zahl nach '. ' prüfen willst,
kannst Du direkt auf sie zugreifen:

Delphi-Quelltext
1:
2:
3:
4:
5:
  z := pos('. ', alles);
  //Delete(alles, 1, z+1); //brauchst Du nicht mehr
  if edbildgang.text = 'og' then
    if alles[z+2] <> '1' then
      libanzeige.items.Delete(i);


danke das funktioniert jetzt auch hab nen neues problem wo du mir helfen kannst;)