AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi StrList zeilenw. kopiern unter Berücksichtg. Schwarzen Liste

StrList zeilenw. kopiern unter Berücksichtg. Schwarzen Liste

Ein Thema von Coder · begonnen am 10. Apr 2010 · letzter Beitrag vom 11. Apr 2010
Antwort Antwort
Benutzerbild von Coder
Coder

Registriert seit: 27. Feb 2004
Ort: Bochum
201 Beiträge
 
Delphi 3 Professional
 
#1

StrList zeilenw. kopiern unter Berücksichtg. Schwarzen Liste

  Alt 10. Apr 2010, 00:21
Hallo,

ich weiß nicht mehr weiter.
Seit heute Nachmittag hab ich allesmögliche probiert.
Ich blick schon fast durch meinen eigenen Code nicht mehr.
  • Ich möchte eine Stringliste {Listbox1} zeilenweise in eine andere {Listbox3} kopieren, (!) FALLS je Zeile - in einer Listbox2 festgehaltenen - Zeichenketten NICHT vorkommen.(Schwarze Liste)
  • lediglich wenn ein bestimmter Zeichenkettenstring zutrifft, soll die Zeile in Listbox4 kopiert werden (nicht in Listbox3 !!!)

Delphi-Quellcode:
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;
Den Aspekt, daß falls der bsondere Satz enthalten ist, hab ich noch gar nicht berückschtigt - weil schon der Rest nicht klappt.

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?
ICQ: 204141443
Delphi 3 Professional, Intel 2x 2,4Ghz, 3 GB-Graka, Sound-onBrd, --
außerdem D2S, D3Pro, D4S, D5S, D6S, D7S + Indy, Lazarus, VB5Std, VC++5Pro, Tasm4+5 - was braucht man mehr?
-
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: StrList zeilenw. kopiern unter Berücksichtg. Schwarzen L

  Alt 10. Apr 2010, 00:23
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 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:
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;
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.

Gruß
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.563 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: StrList zeilenw. kopiern unter Berücksichtg. Schwarzen L

  Alt 10. Apr 2010, 09:55
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:
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;
noch ein bissl optimiert:
Delphi-Quellcode:
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;
PS: Müssen eigentlich die Strings aus LisbBox2 genau enthalten sein, also beide Stings übereinstimmem,
oder können sie auch nur ein Teil des eines Strings aus der ListBox1 sein?

PSS: Wie ist es mit Groß-/Kleinschreibung?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

Re: StrList zeilenw. kopiern unter Berücksichtg. Schwarzen L

  Alt 10. Apr 2010, 17:19
Zitat von Coder:
Ich blick schon fast durch meinen eigenen Code nicht mehr.
Weil du das Problem falsch angehst. Reduziere so viel wie möglich.
Dann bleibt noch übrig:
1.) die Quell-Liste
2.) die Blacklist
3.) die Ergebnisliste
Daraus wird dann diese Prozedur:
Delphi-Quellcode:
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;
Dieser Code ist leicht verständlich und kaum noch zu vereinfachen.
Die Funktion IsBlacklisted() prüft, ob irgendein String aus der Blacklist im String s enthalten ist.
Ich denke das kriegst du jetzt selber hin.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.563 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: StrList zeilenw. kopiern unter Berücksichtg. Schwarzen L

  Alt 11. Apr 2010, 09:17
Zitat von sx2008:
Ich denke das kriegst du jetzt selber hin.
IsBlacklisted würde einfach nur der inneren Schleife "k" entsprechen, also der Variante mit dem Boolean.

[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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 02:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf