![]() |
Wort in einem String suchen
moinmoin,
also ich möchte ein Wort aus einem String suchen...ok das wär nicht schwer wenn die wörter da vor nicht variieren würden...also sagen wir mal so bla1 bla2 bla3 bla4 bla5 sagen wir mal ich würde prüfen ob bla4 und bla 5 existieren... dan würd ichs so machen : if copy(string, 16, 9) then ... da aber die wörter bla 1,2 und 3 verschieden lang sei können, weiss ich nicht wie ich an die beiden letzteren rankommen kann hoffe ihr versteht was ich meine gruss mario |
vielleicht hilft dir die Funktion
pos()
Delphi-Quellcode:
if (pos(bla5,s)>0) and (pos(bla6,s)>0) then
begin ... end; Zitat:
|
danke das hat mir schonmal weitergeholfen :)
hab dazu noch ne frage und zwar, wie kann ich das letzte Wort eines Strings rauskopieren... das letzte wort kann beliebig lang sein, und ich weiss nicht wie der string überhaupt aussieht... :ChanServ!services@euirc.net MODE #tiberiansun +a HIERDERNICK ^^^^ da möcht ich das letzte rauskopieren, also den nick. kann mir nur vorstellen das ich das machen kann, indem ich angebe das der dick nach 4 leertasten anfängt (wie das geht weiss ich leider nicht). wo der nick allerdings aufhört weiss ich auch nicht, da er ja beliebig lang sein kann kann mir das auch noch jemand erklären? gruss mario |
Les dir noch mal durch, was dir hier freundlicherweise aus der Hilfe zitiert wurde. Insbesondere der Letzte Absatz sollte dich interessieren.
(Die Länge eines Strimgs bekommst du mit length.) |
Vorrausgesetzt es sind keine Leerzeichen erlaubt:
such das letzte Leerzeichen (von hintersten Zeichen aus jedes Zeichen testen), und kopiere alles dahinter mit copy(). |
@Luckie
wenn ich den ganzen string zähle, dann weiss ich aber trotzdem nicht wie lang das letzte wort davon ist @Neilor: wie kann ich das denn machen das alles ab dem letzten Space kopiert wird? gruss :) |
Lass dir was einfallen.
Z.B. mach dir ne kleine Funktion die mit downto arbeitet und nach einem leerzeichen sucht ... |
jo wenn ich wüsste wies geht würd ich ja hier nichtposten bzw fragen
ich weiss das es einfach ist, für mich aber nicht gruss^^ |
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const test: string = 'hallo du!'; var i: integer; begin for i := length(test) downto 1 do begin if test[i] = ' ' then begin Button1.Caption := Copy(test,i,length(test)-i+1); break; end; end; end; |
Moin Zusammen,
wobei es für diese Suche bereits eine Funktion gibt, nämlich LastDelimiter. Mit der sähe das dann so aus:
Delphi-Quellcode:
Wenn auch andere Zeichen als Trennzeichen gültig sein sollen, kann man statt des Blanks auch eine ganze Liste von Zeichen angeben.
procedure TfrmMAIN.Button1Click(Sender: TObject);
const test: string = 'hallo du!'; begin Button1.Caption := copy(test,LastDelimiter(' ',test)+1,length(test)); end; |
genau das was ich brauche, danke an alle :)
|
Delphi-Quellcode:
das 1. funzt wunderbar, aber das:
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var s: string; i: integer; begin acontent := copy(acontent,LastDelimiter(' ', acontent)+1, length(acontent)); if POS('+a', acontent) > 0 then begin for i := 0 to listbox1.Items.IndexOf(acontent) do begin sl1.AddObject(acontent, image10.Picture.Bitmap); sl2.Delete(i); listbox1.Clear; listbox1.Items.AddStrings(sl1); listbox1.Items.AddStrings(sl2); end; end; if POS('-a', acontent) > 0 then memo1.Lines.Add('jo'); end; "if POS('-a', acontent) > 0 then memo1.Lines.Add('jo');" nicht, obwohl bei einem event "-a" vorkommt, wenn ich den ganzen oberen teil lösche und nur das "if POS('-a', acontent) > 0 then memo1.Lines.Add('jo');" nehme gehts. Ist da was falsch dran? btw: sl1 und sl2 sind zwei globale Stringlists edit: color geht wohl nicht in nem delphiquote... lass es aber drin damit man weiss was gemeint is gruss |
Moin Silent,
nach dieser Zeile
Delphi-Quellcode:
enthält acontent nur noch das, was nach dem letzten Blank in acontent gestanden hat, als es übergeben wurde.
acontent := copy(acontent,LastDelimiter(' ', acontent)+1, length(acontent));
Lass Dir doch einfach mal nach der o.g. Zeile mit ShowMessage ausgeben, was noch in acontent steht. |
hallo christian, danke für die antwort !
hab das geändert in:
Delphi-Quellcode:
geht aber noch immer nicht...also is bisschen schwer zu sehen was das sein soll....also es geht darum das ich beim dem mode "+a"(Admin)
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var Mode, Nick: string; Counter: integer; begin Mode := Copy(acontent, 14, 2); Nick := Copy(acontent, LastDelimiter(' ' , acontent)+1, length(acontent)); if Mode = '+a' then begin for Counter := 0 to Listbox1.Items.IndexOf(Nick) do begin sl2.Delete(Counter); sl1.AddObject(Nick, image10.Picture.Bitmap); listbox1.Clear; listbox1.Items.AddStrings(sl1); listbox1.Items.AddStrings(sl2); end; end; if Mode = '-a' then begin for Counter := 0 to listbox1.Items.IndexOf(Nick) do begin sl1.Delete(Counter); sl2.AddObject(Nick, image11.Picture.Bitmap); listbox1.Clear; listbox1.Items.AddStrings(sl1); listbox1.Items.AddStrings(sl2); end; end; end; den Nick aus der TStringlist2(Reg User) in die TStringList1(Admins) tue und von da aus in die Stringlist. Die Admins haben ein object(kleines bildchen) vor dem nick wenn ich aber "-a" mache passiert irgendwie gar nichtsalso user hat immer noch das object vor dem nick und is auch noch immer in StringList1. "for Counter := 0 to listbox1.Items.IndexOf(Nick) do" müsste es hinten vielleicht heissen IndexOfObject? (habs schon probiert geht aber auch nicht. Reicht es überhaupt wenn ich den String aus der listbox lösche oder muss man auch das object davor extra löschen? gruss mario |
Moin Mario,
was mir nicht so ganz klar ist: Warum löscht Du alles bis zu dem Nick, löscht dann die gesamte ListBox, und fügst wieder beide Stringlisten hinzu? Das geht ganz erheblich an die Resourcen. Warum nicht:
Delphi-Quellcode:
Was die Objekte angeht:
// Beispiel
if sl2.IndexOf(Nick) > -1 then begin sl2.Delete(sl2.IndexOf(Nick)); sl1.AddObject(Nick,image10.Picture.Bitmap); end; Die werden bei Delete mit aus der Liste entfernt, und bei AddStrings auch mitgenommen. |
hallo christian,
ich benutze 2 stringlists (sorted) und füge sie in die listbox ein, die erste stringlist1(die admins) dann stringlist2(die regs). wenn ich alle direkt in die listbox packen würde wären admins und regs verteilt, z.b wär ein admin mit "Z" ganz unten und da ich alles von den strnglists nehme muss ich ja die listbox löschen oder nicht gibts da n anderen weg? Ich könnte das so machen wie in deinem beispiel aber dann müsst ich das auch mit der stringlist machen, damit sie auch "aktuell" ist. =) falls du das meinst mit nick löschen: "Nick := Copy(acontent, LastDelimiter(' ' , acontent)+1, length(acontent));" jo ich muss ja den nick aus dem string finden, der ist ganz am ende als letztes wort gruss mario ^^ |
versuchs mit stringreplace()
|
thx edancer werde das mal versuchen, zuvor noch eins...ich erhalte immer einen fehler:
![]() der code an dem ganzen ist:
Delphi-Quellcode:
woher kommt dann der fehler?
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var Mode, Nick: string; Counter: integer; bmp: TBitmap; begin Mode := Copy(acontent, 14, 2); // Nick aus "acontent" auslesen Nick := Copy(acontent, LastDelimiter(' ' , acontent)+1, length(acontent)); // Mode aus "acontent" auslesen if Mode = '+a' then // Wenn mode "+a" ist begin for Counter := 0 to Listbox1.Items.IndexOf(Nick) do begin sl2.Delete(Counter); // Stringlist(sl2) löschen sl1.AddObject(Nick, image10.Picture.Bitmap); // String "Nick" mit Bild zur Stringlist(sl1) hinzufügen listbox1.Clear; // Listbox1 Strings löschen listbox1.Items.AddStrings(sl1); // Strings aus Stringlist(sl1) der Listbox1 hinzufügen listbox1.Items.AddStrings(sl2); // Strings aus Stringlist(sl2) der Listbox1 hinzufügen end; end; if Mode = '-a' then // Wenn mode "-a" ist begin for Counter := 0 to listbox1.Items.IndexOf(Nick) do begin sl1.Delete(Counter); // Stringlist(sl1) löschen sl2.AddObject(Nick, image11.Picture.Bitmap); // String "Nick" mit Bild zur Stringlist(sl2) hinzufügen listbox1.Clear; // Listbox1 Strings löschen listbox1.Items.AddStrings(sl1); // Strings aus Stringlist(sl1) der Listbox1 hinzufügen listbox1.Items.AddStrings(sl2); // Strings aus Stringlist(sl2) der Listbox1 hinzufügen end; end; end; gruss silent |
Änder mal beide
Delphi-Quellcode:
in
for Counter := 0 to Listbox1.Items.IndexOf(Nick)
Delphi-Quellcode:
Das könnte eventuell der fehler sein.
for Counter := 0 to Listbox1.Items.IndexOf(Nick)-1
|
Bzw. kommt mir dein Code komisch vor, speziell das hier:
Delphi-Quellcode:
Sollte das listbox1.clear nicht vor der for-Schleife stehen?
for Counter := 0 to Listbox1.Items.IndexOf(Nick) do
begin sl2.Delete(Counter); // Stringlist(sl2) löschen sl1.AddObject(Nick, image10.Picture.Bitmap); // String "Nick" mit Bild zur Stringlist(sl1) hinzufügen listbox1.Clear; // Listbox1 Strings löschen listbox1.Items.AddStrings(sl1); // Strings aus Stringlist(sl1) der Listbox1 hinzufügen listbox1.Items.AddStrings(sl2); // Strings aus Stringlist(sl2) der Listbox1 hinzufügen end; Ich versteh nicht so ganz was du da machst. Du löschst ListBox1, fügst ein paar Strings hinzu, löschst Listbox1, fügst ein paar Strings hinzu, löschst Listbox1... Könntest du das mal genauer erklären? |
also es geht um ein irc client, bei dem raw event "#chan +mode nick"(acontent) nehm ich den mode(um zu sehen welcher mode es ist, z.B wie hier "+a") und den nick(für die listbox) raus
Es gibt 2 Stringlists, in dem einen sind die Admins, indem anderen die regulären Nicks. (btw: ich benutze 2 stringlists, weil wenn ich nur die listbox nehmen würde und auf sorted = true, wärendie nicks zwar nach alphabet geordnet, aber nicht nach admins dann reg nicks) Sagen wir mal ich setze irgendeinen Nick "+a" dann muss ich ja den Nick auf den sich das +a bezieht aus der Stringlist(sl2(reguläre Nicks)) entfernen, in die andere Stringlist(sl1(admins)) hinzufügen. Dann lösche ich die Listbox und füge erst die Strings aus Stringlist1 zur Listbox hinzu, dann aus Stringlist2. Das gleiche für -a weisst wie ich das meine? wenns einen leichteren weg gibt bitte sagen :) danke für die antwort janjan |
Dein Fehler müsste da liegen:
Delphi-Quellcode:
Du willst doch die Position von Nick in sl1 oder sl2 wissen und nicht in Listbox1.
for Counter := 0 to listbox1.Items.IndexOf(Nick) do
Ich hätte das ohne Schleife gelöst (bin mir aber nicht sicher ob das so klappt):
Delphi-Quellcode:
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var Mode, Nick: string; Counter: integer; bmp: TBitmap; begin Mode := Copy(acontent, 14, 2); // Nick aus "acontent" auslesen Nick := Copy(acontent, LastDelimiter(' ' , acontent)+1, length(acontent)); // Mode aus "acontent" auslesen if Mode = '+a' then // Wenn mode "+a" ist begin sl2.Delete(s12.Items.IndexOf(Nick)); sl1.AddObject(Nick, image10.Picture.Bitmap); ListBox1.Clear; listbox1.Items.AddStrings(sl1); listbox1.Items.AddStrings(sl2); end; if Mode = '-a' then // Wenn mode "-a" ist begin sl1.Delete(s11.Items.IndexOf(Nick)); sl2.AddObject(Nick, image10.Picture.Bitmap); ListBox1.Clear; listbox1.Items.AddStrings(sl1); listbox1.Items.AddStrings(sl2); end; end; |
der code funzt soweit, aber beim "deAdminen" passiert nichts, also der string bleibt in der listbox, das prob hat ich auch mit meinem "code"
wieso wird das nicht gelöscht? gruss =) btw: thx für den code |
Kuck mal welcher Wert in der Titelleiste für s11.Items.IndexOf(Nick) und für Nick steht. Ich vermute mal das es da Probleme gibt. (Form1 musste noch an dein Formnamen anpassen)
Delphi-Quellcode:
if Mode = '-a' then // Wenn mode "-a" ist begin Form1.Caption:='Nick: '+Nick+' Index of Nick: '+inttostr(s11.Items.IndexOf(Nick)); sl1.Delete(s11.Items.IndexOf(Nick)); sl2.AddObject(Nick, image10.Picture.Bitmap); ListBox1.Clear; listbox1.Items.AddStrings(sl1); listbox1.Items.AddStrings(sl2); end; |
hab das ins memo einfügen lassen, da ich keine titelleiste hab und da kam:
"Nick: tsc_user Index of Nick: 1" ^^^^ ist das richtig? ;) gruss mario |
Komisch, das sollte eigentlich richtig sein. Ich mach jetzt Feierabend und kuck mir das nachher nochmal an...
|
also so:
Delphi-Quellcode:
funktionierts jetzt :)
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var Mode, Nick: string; counter: integer; begin Mode := Copy(acontent, 14, 2); // Nick aus "acontent" auslesen Nick := Copy(acontent, LastDelimiter(' ' , acontent)+1, length(acontent)); // Mode aus "acontent" auslesen if Mode = '+a' then // Wenn mode "+a" ist begin sl2.Delete(sl2.IndexOf(Nick)); sl1.AddObject(Nick, image10.Picture.Bitmap); ListBox1.Clear; listbox1.Items.AddStrings(sl1); listbox1.Items.AddStrings(sl2); end; if Mode = '-a' then // Wenn mode "-a" ist begin for Counter := 0 to sl1.Count-1 do begin if sl1.Strings[Counter] = Nick then begin sl1.Delete(Counter); sl2.AddObject(Nick, image11.Picture.Bitmap); Listbox1.Clear; Listbox1.Items.AddStrings(sl1); Listbox1.Items.AddStrings(sl2); end; end; end; end; danke an alle ;) |
allerdings wenn ich das für das OnPart event nehme...
Delphi-Quellcode:
steht da immer wenn ein regulärer nick(sl2) leavt "ListenIndex überschreitet das Maximum(1)" << was heisst das?
procedure TForm1.IdIRC1Part(Sender: TObject; AUser: TIdIRCUser;
AChannel: TIdIRCChannel); var Counter: integer; begin for Counter := 0 to sl1.Count-1 do begin if sl1.Strings[Counter] = auser.Nick then begin sl1.Delete(Counter); Listbox1.Clear; if sl1.Count > 0 then begin Listbox1.Items.AddStrings(sl1); end; if sl2.Count > 0 then begin Listbox1.Items.AddStrings(sl2); end; end; end; for Counter := 0 to sl2.Count-1 do begin if sl2.Strings[Counter] = auser.Nick then begin sl2.Delete(Counter); Listbox1.Clear; if sl1.Count > 0 then begin Listbox1.Items.AddStrings(sl1); end; if sl2.Count > 0 then begin Listbox1.Items.AddStrings(sl2); end; end; end; end; gruss mario |
Du müsstest die Suche mit einer while Schleife machen, nicht mit einer for Schleife. Angenommen deine Liste enthält 6 Einträge, dann läuft die Schleife von 0 bis 5. Wenn du jetzt einen Eintrag löschst und dann versuchst auf eintrag Nummer 5 zuzugreifen, dann überschreitest du das Maximum der Liste.
Oder probiers mal so (mir ist immer noch nicht so ganz klar warum du alles in eine Schleife setzt, das ListBox1.Clear und den Rest musst du nur einmal machen):
Delphi-Quellcode:
(alle Vorschläge wie immer ohne Gewähr auf völlige Richtigkeit)
procedure TForm1.IdIRC1Part(Sender: TObject; AUser: TIdIRCUser;
AChannel: TIdIRCChannel); var Counter: integer; Gefunden: Boolean; begin Gefunden:=False; for Counter := 0 to sl1.Count-1 do if sl1.Strings[Counter] = auser.Nick then begin Gefunden:=True; break; end; if Gefunden then begin sl1.Delete(Counter); Listbox1.Clear; if sl1.Count > 0 then Listbox1.Items.AddStrings(sl1); if sl2.Count > 0 then Listbox1.Items.AddStrings(sl2); end; // if Gefunden Gefunden:=False; for Counter := 0 to sl2.Count-1 do if sl2.Strings[Counter] = auser.Nick then begin Gefunden:=True; break end; If Gefunden then begin sl2.Delete(Counter); Listbox1.Clear; if sl1.Count > 0 then Listbox1.Items.AddStrings(sl1); if sl2.Count > 0 then Listbox1.Items.AddStrings(sl2); end; // if Gefunden end; |
hoi, danke danke jetzt klappt das alles :)
könntest du mir noch sagen wie das mit der booleschen variable genau funzt(nur um zu verstehen wie es geht)...z.b bei:
Delphi-Quellcode:
ich hätte (wenn ich keine hilfe gehabt hätte, so geschrieben "if Gefunden = true then" wie funzt das da genau?
if Gefunden then
gruss mario :) |
Ganz einfach:
Delphi-Quellcode:
Ausdruck steht hier für einen beliebigen Ausdruck oder Formulierung die entweder True oder False sein kann, z.b. 'y=3' oder 'a>4' oder '((a=b) and (b>g))=true'.
if Ausdruck then
Die Variable 'Gefunden' ist Variable vom Typ Boolean und kann deswegen die Werte 'true' und 'false' annehmen. Dieser Variablentyp wird von Delphi als Ausdruck behandelt, daher ist es egal, ob du schreibst
Delphi-Quellcode:
oder
if Gefunden = true then
Delphi-Quellcode:
eigenbtlich ist es egal wie du das machst, ich persönlich finde die zweite Möglichkeit besser, da dadurch dein Code lesbarer wird.
if Gefunden then
Angenommen du hast eine Variable mit dem Namen Connected die anzeigt ob du mit dem ComPort verbunden bist oder nicht, dann würdest du schreiben
Delphi-Quellcode:
ich würd das aber schreiben als
if Connected = False then
Delphi-Quellcode:
Das find ich einfacher zu verstehen, man muss nicht erst überlegen wie der Ausdruck gemeint ist.
if not Connected then
|
ok danke :)
hab mich nämlich gewundert, da man ja bei "if Gefunden then" nicht weiss ob true oder false gemeint ist gruss :) |
if gefunden then
ist´das gleiceh wie if gefunden = true then |
und wenn die variable "false" ist?
ergibt "if Gefunden then" dann trotzdem true? |
Also:
Delphi-Quellcode:
Das begin..end wird ausgeführt wenn Ausdruck True ist.
if Ausdruck then
begin end; Angenommen das bei
Delphi-Quellcode:
Gefunden den Wert False hat, dann sieht das für Delphi ungefähr so aus:
if Gefunden then
Delphi-Quellcode:
deswegen wird das begin..end nicht ausgeführt.
if False then
begin end; Wenn du sowas hier hast:
Delphi-Quellcode:
kannste das vereinfachen nach
if ((3>2) and (3=4))= true then
Delphi-Quellcode:
und das kann man nach
if (true and false)= true then
Delphi-Quellcode:
vereinfachen, danach kommt
if false= true then
Delphi-Quellcode:
Damit sieht man das die if-Bedingung nicht ausgeführt wird.
if false then
|
@Moderator:
bitte löschen |
danke für die ansführliche beschreibung
|
noch eines
if gefunden then ist schneller als if gefunden = true then |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:28 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