Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Komplizierte suche in Memo ! Hilfe (https://www.delphipraxis.net/124304-komplizierte-suche-memo-hilfe.html)

Nitron 21. Nov 2008 12:33

Re: Komplizierte suche in Memo ! Hilfe
 
Oder wäre "lkjgfgkdsfhgkshrbtz afkgjbhertb*" ein erlaubter string?[/quote]


soll er mir nicht anzeigen da vor afkgjbhertb* noch ein wort ist !
würde alleine stehen etwa so
afkgjbhertb* dann soll er mir das anzeigen !

HenKst 21. Nov 2008 12:39

Re: Komplizierte suche in Memo ! Hilfe
 
na dann...

mit pos:
Delphi-Quellcode:
function SuchenInMemo( Memo : TMemo; NichtFindenStr : string; LastFindLine : integer = -1 ) : integer;
var
  LineIdx : integer;
  str: string;
  p: integer;
begin
  LineIdx := LastFindLine + 1;
  Result := 0;
  while
    ( LineIdx < Memo.Lines.Count ) and
    ( Result = 0 )
  do
    begin
      str:= Memo.Lines[LineIdx];
      p:= Pos( '*', str);// '*' finden;
      if
        (p > 0 ) and // '*' gefunden?
        (Pos( NichtFindenStr, str ) = 0 ) and // NichtFindStr nicht gefunden?
        (str[p+1] <> '*') and//'*' steht alleine?
        (pos(' ', str) > 1)// kein leerzeichen nach dem ersten zeichen
      then
        begin
          Result := LineIdx;
          SelectLine( Memo, LineIdx );
        end
      else
        Inc( LineIdx );
    end;
end;
mit delimitedtext (find ich schöner^^)
Delphi-Quellcode:
function SuchenInMemo( Memo : TMemo; NichtFindenStr : string; LastFindLine : integer = -1 ) : integer;
var
  LineIdx : integer;
  i: integer;
  strlst: TStringList;
  p: integer;
begin
  strlst:= TStringList.Create;
  strlst.delimiter:= '*';
  strlst.strictdelimiter:= true;
  LineIdx := LastFindLine + 1;
  Result := 0;
  while
    ( LineIdx < Memo.Lines.Count ) and
    ( Result = 0 )
  do begin
    if pos('*', Memo.Lines[LineIdx]) = 0 then
      inc(LineIdx);
      continue; //wenn kein '*' gefunden: nächster schleifendurchlauf;
    end;
    strlst.delimitedtext:= Memo.Lines[LineIdx]; // alle '*' finden;
                                               //jede zeile der strlst ist das was im memo vor einem '*' steht;
    case strlst.count of
      1: begin //ein '*' gefunden
        if pos(NichtFindenStr, strlst[0]) = 0 then begin //nichtfindstr suchen
          if pos(' ',strlst[0]) > 1 then begin //kein leerzeichen nach dem ersten zeichen
            Result := LineIdx;
            SelectLine( Memo, LineIdx );
          end;
        end;
      end;
      else begin
        if strlst[1] <> '' then begin // abragen ob '*' alleine stand
                                      // mehrere '**' sollte leerzeilen erzeugen *hoff*^^ 
          Result := LineIdx;
          SelectLine( Memo, LineIdx );
      end;
    end;
    Inc( LineIdx );
  end;
end;
Das sollte erstmal alles finden.
Für ausnahmen musst du dir wohl einen array von strings machen die nicht vor '*' stehen dürfen.

Nitron 21. Nov 2008 12:48

Re: Komplizierte suche in Memo ! Hilfe
 
dankeschön aber einige fehler gefunden er sagt mir bei

p: pos;

das was nicht stimmt und zwar : ,(, erwartet aber ,;, gefunden

HenKst 21. Nov 2008 12:49

Re: Komplizierte suche in Memo ! Hilfe
 
ups^^, p: integer hätte das heissen sollen ;)

Der code ist übrigens nicht getestet weil ich grad garkein Delphi da hab.

Benutzung also auf eigene Gefahr :twisted:

Nitron 21. Nov 2008 12:58

Re: Komplizierte suche in Memo ! Hilfe
 
hier sagt er mir das ich ein simikolon vergessen habe aber das kann nicht sein

(str[p+1] <> '*')//'*' steht alleine?

HenKst 21. Nov 2008 13:00

Re: Komplizierte suche in Memo ! Hilfe
 
(str[p+1] <> '*') AND//'*' steht alleine?

muss da hin ;)

Nitron 21. Nov 2008 13:06

Re: Komplizierte suche in Memo ! Hilfe
 
okay lässt sich nicht ausführen wegen dem hier

Delphi-Quellcode:
procedure TFormDialog.Suche1Click(Sender: TObject);
begin



  MyLastFindLine := SuchenInMemo( Memo1, Edit1.Text, Edit2.Text );


end;





procedure TFormDialog.WeiterSuchen1Click(Sender: TObject);
begin


  MyLastFindLine := SuchenInMemo( Memo1, Edit1.Text, Edit2.Text, MyLastFindLine )
end;

muss ich da die quellen ändern ?
die edit´s müssen weg oder?
da wir jetzt direkt ansprechen oder?

HenKst 21. Nov 2008 13:16

Re: Komplizierte suche in Memo ! Hilfe
 
hap
ich hab als Suchstring jetzt permanent '*' angenommen, der wird also nicht mehr übergeben.
Delphi-Quellcode:
MyLastFindLine := SuchenInMemo( Memo1, Edit2.Text, MyLastFindLine )
müsste also reichen

Nitron 21. Nov 2008 13:25

Re: Komplizierte suche in Memo ! Hilfe
 
wollte mich mal bedanke für die hilfe !

jetzt ist aber das problem immer noch da das wenn was findet mit *
z.b hier ein bespiel:

void REPSLCT(func_return_t* rep_select)
findet

eine bedienung soll ja sein das nix davor stehen darf !
also wenn das steht
func_return_t* dann soll er mir das anzeigen aber nich wenn davor was steht

und manchmal bleibt er bei einem stehen !

zb ich click auf weiter suche und er zeigt mir das zb an
void REPSLCT(func_return_t* rep_select)
und geht nicht weiter !

quell code nochmal

Delphi-Quellcode:
procedure TFormDialog.Suche1Click(Sender: TObject);
begin



 MyLastFindLine := SuchenInMemo( Memo1, Edit2.Text, MyLastFindLine )


end;





procedure TFormDialog.WeiterSuchen1Click(Sender: TObject);
begin


  MyLastFindLine := SuchenInMemo( Memo1, Edit2.Text, MyLastFindLine )
end;

HenKst 21. Nov 2008 13:48

Re: Komplizierte suche in Memo ! Hilfe
 
Zitat:

Zitat von Nitron
wollte mich mal bedanke für die hilfe !

jetzt ist aber das problem immer noch da das wenn was findet mit *
z.b hier ein bespiel:

void REPSLCT(func_return_t* rep_select)
findet

eine bedienung soll ja sein das nix davor stehen darf !
also wenn das steht
func_return_t* dann soll er mir das anzeigen aber nich wenn davor was steht

wie gesagt, für solche ausnahmen musst du dir nen array bauen
in dem fall wäre das mit
Delphi-Quellcode:
if (pos('/', str) > 0) and (pos('/', str) < pos('*', str))
vermutlich gelöst, aber es gibt bestimmt noch mehr solcher fälle

also bauen wir uns ne funktion ;)

Delphi-Quellcode:
function AusnahmenFinden(arr: array of string; value: string): boolean;
var
  i: integer;
begin
  result:= false;
  for i:= 0 to high(arr) do begin
    if pos(arr[i], value) <> 0 then begin
      result:= true;
      exit;
    end;
  end;
end;
der übergibst du deinen ausnahmen array und die memozeile
und dann baust du sie in die if abfrage ein
Delphi-Quellcode:
      if
        (p > 0 ) and // '*' gefunden?
        (Pos( NichtFindenStr, str ) = 0 ) and // NichtFindStr nicht gefunden?
        (str[p+1] <> '*') and//'*' steht alleine?
        (pos(' ', str) > 1) and// kein leerzeichen nach dem ersten zeichen
        (not AusnahmenFinden(Ausnahmenarray, str))
      then
Zitat:

Zitat von Nitron


und manchmal bleibt er bei einem stehen !

zb ich click auf weiter suche und er zeigt mir das zb an
void REPSLCT(func_return_t* rep_select)
und geht nicht weiter !

ist das vielleicht die letzte zeile in der sowas steht? :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 Uhr.
Seite 4 von 5   « Erste     234 5      

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