Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Teilstring suchen (https://www.delphipraxis.net/112263-teilstring-suchen.html)

Hugo Hasi 17. Apr 2008 19:17


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;

DeddyH 17. Apr 2008 19:22

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.).

Die Muhkuh 17. Apr 2008 19:31

Re: Teilstring suchen
 
Um noch ein paar Fehler mehr aufzulisten:

Delphi-Quellcode:
autorfeld.Text:=suchbegriff;
Ist wohl andersrum gemeint.

Delphi-Quellcode:
gefunden:=n;
Du hast n nichts zugewiesen, was soll das bringen?

Delphi-Quellcode:
Listenfenster.Items.Strings[i];
Da steht einzeln in Zeile 10, was soll das bringen?

Delphi-Quellcode:
i:=+1;
Sollte wohl:

Delphi-Quellcode:
i := i + 1;
// oder
Inc(i);
heißen.

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;

mkinzler 17. Apr 2008 19:32

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;

dominikkv 17. Apr 2008 19:33

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;

Die Muhkuh 17. Apr 2008 19:37

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?

DeddyH 17. Apr 2008 19:40

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;

Die Muhkuh 17. Apr 2008 19:48

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;

DeddyH 17. Apr 2008 19:58

Re: Teilstring suchen
 
Dann eben so:
Delphi-Quellcode:
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;
[edit] Achja:
Delphi-Quellcode:
if Pos(s, ItemStr) > 0 then
findet den Suchstring auch mittendrin, ob das so gewollt ist? :zwinker: [/edit]

Die Muhkuh 17. Apr 2008 20:04

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 04:51 Uhr.
Seite 1 von 4  1 23     Letzte »    

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