Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   String in Memo suchen (https://www.delphipraxis.net/202282-string-memo-suchen.html)

Kratos 16. Okt 2019 09:59

Delphi-Version: 10.2 Tokyo

String in Memo suchen
 
Hallo miteinander,

Programmaufbau:

Code:
Form5 -> Memo5(TMemo), Button5(TButton)
Form6 -> Memo6(TMemo), Button6(TButton)
Meine Idee:
Das Form6.Memo6 wird zeilenweise mit Strings gefüllt.
Durch Klick auf Button6 wird der Inhalt von Memo6 nach Memo5 übertragen.
---- Bis hierhin klappt alles.

Nun soll beim Klick auf Button5 das Memo5 nach einem String durchsucht werden, verbunden durch eine Abfrage. Heißt: Wenn der String gefunden wurde, dann führe etwas aus.
Code:
procedure TForm5.Button5Click(Sender: TObject);
begin
   if ((Pos('blablabla', Memo5.Lines)) := True) then
   begin
      TuEtwas;
   end;
end;
Folgender Fehler erscheint:
Delphi-Quellcode:
E2250 Es gibt keine überladene Version von 'Pos', die man mit diesen Argumenten aufrufen kann
Wenn ich die if-Zeile durch folgende ersetze, klappt es auch nicht:
Delphi-Quellcode:
if (Memo5.Lines.IndexOf('blablabla') = True) then
Fehler:
Delphi-Quellcode:
E2008 Inkompatible Typen

Was mache ich falsch? Hat jemand einen Denkanstoß für mich parat? :)

Gruß
Kratos

pesi 16. Okt 2019 10:06

AW: String in Memo suchen
 
Versuche es mal damit...

if Pos('blablabla', Memo5.text) <> 0 then

Der schöne Günther 16. Okt 2019 10:06

AW: String in Memo suchen
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
   if Memo1.Lines.Text.Contains('Derp') then
      ShowMessage('Derp');
end;

Klaus01 16. Okt 2019 10:06

AW: String in Memo suchen
 
Hallo,

pos liefert einen Index (Integer) zurück, keinen Boolean.
Memo5.Text sollte im ersten Beispiel funktionieren.

Grüße
Klaus

Kratos 16. Okt 2019 10:17

AW: String in Memo suchen
 
Vielen Dank Leute für die sauschnellen Antworten! Ihr seid super! :)

@Klaus01
Danke für deine Erklärung.
Ich hab die Verbesserung von @ pesi getestet. Funktioniert wunderbar!

Gruß
Kratos

EDIT: Hab eben auch noch das Bsp von @Der schöne Günther getestet. Klappt auch einwandfrei :*

Kratos 16. Okt 2019 15:56

AW: String in Memo suchen
 
Hi Leute,

ich nochmal. Ich hab eure Verbesserungsvorschläge umgesetzt und noch zwei Verzweigungen drumgebaut. Aber da taucht wieder ein Problem auf, welches ich nicht gelöst bekomme.

Programmaufbau:
Code:
Form6 -> ListBox6, Memo6
Form7 ...
Delphi-Quellcode:
ListBox6
und
Delphi-Quellcode:
Memo6
sind nebeneinander platziert und beide sind sichtbar. In
Delphi-Quellcode:
ListBox6
sind 6 Items abgespeichert. Per Doppelklick auf ein Item soll dieses in
Delphi-Quellcode:
Memo6
geschrieben werden.

Meine Idee:

Es soll jedes mal überprüft werden, ob das doppelgeklickte Item aus
Delphi-Quellcode:
ListBox6
bereits in
Delphi-Quellcode:
Memo6
vorhanden ist.

Wenn Nein, soll es in
Delphi-Quellcode:
 Memo6
geschrieben werden.
Wenn Ja, soll es NICHT in
Delphi-Quellcode:
Memo6
geschrieben werden.
Wird das 5. Item doppelgeklickt, geht Form7 auf (das klappt).

Code:
procedure TForm6.ListBox6DblClick(Sender: TObject);
var
  i: Integer;
begin
  if (ListBox6.ItemIndex) = 5 then  
    begin
      with TForm7.Create(Self) do
        try
          ShowModal;
      finally
          Free;
      end;
    end
  else if Pos(ListBox6.Items.Text, Memo6.Lines.Text) <> 0 then
    begin
       Memo6.Lines.Add(ListBox6.Items[ListBox6.ItemIndex] + #10#13);
    end
    else
      begin
        for i := 0 to ListBox6.Items.Count - 1 do
         if (Memo6.Lines.Text.IndexOf(ListBox6.Items[i]) < 0) then
         begin
            Memo6.Lines.Delete(i);    
         end;
   
      end;

Ich kann mir gut vorstellen, dass diese Zeile falsch ist:
Delphi-Quellcode:
 else if Pos(ListBox6.Items.Text, Memo6.Lines.Text) <> 0 then
Es kommt keine Fehlermeldung. Jedoch kann man die Items aus ListBox6 doppelklicken wie man will, es passiert nichts.
Könnt ihr mir helfen auf einen Lösungsansatz zu kommen, bitte? :)

Dalai 16. Okt 2019 16:02

AW: String in Memo suchen
 
Du willst nicht den kompletten Inhalt der Listbox im Memo suchen sondern nur den markierten String. So müsste es tun (ungetestet):
Delphi-Quellcode:
else if Pos(ListBox6.Items[ListBox6.ItemIndex], Memo6.Lines.Text) <> 0 then begin
...
end ...
PS: Bitte benenne deine Controls sauber! Keiner weiß, was ListBox6 und Memo6 ist, und selbst du wirst das in ein paar Wochen nicht mehr wissen.

Grüße
Dalai

Michael II 16. Okt 2019 16:34

AW: String in Memo suchen
 
So könntest du checken, ob das Element aus Liste bereits im Memo vorhanden ist:

Delphi-Quellcode:
 lbel := Listbox1.Items[ListBox1.ItemIndex];

 if pos( #13#10 + lbel + #13#10, #13#10 + memo1.Text ) = 0 then
   Memo1.Lines.Add( lbel );

Bei Dalais Lösung würde zum Beispiel das Element "Anna" nicht zu Memo hinzugefügt werden, wenn "Annabelle" bereits im Memo vorhanden wäre.

Eventuell lohnt sich für dich auch ein Blick auf TStringList und die Eigenschaft Duplicates.

Dalai 16. Okt 2019 17:48

AW: String in Memo suchen
 
Na dann lieber gleich ein Memo.Lines.IndexOf, wie es schon ein paar Zeilen weiter unten (in der for-Schleife) steht. Verstehe sowieso nicht, warum einmal mit Pos und einmal mit IndexOf gesucht/verglichen wird.

Delphi-Quellcode:
if (Memo6.Lines.IndexOf(ListBox6.Items[ListBox6.ItemIndex]) < 0) then
...
Je nachdem, ob case-sensitiv oder -insensitiv gesucht werden soll, kann man ja noch ein UpperCase/LowerCase mit reinbringen.

Grüße
Dalai

Michael II 16. Okt 2019 18:05

AW: String in Memo suchen
 
Ja klar Dalai - mach ich ja sonst auch so... es wäre gut, wenn man einer Meldung ein ttl (zum Beispiel 0) mitgeben könnte :).

Kratos 17. Okt 2019 07:24

AW: String in Memo suchen
 
Vielen Dank für die vielen raschen Antworten!

@Dalai
Die Controls habe ich extra nur im Forum umbenannt. Ich dachte, das wäre übersichtlicher.
Desweiteren steh ich noch am Anfang von delphi und weiß noch nicht, wann ich was einsetzen kann.

Ich hab noch
Delphi-Quellcode:
.Text
geaddet, dann hat es wunderbar funktioniert:
Code:
if (Memo6.Lines.Text.IndexOf(ListBox6.Items[ListBox6.ItemIndex]) < 0) then
@Michael II
Was bedeutet ttl? :)

Rolf Frei 17. Okt 2019 14:01

AW: String in Memo suchen
 
Du machst da ein IndexOf auf dem String. Lines.Text ist ein String. Das entspricht einem Pos(), was du eigentlich nicht haben willst, da dir sonst beim Wert "Anna" auch "Susanna", "Annabelle" etc. als Treffer geliefert werden. Du musst Memo6.Lines.IndexOf verwenden. So wird die ganze Zeile im Memo6 verglichen.

Kratos 17. Okt 2019 14:55

AW: String in Memo suchen
 
@Rolf Frei
Ja, du hast recht. Ich war zu vorschnell mit meiner Erfolgsnachricht.
Komischerweise hat es beim ersten Programmstart genau so funktioniert wie es sollte. Danach aber nicht mehr.
Jetzt läuft es aber.

----------------------------------------------------------------

Ich hab inzwischen schon wieder ein neues Problem :D
Ich hab mein Programm weiter ausgebaut.
Und zwar:

Programmaufbau:
Code:
Form6 -> ListBox6A, ListBox6B
Form7 -> Edit7, Button7
Bisher:
Per Doppelklick auf ein Item in ListBox6A, wird dieses in ListBox6B geschrieben. Wenn ein in ListBox6A geklicktes Item bereits in ListBox6B vorhanden ist, wird es in ListBox6B gar nicht erst aufgenommen.
Wird in ListBox6A das 6. Item doppelgeklickt, erscheint Form7.
---- Bis hierhin klappt alles.

Nun soll in Edit7 ein String eingegeben werden. Button7 wird gedrückt. Der String aus Edit7 soll als neues Item der ListBox6B erscheinen.
-> Und genau das letzte klappt nicht.

Hier mein Versuch:
Code:
procedure TForm7.Button7Click(Sender: TObject);
begin
   Form6.ListBox6B.Items.Add(Edit7.Text);
   Close;
end;
Wo ist mein Denkfehler?

Gruß
Kratos

Dalai 17. Okt 2019 15:10

AW: String in Memo suchen
 
Bist du sicher, dass der String nicht hinzugefügt wird? Hast du mal einen Breakpoint auf die Button7Click-Methode gesetzt und mit Einzelschritt durchgesteppt?

Grüße
Dalai

Kratos 17. Okt 2019 15:32

AW: String in Memo suchen
 
Nein. Ich programmier noch nicht lange.
Den Debugger hab ich bisher gar nicht genutzt.

Ich hab kurz die OnlineHilfe überflogen. Dort scheint es aber 4 Arten von Breakpoints zu geben.
Gibt es eine Kurzanleitung irgendwo, wie man per Einzelschritt durch den Code geht? :)

EDIT:
ich glaube, ich hab eine gute Anleitung gefunden.
Ich meld mich nochmal, wenn ich das Debuggen verstanden habe.
Durch RL-Hobbys wird das wahrscheinlich morgen sein :)

Dennis07 17. Okt 2019 18:59

AW: String in Memo suchen
 
Alternativ, nur der Vollständigkeit halber, ein "dirty way" falls "Contains" nicht in frage kommt (solltest du nicht verwenden):

Delphi-Quellcode:
if Boolean(Pos('bla', Memo1.Text)) then ...

Kratos 18. Okt 2019 13:26

AW: String in Memo suchen
 
So Leute,

ich melde mich endlich wieder.
Zu allererst @Dennis07, danke für den Tipp!

Zu meinem Problem. Anfangs beinhaltete mein Programm 3 Forms ( Form5,6,7). Ich hab das jetzt so umgeschrieben, dass Form6 rausfällt. Und nun klappt das auch so wie ich will.
Zu Beginn wollte ich von Form7 auf Form6 auf Form5 schreiben. Nun schreibe ich von Form7 gleich auf Form5.
Vielleicht kam deswegen immer ein Fehler.

Over all, danke an alle für eure Unterstützung! :)

Dennis07 18. Okt 2019 16:04

AW: String in Memo suchen
 
Zitat:

Zitat von Kratos (Beitrag 1449907)
Zu allererst @Dennis07, danke für den Tipp!

Wie gesagt, bitte nicht verwenden außer du musst es ;)
Am besten
Delphi-Quellcode:
Contains
nahmen.

Rolf Frei 18. Okt 2019 16:14

AW: String in Memo suchen
 
Nichts gegen Dennis 07, aber vergiss bitte den Tipp am besten schnell wieder. Das ist sehr unsauberer Code und sollte so nicht verwendet werden. Er macht da einen Boolean Typecast auf einen Integer und das ist keine gute Idee. Der Code funktioniert zwar aktuell so, aber sobald da mal die Imlementation von Boolean durch Emba geändert wird, kann das zu sehr unschönen und kaum zu findenden Bugs führen.

Um zu Checken ob Pos was findet, solltest du den Rückgabewert auf grösser 0 abfragen. Aber für deine Problematik ist Pos eh nicht das Richtige.

Delphi-Quellcode:
if Pos('bla', Memo1.Text) > 0 then ... gefunden

p80286 18. Okt 2019 18:17

AW: String in Memo suchen
 
Nun "pos" oder einer der vielen Verwandten.....

Wenn es boolean sein muß, dann vllt

Delphi-Quellcode:
found:=not(pos('blub',mytext)=0);

Gruß
K-H

Michael II 18. Okt 2019 21:53

AW: String in Memo suchen
 
Die vielen pos( 'bla', …) Vorschläge liefern doch praktisch alle keine Lösung für das gegebene Problem (?)

pos( 'bla', ...) ist > 0, wenn in der Liste bereits "blaumann" oder "ablativ" oder noch so vieles andere drin steht. "bla" würde also nicht aufgenommen, obschon neu.

p80286 19. Okt 2019 13:29

AW: String in Memo suchen
 
Wie kommst Du auf die Idee?
Natürlich ist "bla" in "blanchieren" enthalten. Wenn Du "bla" als eigenes Wort suchen willst mußt entweder eine geeignete Funktion nutzen oder vor und hinter "bla" die entsprechenden Zeichen (blank,satzzeichen,Tab,Zeilenende...) suchen.

Gruß
K-H

Michael II 19. Okt 2019 20:53

AW: String in Memo suchen
 
Ja hast Recht - ich habe die Aufgabe falsch verstanden. :oops:

p80286 20. Okt 2019 17:39

AW: String in Memo suchen
 
Kein Grund für :oops:
Es wird ja oft genug unscharf formuliert. Manchmal bewußt, manchmal unbewußt. Wenn Dein Hinweis überflüssig ist, kann man ihn ja ignorieren, ansonsten ist eshalt ein Anstoß die Fragestellung zu überdenken.

Gruß
K-H

Kratos 21. Okt 2019 10:11

AW: String in Memo suchen
 
Moin,

es tut mir leid, wenn ich meine Fragestellung unscharf formuliert habe. Das war nicht beabsichtigt!
Vielen Dank für eure Erklärungen :)

VG
Kratos


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz