![]() |
StrList zeilenw. kopiern unter Berücksichtg. Schwarzen Liste
Hallo,
ich weiß nicht mehr weiter. Seit heute Nachmittag hab ich allesmögliche probiert. Ich blick schon fast durch meinen eigenen Code nicht mehr.
Delphi-Quellcode:
Den Aspekt, daß falls der bsondere Satz enthalten ist, hab ich noch gar nicht berückschtigt - weil schon der Rest nicht klappt.
procedure TForm1.Button1Click(Sender: TObject);
var Erg : String; j, k: Integer; begin listbox3.Clear; listbox4.Clear; // EDIT: hier stand gerade eben noch "Listbox2.clear" Erg := ''; for j := 0 to listbox1.items.Count - 1 do begin for k := 0 to ListBox2.items.Count - 1 do begin if Pos(ListBox2.Items.Strings[k], listbox1.items.Strings[J]) < 1 then begin Erg := listbox1.items.Strings[J]; end; end; if Erg <> '' then Listbox3.items.Add(listbox1.items.Strings[J]) else Memo4.Lines.Add(listbox1.items.Strings[J]); Erg := ''; end; Beispielliste Listbox1 * Knieoperation Patient Müller * Magenspiegelung Dr. Kranich * Magensonde Patient Röhrig * Rückenmarksnarkose Patient Liebig * Reanimation Dr. Schmitt * Skalpell ausgerutscht Dr. Tattrich Beispielliste Listbox2 * Knieoperation * Spiegelung * Skalpell Der besondere Satz soll "Reanimation" lauten und die Zeile {"Reanimation Dr. Schmitt"} in Listbox 4 kopieren, nicht aber in listbox 3 Listbox3 soll dann später enthalten: * Magensonde Patient Röhrig * Rückenmarksnarkose Patient Liebig 1) Seht Ihr was ich falsch mache? 2) Habt Ihr eine Idee, wie man die Berücksichtigung des "besonderen Substrings" darin einfädeln kann? EDIT: a) Ich habe meinen letzten, annähernd funktionierden Code gepostet. Die davor wage ich wegen der Unübersichtlichkeit und Unzweckmäßigkeit erst gar nicht. bei obigem, werden zu 90% richtige Strings aussortiert, doch 10% sind unkorrekter Weise auch mit in Listbox3. b) Erg wird doch auf '' gesetzt? |
Re: StrList zeilenw. kopiern unter Berücksichtg. Schwarzen L
Erstens: Was passiert denn zur Zeit, wenn du den Code ausführst? Zweitens: Warum leerst du Listbox2 vor der Schleife? Dann ist die "Blacklist" doch weg..
[Edit] Außerdem müsstest du Erg beio jedem Durchlauf wieder auf '' setzen, sehe ich das richtig? Sonst ist ja immer das Ergebnis des vorherigen Durchlaufs noch mit drinnen. [Edit2]Okay, dann zur inneren Schleife. Es darf ja keins der Elemente der Blacklist vorkommen. Wenn nun abewr das erste der Blacklist nicht vorkommt, wird Erg direkt gesetzt. Kommt danach noch ein Wort aus der Blacklist vor, zum Beispiel das zweite, ist Erg immer noch gefüllt und wird somit in Listbox3 geschrieben. Ich hoffe ich habe dieses mal nicht übersehen... [Edit3]Ich hab das ganze mal bei mir ausprobiert und es mir erlaubt ein bisschen am Code zu werkeln :wink: Anstelle der Erg-Variable nutze ich eine Boolsche Veriable, die beinhaltet, ob der Eintrag "okay" ist oder nicht. Unabhängig davon wird vor der Schleife auf den Sonderstring überprüft (ich hoffe, der Sonderstring darf auch die Inhalte der Blacklist enthalten). Hier der Code:
Delphi-Quellcode:
Ich hoffe, das hilft. Bei mir ergab es die richtigen Ergebnisse. Abgesehen von dem Ausbessern des Logikfehlers (aus [Edit2]) habe ich auch die Groß- und Kleinschreibung durch das LowerCase ignoriert.
procedure TForm1.Button1Click(Sender: TObject);
var B: Boolean; j, k: Integer; begin listbox3.Clear; listbox4.Clear; for j := 0 to Listbox1.Items.Count - 1 do begin if Pos('reanimation', LowerCase(listbox1.items.Strings[J])) > 0 then begin Listbox4.Items.Add(listbox1.items.Strings[J]); end else begin B := True; for k := 0 to ListBox2.Items.Count - 1 do begin if Pos(LowerCase(ListBox2.Items[k]), LowerCase(Listbox1.Items[J])) > 0 then begin B := False; end; end; if B then begin Listbox3.items.Add(listbox1.items.Strings[J]); end; end; end;2 end; Gruß |
Re: StrList zeilenw. kopiern unter Berücksichtg. Schwarzen L
Ich denke ListBox4 und nicht Memo4 ... was macht also das Memo4 in deinem Code?
Wozu der String "Erg", wenn du ihn eh nur wie einen Boolean verwendest, in einer IF-Abfrage? Deine Abfrage "If Pos(..." sollte besser andersrum sein, denn du willst ja wissen ob mindestens einer der Strings enthalten ist. "Pos > 0" = mindestens Einer enthalten, da bei ersten auffinden reagiert wird "Pos < 1" aka "Pos = 0" = alle enthalten enthalten, da beim ersten nichtauffinden reagiert wird
Delphi-Quellcode:
noch ein bissl optimiert:
procedure TForm1.Button1Click(Sender: TObject);
var j, k: Integer; b: Boolean; begin ListBox3.Clear; ListBox4.Clear; for j := 0 to ListBox1.Items.Count - 1 do begin b := False; for k := 0 to ListBox2.Items.Count - 1 do if Pos(ListBox2.Items.Strings[k], ListBox1.Items.Strings[j]) > 0 then b := True; if b then ListBox3.Items.Add(ListBox1.Items.Strings[j]) else ListBox2.Items.Add(ListBox1.Items.Strings[j]); end;
Delphi-Quellcode:
PS: Müssen eigentlich die Strings aus LisbBox2 genau enthalten sein, also beide Stings übereinstimmem,
procedure TForm1.Button1Click(Sender: TObject);
var j, k: Integer; b: Boolean; s: String; begin ListBox3.Clear; ListBox4.Clear; for j := 0 to ListBox1.Items.Count - 1 do begin s := ListBox1.Items.Strings[j]; b := False; for k := 0 to ListBox2.Items.Count - 1 do if Pos(ListBox2.Items.Strings[k], s) > 0 then begin b := True; Break; // wozu weitersuchen, wenn schon gefunden end; if b then ListBox3.Items.Add(s) else ListBox2.Items.Add(s); end; oder können sie auch nur ein Teil des eines Strings aus der ListBox1 sein? PSS: Wie ist es mit Groß-/Kleinschreibung? |
Re: StrList zeilenw. kopiern unter Berücksichtg. Schwarzen L
Zitat:
Dann bleibt noch übrig: 1.) die Quell-Liste 2.) die Blacklist 3.) die Ergebnisliste Daraus wird dann diese Prozedur:
Delphi-Quellcode:
Dieser Code ist leicht verständlich und kaum noch zu vereinfachen.
procedure CopyList(srclist{Quell-Liste}, dstlist{Ergebnisliste}, blacklist:TStrings);
var s : string; i : integer; begin dstlist.clear; // Ergebnisliste löschen for i:=0 to srclist.count-1 do begin s := srclist[i]; if not IsBlacklisted(blacklist, s) then dstlist.Add(s); end; end; Die Funktion IsBlacklisted() prüft, ob irgendein String aus der Blacklist im String s enthalten ist. Ich denke das kriegst du jetzt selber hin. |
Re: StrList zeilenw. kopiern unter Berücksichtg. Schwarzen L
Zitat:
[ot] Gut, ich verstehe diese Funktion noch und erkenn recht schnell was sie macht, aber das macht wohl auch die jahrelange "Erfahrung" der Programmierung und vorallem unmassen fremder Codes, hier in der DP, zu lesen. :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz