![]() |
Teilstring suchen
Hallo Leute... ich will lieber nicht wissen der wievielte Thread das zu diesem Thema ist :oops: , und ich hab mir auch einige dazu durchgelesen, aber trotzdem tut das Programm nicht das, was es eigentlich soll.
Also es geht um ein TList, die Autoren und die Bücher, die diese geschrieben haben, verwalten soll. Man gibt sozusagen Autor und Titel in zwei Felder ein und dann erscheinen die in der Liste. Nun will ich aber den Autor suchen können... es erscheint auch keine Fehlemeldung aber, wenn ich einen Autor suche, erscheint gleich die Nachricht'Der Autor konnte nicht gefunden werden.', obwohl der Autor in der Liste steht. Vielleicht ist ja jemand so nett und kann sich mal anschauen, was ich da so (alles) falsch gemacht habe. Hoffe ich hab alle nötigen Infos da unten stehen... wäre echt hilfreich!!! thx
Delphi-Quellcode:
procedure TForm1.SuchenButtonClick(Sender: Tobject);
var gefunden,j,n,suchbegriff,zeile:string; i,max,separator:integer; begin autorfeld.Text:=suchbegriff; i:=0; gefunden:=n; max:=Listenfenster.Items.Count-1; repeat Listenfenster.Items.Strings[i]; zeile:=Listenfenster.Items.Strings[i]; separator:=pos(#45,zeile); autorfeld.text:=copy(zeile,1,separator-1); if(autorfeld.text=suchbegriff) then begin i:=Listenfenster.ItemIndex; gefunden:=j; end else begin i:=+1; end; until (gefunden=j)or (i>max); if (gefunden=n) then begin ShowMessage('Der Autor konnte nicht gefunden werden.'); end; end; |
Re: Teilstring suchen
Hallo und Willkommen in der DP :dp:
wie sieht Dein Autorfeld denn aus? Ist das ein Record oder nur ein String? Außerdem hast Du einige Fehler im Code (i := +1 z.B.). |
Re: Teilstring suchen
Um noch ein paar Fehler mehr aufzulisten:
Delphi-Quellcode:
Ist wohl andersrum gemeint.
autorfeld.Text:=suchbegriff;
Delphi-Quellcode:
Du hast n nichts zugewiesen, was soll das bringen?
gefunden:=n;
Delphi-Quellcode:
Da steht einzeln in Zeile 10, was soll das bringen?
Listenfenster.Items.Strings[i];
Delphi-Quellcode:
Sollte wohl:
i:=+1;
Delphi-Quellcode:
heißen.
i := i + 1;
// oder Inc(i); Hier mal ein kleiner Vorschlag:
Delphi-Quellcode:
var
Search, Author, ItemStr: String; I: Integer; Found: Boolean; begin Search := Edit1.Text; Found := false; for I := 0 to ListBox1.Count - 1 do begin ItemStr := ListBox1.Items[I]; Author := Copy(ItemStr, 1, Pos(#45, ItemStr)); if Pos(Search, Author) > 0 then begin ShowMessage('Autor: "' + Author + '" gefunden' + #13#10 + 'Index: ' + IntToStr(I)); Found := true; end; end; if (not (Found)) then ShowMessage('Sorry, kein Autor gefunden'); end; |
Re: Teilstring suchen
Für gefunden würde sich eher eine Booleanvariable eignen.
Delphi-Quellcode:
procedure TForm1.SuchenButtonClick(Sender: Tobject);
var suchbegriff,zeile: string; i,max,separator:integer; gefunden: Boolean; sl: TStrings; begin sl := TStringList.Create; sl.Delimiter = #45; suchbegriff := autorfeld.Text; i:=0; gefunden:=False; max:=Listenfenster.Items.Count-1; while (i < max) and not gefunden do begin sl.DelimitedText := Listenfenster.Items.Strings[i]; autorfeld.text:= sl.Strings[1]; if(autorfeld.text=suchbegriff) then gefunden:= True else i:=+1; end; if not gefunden) then begin ShowMessage('Der Autor konnte nicht gefunden werden.'); end; end; |
Re: Teilstring suchen
öhm... weißt du überhaupt was du da machst ?! :zwinker:
versuchs mal so:
Delphi-Quellcode:
procedure TForm1.SuchenButtonClick(Sender: Tobject);
var I, Index: Integer; begin Index := -1; if Listenfenster.Items.Count > 0 then for I := 0 to Pred(Listenfenster.Items.Count) do If Pos(autorfeld.text, Listenfenster.Items[i]) > 0 then begin Index := I; Break; end; if Index < 0 then ShowMessage('Der Autor konnte nicht gefunden werden.'); end; |
Re: Teilstring suchen
Das mit dem Break finde ich nicht so ideal. Was machst Du, wenn der in der Liste ein Autor mehrmals vertreten ist?
|
Re: Teilstring suchen
Noch ein Vorschlag:
Delphi-Quellcode:
function SearchSubString(const s, //gesuchter String
Sep: string; //Trennstring const sList: TStrings //Liste ): integer; //gefundene Position in der Liste var found: Boolean; i: integer; begin found := false; Result := -1; i := 0; while (i < sList.Count) and not found do begin if Copy(sList[i],1,Pos(Sep,sList[i]) - 1) = s then begin Result := i; found := true; end else inc(i); end; end; |
Re: Teilstring suchen
Du hast das gleiche Problem, wenn sich mehrere Autoren finden. Das ganze ein bisschen erweitert:
Delphi-Quellcode:
function SearchSubString(const s, //gesuchter String
Sep: string; //Trennstring const sList: TStrings //Liste ): String; //Kommatext mit den gefundenen Items var i, max: integer; ResTmp, ItemStr: String; begin i := 0; ResTmp := ''; max := sList.Count; while (i < max) do begin ItemStr := sList[I]; ItemStr := Copy(ItemStr, 1, Pos(Sep, ItemStr)); if Pos(s, ItemStr) > 0 then begin ResTmp := ResTmp + IntToStr(I) + ','; end; inc(i); end; Result := Copy(ResTmp, 1, Length(ResTmp) - 1); end; |
Re: Teilstring suchen
Dann eben so:
Delphi-Quellcode:
[edit] Achja:
type DynArr = array of integer;
procedure SearchSubString(const s, //gesuchter String Sep: string; //Trennstring const sList: TStrings; //Liste var ResultArr: DynArr); //dynamisches Array nimmt Trefferpositionen auf var i: integer; begin SetLength(ResultArr,0); i := 0; while (i < sList.Count) do begin if Copy(sList[i],1,Pos(Sep,sList[i]) - 1) = s then begin SetLength(ResultArr,Length(ResultArr) + 1); ResultArr[High(ResultArr)] := i; end; inc(i); end; end;
Delphi-Quellcode:
findet den Suchstring auch mittendrin, ob das so gewollt ist? :zwinker: [/edit]
if Pos(s, ItemStr) > 0 then
|
Re: Teilstring suchen
Und das ganze noch ein bisschen verbessert, da bei Detlefs Lösung nur exakte Strings gefunden werden:
Delphi-Quellcode:
type TDynIntArray = array of Integer;
procedure SearchSubString(const s, //gesuchter String Sep: string; //Trennstring const sList: TStrings; //Liste var ResultArr: TDynIntArray); // Trefferpositionen var i, max: integer; ItemStr: String; begin i := 0; max := sList.Count; SetLength(ResultArr, 0); while (i < max) do begin ItemStr := sList[I]; ItemStr := Copy(ItemStr, 1, Pos(Sep, ItemStr)); if Pos(s, ItemStr) > 0 then begin SetLength(ResultArr, Length(ResultArr) + 1); Resultarr[High(ResultArr)] := I; end; inc(i); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 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