Delphi-PRAXiS
Seite 1 von 2  1 2      

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 18. Nov 2008 12:40


Komplizierte suche in Memo ! Hilfe
 
Hallo bin Neu hier und komme auch direkt zu meinem erstem Problem !
Ich muss eine Datei Programmieren in Delphi die eine Text datei öffnet und nach bestimmten Zeilen sucht.

Der Aufbau sieht so aus:
Code:
unit Dialog_u;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, Menus, StdCtrls;

type
  TFormDialog = class(TForm)
    Memo1: TMemo;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    MainMenu: TMainMenu;
    Menu_Datei: TMenuItem;
    MenuLaden: TMenuItem;
    MenuSpeichern: TMenuItem;
    N1: TMenuItem;
    MenuBeenden: TMenuItem;
    Suche1: TMenuItem;
    WeiterSuchen1: TMenuItem;
    Edit1: TEdit;
    CheckBox1: TCheckBox;
    procedure MenuLadenClick(Sender: TObject);
    procedure MenuSpeichernClick(Sender: TObject);
    procedure MenuBeendenClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure Suche1Click(Sender: TObject);
    procedure WeiterSuchen1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormDialog: TFormDialog;
  x: Integer;
  find: Boolean = False;

implementation

{$R *.DFM}

procedure TFormDialog.MenuLadenClick(Sender: TObject);
begin
  if OpenDialog.Execute then
     TRY
        Memo1.Lines.Loadfromfile(OpenDialog.Filename);
     EXCEPT
        ShowMessage ('Fehler beim Laden der Datei!');
     END;
end;

procedure TFormDialog.MenuSpeichernClick(Sender: TObject);
begin
  if SaveDialog.Execute then
     TRY
        Memo1.Lines.SavetoFile(SaveDialog.Filename);
     EXCEPT
        ShowMessage ('Fehler beim Speichern der Datei!');
     END;
end;

procedure TFormDialog.MenuBeendenClick(Sender: TObject);
begin
   FormDialog.Close;
end;

procedure TFormDialog.FormResize(Sender: TObject);
begin
   Memo1.width := FormDialog.clientwidth;
   Memo1.height := FormDialog.clientheight;
end;

procedure TFormDialog.Suche1Click(Sender: TObject);


var
  i: Integer;
  a: string;
begin
  Memo1.Lines.Add('');
  Memo1.Lines.Text := ' ' + Memo1.Lines.Text;
  for i := 0 to Length(Memo1.Lines.Text) - Length(edit1.Text) do
  begin
    a := Copy(Memo1.Lines.Text, i, Length(edit1.Text));
    if CheckBox1.Checked = True then
    begin
      if a = edit1.Text then
      begin
        find := True;
        x   := 2;
        Memo1.Lines.Text := Copy(Memo1.Lines.Text, 2, Length(Memo1.Lines.Text) - 1);
        Memo1.SetFocus;
        Memo1.SelStart := i - 2;
        Memo1.SelLength := Length(edit1.Text);
        break;
      end;
    end
    else
    begin
      if lowercase(a) = lowercase(edit1.Text) then
      begin
        Memo1.Lines.Text := Copy(Memo1.Lines.Text, 2, Length(Memo1.Lines.Text) - 1);
        find := True;
        x   := 2;
        Memo1.SetFocus;
        Memo1.SelStart := i - 2;
        Memo1.SelLength := Length(edit1.Text);
        break;
      end;
    end;
  end;
  if find = False then ShowMessage('SuchString nicht gefunden')
  else
    find := False;
end;


procedure TFormDialog.WeiterSuchen1Click(Sender: TObject);
var
  i: Integer;
  a: string;
  d: Integer;
begin
  d := 0;
  for i := 0 to Length(Memo1.Lines.Text) - Length(edit1.Text) do
  begin
    a := Copy(Memo1.Lines.Text, i, Length(edit1.Text));
    if CheckBox1.Checked = True then
    begin
      if a = edit1.Text then
      begin
        d := d + 1;
        if d = x then
        begin
          find := True;
          x   := x + 1;
          Memo1.Lines.Text := Copy(Memo1.Lines.Text, 2, Length(Memo1.Lines.Text) - 1);
          Memo1.SetFocus;
          Memo1.SelStart := i - 1;
          Memo1.SelLength := Length(edit1.Text);
          break;
          Memo1.Lines.Text := Copy(Memo1.Lines.Text, 2, Length(Memo1.Lines.Text) - 1);
        end;
      end;
    end
    else
    begin
      if lowercase(a) = lowercase(edit1.Text) then
      begin
        d := d + 1;
        if d = x then
        begin
          find := True;
          x   := x + 1;
          Memo1.Lines.Text := Copy(Memo1.Lines.Text, 2, Length(Memo1.Lines.Text) - 1);
          Memo1.SetFocus;
          Memo1.SelStart := i - 1;
          Memo1.SelLength := Length(edit1.Text);
          break;
          Memo1.Lines.Text := Copy(Memo1.Lines.Text, 2, Length(Memo1.Lines.Text) - 1);
        end;
      end;
    end;
  end;
  if find = False then ShowMessage('SuchString nicht gefunden')
  else
    find := False;
end;

end.
------------------------------------
Ich will aber das er mit die Zeilen makiert in der Irgendwas* und in der gleichen zeile kein Far steht

z.b far u8* buf_p; soll er nicht in der suche anzeigen und makieren
aber wenn das auftaucht:

u8* buf_p

soll er mir das makieren da kein far in der Zeile ist !


Kann mir da einer helfen ?
Und noch was das u8 ist ein beispiel für irgendwas !

Mfg Nitosox

HenKst 18. Nov 2008 12:58

Re: Komplizierte suche in Memo ! Hilfe
 
Hallöle und willkommen in der DP (das wollt ich schon immer mal sagen ;) )

Hast dus schonmal mit pos() probiert?
So nach dem schema
Delphi-Quellcode:
for i:= 0 to memo1.lines.count do -1 begin
  if pos(suchtext1, memo1.lines[i]) <> 0 then begin
    if pos(suchtext2, memo1.lines[i]) <> 0 then begin
      find = false;
    end else begin
      find = true;
    end;
   end else begin
     find:= false;
  end;
end;
suchtext1 ist der Text der gefunden werden soll, suchtext2 der Text der nicht vorhanden sein soll.
pos() gibt 0 zurück wenn der Gesuchte text nicht gefunden wurde.
Wenn diese Schleife also den ersten suchtext findet, sucht sie in der selbe Zeile nach dem zweiten.
Wenn der drin ist wird find:= true, wenn nicht := false gesetzt.

Funktioniert allerdings nur wenn der text auch nach zeilen sortiert ist, also pro Zeile ein zu durchsuchender string. Wenn der das nicht ist soltest du dir mal die DelimitedText methode anschaun.

GreeZ HenKst

Nitron 18. Nov 2008 13:01

Re: Komplizierte suche in Memo ! Hilfe
 
Danke ich werde mich damit beschäftigen !
Ehm es ist sortiert da es ein C++ Quellcode ist !
Die kann ich ja öffnen und im Memo ausgeben !

Aber vielen DANK !

Nitron 18. Nov 2008 13:04

Re: Komplizierte suche in Memo ! Hilfe
 
Delphi-Quellcode:
for i:= 0 to memo1.lines.count do begin
  if pos(suchtext1, memo1.lines[i] <> 0 then begin
    if pos(suchtext2, memo1.lines[i] <> 0 then begin
      find = false;
    end else begin
      find = true;
    end;
   end else begin
     find:= false;
  end;
end;


bei such text kommt z.b edit1 rein oder ?

und die var i soll strin sein oder?

HenKst 18. Nov 2008 13:08

Re: Komplizierte suche in Memo ! Hilfe
 
Quellcode ist auch nicht immer sortiert ;)

Aber bei c++ ist soweit ich weiss auch jeder Befehl mit ; geschlossen also hast du da zur not nen 1A delimiter.


Bei suchtext1 kommt rein wonach du suchst.
Wenn das in edit1.text steht muss das dahin ;)

i ist als schleifenindex wohl ein integer^^

die schleife muss übrigens bis memo1.lines.count -1 gehn *korrigier*

alzaimar 18. Nov 2008 13:30

Re: Komplizierte suche in Memo ! Hilfe
 
Ein wenig kürzer wäre:
Delphi-Quellcode:
// Beachte Groß/Kleinschreibung:
Memo1.lines.Text := StringReplace (Memo1.Lines.Text, SuchText, ErsetzeText,[rfReplaceAll]);

// Ignoriere Groß/Kleinschreibung:
Memo1.lines.Text := StringReplace (Memo1.Lines.Text, SuchText, ErsetzeText,[rfReplaceAll, rfIgnoreCase]);

Nitron 18. Nov 2008 13:31

Re: Komplizierte suche in Memo ! Hilfe
 
Delphi-Quellcode:
procedure TFormDialog.Suche1Click(Sender: TObject);
var
  i: Integer;
  a: string;
begin
  Memo1.Lines.Add('');
  Memo1.Lines.Text := ' ' + Memo1.Lines.Text;
 for i:= 0 to memo1.lines.count-1 do begin
  if pos(edit1.text, memo1.lines[i] <> 0 then begin
    if pos(edit2.text, memo1.lines[i] <> 0 then begin
      find = false;
    end else begin
      find = true;
    end;
   end else begin
     find:= false;
  end;
end;
end;

hier zeigt er mir ein fehler wegen den variablen

HenKst 18. Nov 2008 13:41

Re: Komplizierte suche in Memo ! Hilfe
 
Was mir auffällt ist das find nicht deklariert ist.

Die hab ich einfach aus deinem Code oben übernommen also musst du die auch noch irgendwo herholen ;)

Zitat:

Zitat von alzaimar
Ein wenig kürzer wäre:
Delphi-Quellcode:
// Beachte Groß/Kleinschreibung:
Memo1.lines.Text := StringReplace (Memo1.Lines.Text, SuchText, ErsetzeText,[rfReplaceAll]);

// Ignoriere Groß/Kleinschreibung:
Memo1.lines.Text := StringReplace (Memo1.Lines.Text, SuchText, ErsetzeText,[rfReplaceAll, rfIgnoreCase]);

Das ignoriert aber den zweiten suchtext
Es soll ja nur irgendwas getan werden wenn dieser in der Zeile nicht vorhanden ist.

Nitron 18. Nov 2008 13:44

Re: Komplizierte suche in Memo ! Hilfe
 
ich habe absolut 0plan sorry du musst mir mal rictig helfen hier mit dem prog ich wäre dir sehr dankbar also hier jetzt mein quellcode


Delphi-Quellcode:
interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, Menus, StdCtrls;

type
  TFormDialog = class(TForm)
    Memo1: TMemo;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    MainMenu: TMainMenu;
    Menu_Datei: TMenuItem;
    MenuLaden: TMenuItem;
    MenuSpeichern: TMenuItem;
    N1: TMenuItem;
    MenuBeenden: TMenuItem;
    Suche1: TMenuItem;
    WeiterSuchen1: TMenuItem;
    CheckBox1: TCheckBox;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure MenuLadenClick(Sender: TObject);
    procedure MenuSpeichernClick(Sender: TObject);
    procedure MenuBeendenClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure Suche1Click(Sender: TObject);
    procedure WeiterSuchen1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormDialog: TFormDialog;
  x: Integer;
  find: Boolean = False;

implementation

{$R *.DFM}

procedure TFormDialog.MenuLadenClick(Sender: TObject);
begin
  if OpenDialog.Execute then
     TRY
        Memo1.Lines.Loadfromfile(OpenDialog.Filename);
     EXCEPT
        ShowMessage ('Fehler beim Laden der Datei!');
     END;
end;

procedure TFormDialog.MenuSpeichernClick(Sender: TObject);
begin
  if SaveDialog.Execute then
     TRY
        Memo1.Lines.SavetoFile(SaveDialog.Filename);
     EXCEPT
        ShowMessage ('Fehler beim Speichern der Datei!');
     END;
end;

procedure TFormDialog.MenuBeendenClick(Sender: TObject);
begin
   FormDialog.Close;
end;

procedure TFormDialog.FormResize(Sender: TObject);
begin
   Memo1.width := FormDialog.clientwidth;
   Memo1.height := FormDialog.clientheight;
end;

procedure TFormDialog.Suche1Click(Sender: TObject);
var
  i: Integer;
  a: string;

begin

  Memo1.Lines.Text := ' ' + Memo1.Lines.Text;
 for i:= 0 to memo1.lines.count-1 do begin
   if pos(edit1.text, memo1.lines[i] <> 0 then
   begin
    if pos(edit2.text, memo1.lines[i] <> 0 then
    begin
      find = false;
    end else begin
      find = true;
    end;
   end else begin
     find:= false;
  end;
end;
end;

procedure TFormDialog.WeiterSuchen1Click(Sender: TObject);
var
  i: Integer;
  a: string;
  d: Integer;
begin
  d := 0;
  for i := 0 to Length(Memo1.Lines.Text) - Length(edit1.Text) do
  begin
    a := Copy(Memo1.Lines.Text, i, Length(edit1.Text));
    if CheckBox1.Checked = True then
    begin
      if a = edit1.Text then
      begin
        d := d + 1;
        if d = x then
        begin
          find := True;
          x   := x + 1;
          Memo1.Lines.Text := Copy(Memo1.Lines.Text, 2, Length(Memo1.Lines.Text) - 1);
          Memo1.SetFocus;
          Memo1.SelStart := i - 1;
          Memo1.SelLength := Length(edit1.Text);
          break;
          Memo1.Lines.Text := Copy(Memo1.Lines.Text, 2, Length(Memo1.Lines.Text) - 1);
        end;
      end;
    end
    else
    begin
      if lowercase(a) = lowercase(edit1.Text) then
      begin
        d := d + 1;
        if d = x then
        begin
          find := True;
          x   := x + 1;
          Memo1.Lines.Text := Copy(Memo1.Lines.Text, 2, Length(Memo1.Lines.Text) - 1);
          Memo1.SetFocus;
          Memo1.SelStart := i - 1;
          Memo1.SelLength := Length(edit1.Text);
          break;
          Memo1.Lines.Text := Copy(Memo1.Lines.Text, 2, Length(Memo1.Lines.Text) - 1);
        end;
      end;
    end;
  end;
  if find = False then ShowMessage('SuchString nicht gefunden')
  else
    find := False;
end;

end.

alzaimar 18. Nov 2008 13:47

Re: Komplizierte suche in Memo ! Hilfe
 
Hups, hab ich nicht geschaut:
Delphi-Quellcode:
For i:=0 to Memo1.lines.count - 1 do
  If Pos(DerEineSuchtext, Memo1.Lines[i]) = 0 Then // wenn der eine Suchtext in der Zeile nicht vorhanden ist
     Memo1.Lines[i] := StringReplace (Memo1.Lines[i], Suchtext, ErsetzungsText,...);

HenKst 18. Nov 2008 13:48

Re: Komplizierte suche in Memo ! Hilfe
 
huch
da fehlen die ) bei den pos ;)

Kommt davon wenn man blind kopiert^^

Delphi-Quellcode:
for i:= 0 to memo1.lines.count-1 do begin
  if pos(edit1.text, memo1.lines[i]) <> 0 then begin
    if pos(edit2.text, memo1.lines[i]) <> 0 then begin
      find = false;
    end else begin
      find = true;
    end;
   end else begin
     find:= false;
  end;
end;
so müsste es aussehn

Nitron 18. Nov 2008 13:57

Re: Komplizierte suche in Memo ! Hilfe
 
hab ich auch gerade bemerkt danke aber er führt das jetzt nicht aus makiert mir das nicht mehr !
und ich weiß nicht was ich für irgendwas eingeben soll !

weil im text steht z.b u8* oder u9* in edit1 muss ich was eingeben für irgendwas*
und in edit2 far aber das funzt net !

Nitron 18. Nov 2008 14:07

Re: Komplizierte suche in Memo ! Hilfe
 
Zitat:

Zitat von alzaimar
Hups, hab ich nicht geschaut:
Delphi-Quellcode:
For i:=0 to Memo1.lines.count - 1 do
  If Pos(DerEineSuchtext, Memo1.Lines[i]) = 0 Then // wenn der eine Suchtext in der Zeile nicht vorhanden ist
     Memo1.Lines[i] := StringReplace (Memo1.Lines[i], Suchtext, ErsetzungsText,...);


habe das jetzt so
Delphi-Quellcode:
begin
For i:=0 to Memo1.lines.count - 1 do
  If Pos(edit1.text, Memo1.Lines[i]) = 0 Then // wenn der eine Suchtext in der Zeile nicht vorhanden ist
     Memo1.Lines[i] := StringReplace (Memo1.Lines[i], edit2.text, edit3.text);
er sagt mir aber das ich ungenügende parameter habe !

HenKst 18. Nov 2008 14:13

Re: Komplizierte suche in Memo ! Hilfe
 
da fehlt ein [rfReplaceall] oder etwas in der art am ende des stringreplace.
Aber das markiert dir immernoch nicht deine zeile :)

Momentan fällt mir da nichts ein ausser SelStart auf die summe Längen aller zeilen bis zur gefundenen zu setzen und SelLength auf die Länge der dieser Zeile...
Und das auch nur wenn ich SelStart richtig verstanden hab^^

Delphi-Quellcode:

procedure SelectLine (Memo: TMemo; index: integer);
var
  i: integer;
  start: integer;
begin
  start:= 0;
  for i:= 0 to index -1  do begin
    start:= start + length(Memo.Lines[i];
  end;
  Memo.SelStart:= start;
  Memo.SelLength:= length(Memo.lines[index]);
end;

procedure FindLine (memo: TMemo; suchtext1, suchtext2: string);
var
  i: integer;
begin
for i:= 0 to memo.lines.count-1 do begin
  if pos(suchtext1, memo.lines[i]) <> 0 then begin
    if pos(suchtext2, memo.lines[i]) <> 0 then begin
      find = false;
    end else begin
      find = true;
      SelectLine(memo, i);
      break;
    end;
   end else begin
     find:= false;
  end;
end;
Das sollte dir eine gesuchte Zeile markieren
Ist aber nicht getestet^^

Nitron 18. Nov 2008 15:21

Re: Komplizierte suche in Memo ! Hilfe
 
kann das vielleicht einer amchen und hochladen ?

ich sitze hier schon 9stunden dran und habe es immer noch nicht !

Nitron 18. Nov 2008 15:40

Re: Komplizierte suche in Memo ! Hilfe
 
Delphi-Quellcode:
unit Dialog_u; { Projekt DIALOG * Herwig Reidlinger }

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, Menus, StdCtrls;

type
  TFormDialog = class(TForm)
    Memo1: TMemo;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    MainMenu: TMainMenu;
    Menu_Datei: TMenuItem;
    MenuLaden: TMenuItem;
    MenuSpeichern: TMenuItem;
    N1: TMenuItem;
    MenuBeenden: TMenuItem;
    Suche1: TMenuItem;
    WeiterSuchen1: TMenuItem;
    Edit1: TEdit;
    Edit2: TEdit;
    N2: TMenuItem;
    selectline1: TMenuItem;
    CheckBox1: TCheckBox;
    procedure MenuLadenClick(Sender: TObject);
    procedure MenuSpeichernClick(Sender: TObject);
    procedure MenuBeendenClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure Suche1Click(Sender: TObject);
    procedure WeiterSuchen1Click(Sender: TObject);


  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormDialog: TFormDialog;
  x: Integer;
  find: Boolean = False;

implementation

{$R *.DFM}

procedure TFormDialog.MenuLadenClick(Sender: TObject);
begin
  if OpenDialog.Execute then
     TRY
        Memo1.Lines.Loadfromfile(OpenDialog.Filename);
     EXCEPT
        ShowMessage ('Fehler beim Laden der Datei!');
     END;
end;

procedure TFormDialog.MenuSpeichernClick(Sender: TObject);
begin
  if SaveDialog.Execute then
     TRY
        Memo1.Lines.SavetoFile(SaveDialog.Filename);
     EXCEPT
        ShowMessage ('Fehler beim Speichern der Datei!');
     END;
end;

procedure TFormDialog.MenuBeendenClick(Sender: TObject);
begin
   FormDialog.Close;
end;

procedure TFormDialog.FormResize(Sender: TObject);
begin
   Memo1.width := FormDialog.clientwidth;
   Memo1.height := FormDialog.clientheight;
end;


procedure TFormDialog.Suche1Click(Sender: TObject);

begin
//
end;





procedure TFormDialog.WeiterSuchen1Click(Sender: TObject);
begin
//
end;

end.



muss jetzt nur noch die schleife rein kann mir da einer helfen ?

HenKst 19. Nov 2008 12:59

Re: Komplizierte suche in Memo ! Hilfe
 
Hast du meinen code überhaupt mal getestet?

Ich hab grad ein mini Program damit geschrieben und das funktioniert soweit.
Sind zwar ein paar fehler drin, zum beispiel ist die selection ein paar character daneben weil am ende jeder zeile noch ein $0D0A steht das bei length() ignoriert wird, aber in seltext steht was drin und es wird auch die richtige Zeile gefunden.

SelStart und SelLength zu setzen scheint aber nicht auszureichen um eine selection auf dem bildschirm anzuzeigen.
Das scheint Teil der windowsapi zu sein-.-
Da schau ich nochmal nach aber vielleicht findest du ja selbst was.

€dit
ein einfach SetFocus scheint zu reichen um die selection zu markieren^^
Delphi-Quellcode:
procedure SelectLine (Memo: TMemo; index: integer);
var
  i: integer;
  start, fin: integer;

begin
  start:= 0;
  fin:= length(Memo.lines[index]);
  for i:= 0 to index -1 do begin
    start:= start + length(Memo.Lines[i]) + 2;
  end;
  memo.SetFocus;
  Memo.SelStart:= start;
  Memo.SelLength:= fin;
  ShowMessage(memo.SelText);
end;
GreeZ HenKst

Sir Rufo 19. Nov 2008 14:14

Re: Komplizierte suche in Memo ! Hilfe
 
Also entweder bin ich :? oder ihr habt jetzt den Nitron :? gemacht.

Ich dachte, der möchte in einem Memo-Feld etwas suchen ... da frage ich mich, warum ihr dem sagt, er soll mit StringReplace was machen, und vor allem das Ergebnis von StringReplace wieder in das Memo schreiben :gruebel:

Also die Funktion klaue ich einfachmal
Delphi-Quellcode:
procedure SelectLine (Memo: TMemo; index: integer);
var
  i: integer;
  start, fin: integer;

begin
  start:= 0;
  fin:= length(Memo.lines[index]);
  for i:= 0 to index -1 do begin
    start:= start + length(Memo.Lines[i]) + 2;
  end;
  memo.SetFocus;
  Memo.SelStart:= start;
  Memo.SelLength:= fin;
  // ShowMessage(memo.SelText);
end;
Delphi-Quellcode:
function SuchenInMemo( Memo : TMemo; FindenStr, NichtFindenStr : string; LastFindLine : integer = -1 ) : integer;
var
  LineIdx : integer;
begin
  LineIdx := LastFindLine + 1;
  Result := 0;
  while
    ( LineIdx < Memo.Lines.Count ) and
    ( Result = 0 )
  do
    begin
      if
        ( Pos( FindenStr, Memo.Lines[ LineIdx ] ) > 0 ) and
        ( Pos( NichtFindenStr, Memo.Lines[ LineIdx ] ) = 0 )
      then
        begin
          Result := LineIdx;
          SelectLine( Memo, LineIdx );
        end
      else
        Inc( LineIdx );
    end;
end;
Im Programm rufst du das so auf:
Delphi-Quellcode:
// Globale Variable oder Klassen-Variable deklarieren
var
  MyLastFindLine : integer;

// beim Klick auf den Suchen-Button diesen Code

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

// Beim Klick auf Weitersuchen diesen Code

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

Oliver

[edit]der fehler ist nun behoben[/edit]
[edit2]jetzt tut die function genau das was sie soll :mrgreen: [/edit2]

Nitron 21. Nov 2008 09:13

Re: Komplizierte suche in Memo ! Hilfe
 
ok ich war die woche nicht da muss mich jetzt wieder dran setzen danke ich werde posten wenn ich schwierigkeit habe !

Nitron 21. Nov 2008 09:25

Re: Komplizierte suche in Memo ! Hilfe
 
er kann es net compilieren er sagt mir das Count ein undefinierte Bezeichnung ist !
was soll ich da machen ?

und muss dich die function einbinden ?? irgendwo oder macht das delphie automatisch ?

Sir Rufo 21. Nov 2008 09:39

Re: Komplizierte suche in Memo ! Hilfe
 
Zitat:

Zitat von Nitron
er kann es net compilieren er sagt mir das Count ein undefinierte Bezeichnung ist !
was soll ich da machen ?

... ist geändert ... jetzt geht es ... :mrgreen:

Zitat:

Zitat von Nitron
und muss dich die function einbinden ?? irgendwo oder macht das delphie automatisch ?

äh, ja ... aufrufen halt, dann wenn die aufgerufen werden soll ... als wenn ein button gedrückt wird ...
wenn die in der gleichen Unit wie die Form stehen, dann sind die sofort da, wenn die in eine eigene Unit gespeichert werden, dann diese Unit einbinden. Hängt also von Dir ab, wo du das hinschreibst.

Aber pack es doch einfach in die Unit von deiner Form ;-)

cu

Oliver

Nitron 21. Nov 2008 10:14

Re: Komplizierte suche in Memo ! Hilfe
 
ok das danke es funzt aber das problem ist jetzt das es sehr lange braucht ^^
bzw denke ich mal wenn er nichts findet dann hänngt sich das auf....
bei einer kleineren datei funzt es aber bei einer gräßeren schmiert er ab...
glaub ich eine schleife die nicht endet^^

aber mein problem ist immer noch das mit dem * es mus vor dem * was stehen alphanummerisch und eine leertaste sein
und er soll mir die zeile zeigen wo ein * ist was drin steht und eine leertaste davor z.b

far blablal u8* soll er mir nicht anzeigen
aber diesen satz soll er mir anzeigen blablabl u8* <--weil kein far drinner ist !

ich weiß nicht was man da machen kann !
wäre nett wenn ihr mir noch helfen könnt =)

mfg nitron

Nitron 21. Nov 2008 10:16

Re: Komplizierte suche in Memo ! Hilfe
 
muss auch nicht unbedingt mit edit arbeiten bzw mit edit feldern !



Delphi-Quellcode:
unit Dialog_u; { Projekt DIALOG * Herwig Reidlinger }

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, Menus, StdCtrls;

type
  TFormDialog = class(TForm)
    Memo1: TMemo;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    MainMenu: TMainMenu;
    Menu_Datei: TMenuItem;
    MenuLaden: TMenuItem;
    MenuSpeichern: TMenuItem;
    N1: TMenuItem;
    MenuBeenden: TMenuItem;
    Suche1: TMenuItem;
    WeiterSuchen1: TMenuItem;
    Edit1: TEdit;
    Edit2: TEdit;
    N2: TMenuItem;
    selectline1: TMenuItem;
    procedure MenuLadenClick(Sender: TObject);
    procedure MenuSpeichernClick(Sender: TObject);
    procedure MenuBeendenClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure Suche1Click(Sender: TObject);
    procedure WeiterSuchen1Click(Sender: TObject);


  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormDialog: TFormDialog;
  x: Integer;
  find: Boolean = False;

  // Globale Variable oder Klassen-Variable deklarieren

  MyLastFindLine : integer;

implementation

{$R *.DFM}

procedure TFormDialog.MenuLadenClick(Sender: TObject);
begin
  if OpenDialog.Execute then
     TRY
        Memo1.Lines.Loadfromfile(OpenDialog.Filename);
     EXCEPT
        ShowMessage ('Fehler beim Laden der Datei!');
     END;
end;

procedure TFormDialog.MenuSpeichernClick(Sender: TObject);
begin
  if SaveDialog.Execute then
     TRY
        Memo1.Lines.SavetoFile(SaveDialog.Filename);
     EXCEPT
        ShowMessage ('Fehler beim Speichern der Datei!');
     END;
end;

procedure TFormDialog.MenuBeendenClick(Sender: TObject);
begin
   FormDialog.Close;
end;

procedure TFormDialog.FormResize(Sender: TObject);
begin
   Memo1.width := FormDialog.clientwidth;
   Memo1.height := FormDialog.clientheight;
end;

procedure SelectLine (Memo: TMemo; index: integer);
var
  i: integer;
  start, fin: integer;

begin
  start:= 0;
  fin:= length(Memo.lines[index]);
  for i:= 0 to index -1 do begin
    start:= start + length(Memo.Lines[i]) + 2;
  end;
  memo.SetFocus;
  Memo.SelStart:= start;
  Memo.SelLength:= fin;
  ShowMessage(memo.SelText);
end;

function SuchenInMemo( Memo : TMemo; FindenStr, NichtFindenStr : string; LastFindLine : integer = 0 ) : integer;
var
  LineIdx : integer;
begin
  LineIdx := LastFindLine + 1;
  Result := 0;
  while
    ( LineIdx < Memo.Lines.Count ) and
    ( Result = 0 )
  do
    begin
      if Pos( FindenStr, Memo.Lines[ LineIdx ] ) > 0
      then
        if Pos( NichtFindenStr, Memo.Lines[ LineIdx ] ) = 0
        then
          begin
            Result := LineIdx;
            SelectLine( Memo, LineIdx );
          end;
          end;
    end;



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;

end.



hier noch mal mein quellcode !

HenKst 21. Nov 2008 11:17

Re: Komplizierte suche in Memo ! Hilfe
 
*auchcodeklau*
Delphi-Quellcode:
      if
        ( Pos( FindenStr, Memo.Lines[ LineIdx ] ) > 0 ) and
        ( Pos( NichtFindenStr, Memo.Lines[ LineIdx ] ) = 0 )
      then
das ist doch (fast) genau was diese Abfrage macht.
Nur sucht sie im gesamten String und nicht nur vorher.
Wenns unbedingt vorher sein soll musst du halt per copy bis pos(suchstring1) ausschneiden.

Du suchst nach "u8*"
nicht vorkommen soll "far"

Code:
Fall 1:
String= "far blablal u8*"
(Pos( "u8*", string) <> 0) = true
and
(Pos( "far", string) = 0 ) = false

durchlauf beendet;
Fall 2:
Code:
String= "blablal u8*"
(Pos( "u8*", string) <> 0) = true
string:= copy(string, 1, Pos( "u8*", string));
and
(Pos( "far", string) = 0 ) = true

markierung beginnt;

Sir Rufo 21. Nov 2008 11:30

Re: Komplizierte suche in Memo ! Hilfe
 
Zitat:

Zitat von Nitron
muss auch nicht unbedingt mit edit arbeiten bzw mit edit feldern !

dann nimm doch nicht die edit-felder :shock: und übergib die parameter direkt

hab mal deinen code geupdated

Delphi-Quellcode:
unit Dialog_u; { Projekt DIALOG * Herwig Reidlinger }

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, Menus, StdCtrls;

type
  TFormDialog = class(TForm)
    Memo1: TMemo;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    MainMenu: TMainMenu;
    Menu_Datei: TMenuItem;
    MenuLaden: TMenuItem;
    MenuSpeichern: TMenuItem;
    N1: TMenuItem;
    MenuBeenden: TMenuItem;
    Suche1: TMenuItem;
    WeiterSuchen1: TMenuItem;
    Edit1: TEdit;
    Edit2: TEdit;
    N2: TMenuItem;
    selectline1: TMenuItem;
    procedure MenuLadenClick(Sender: TObject);
    procedure MenuSpeichernClick(Sender: TObject);
    procedure MenuBeendenClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure Suche1Click(Sender: TObject);
    procedure WeiterSuchen1Click(Sender: TObject);


  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormDialog: TFormDialog;
  x: Integer;
  find: Boolean = False;

  // Globale Variable oder Klassen-Variable deklarieren

  MyLastFindLine : integer;

implementation

{$R *.DFM}

procedure TFormDialog.MenuLadenClick(Sender: TObject);
begin
  if OpenDialog.Execute then
     TRY
        Memo1.Lines.Loadfromfile(OpenDialog.Filename);
     EXCEPT
        ShowMessage ('Fehler beim Laden der Datei!');
     END;
end;

procedure TFormDialog.MenuSpeichernClick(Sender: TObject);
begin
  if SaveDialog.Execute then
     TRY
        Memo1.Lines.SavetoFile(SaveDialog.Filename);
     EXCEPT
        ShowMessage ('Fehler beim Speichern der Datei!');
     END;
end;

procedure TFormDialog.MenuBeendenClick(Sender: TObject);
begin
   FormDialog.Close;
end;

procedure TFormDialog.FormResize(Sender: TObject);
begin
   Memo1.width := FormDialog.clientwidth;
   Memo1.height := FormDialog.clientheight;
end;

procedure SelectLine (Memo: TMemo; index: integer);
var
  i: integer;
  start, fin: integer;

begin
  start:= 0;
  fin:= length(Memo.lines[index]);
  for i:= 0 to index -1 do begin
    start:= start + length(Memo.Lines[i]) + 2;
  end;
  memo.SetFocus;
  Memo.SelStart:= start;
  Memo.SelLength:= fin;
  ShowMessage(memo.SelText);
end;

function SuchenInMemo( Memo : TMemo; FindenStr, NichtFindenStr : string; LastFindLine : integer = -1 ) : integer;
var
  LineIdx : integer;
begin
  LineIdx := LastFindLine + 1;
  Result := 0;
  while
    ( LineIdx < Memo.Lines.Count ) and
    ( Result = 0 )
  do
    begin
      if
        ( Pos( FindenStr, Memo.Lines[ LineIdx ] ) > 0 ) and
        ( Pos( NichtFindenStr, Memo.Lines[ LineIdx ] ) = 0 )
      then
        begin
          Result := LineIdx;
          SelectLine( Memo, LineIdx );
        end
      else
        Inc( LineIdx );
    end;
end;


procedure TFormDialog.Suche1Click(Sender: TObject);
begin


  // Wenn Du die Edit-Felder nicht willst, dann schreib es doch einfach da rein

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

  MyLastFindLine := SuchenInMemo( Memo1, '*', 'far' );

end;





procedure TFormDialog.WeiterSuchen1Click(Sender: TObject);
begin

  // Wenn Du die Edit-Felder nicht willst, dann schreib es doch einfach da rein

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

  MyLastFindLine := SuchenInMemo( Memo1, '*', 'far', MyLastFindLine )
end;

end.

Nitron 21. Nov 2008 11:38

Re: Komplizierte suche in Memo ! Hilfe
 
ja aber das problem ist das da auch stehen kann u9* nicht unbedingt u8

es kann alles mögliche sein vor dem * und es muss eine leertaste davor sein

so : irgendwas|leer|irgendwas*
so irgendwas irgendwas*

wenn z.b das * alleine steht oder so ****** ohne das was direkt davor steht will ich das nicht angezeigt haben !

habt ihr mich verstanden ? ^^
das ist sehr wichtig das dass so ist !

HenKst 21. Nov 2008 11:55

Re: Komplizierte suche in Memo ! Hilfe
 
-.-
Also du willst quasi eine wildcard suche.
Das ist aber nicht ganz einfach weil eine wildcard nunmal für alles stehn kann.
Ein paar Einschränkungen wären ganz praktisch.

Wenn zum beispiel nur "u0".."u9" vor dem "*" stehn dürfte wär das relativ einfach zu lösen.
Aber "alles mögliche" ist verdammt viel.

Nitron 21. Nov 2008 11:56

Re: Komplizierte suche in Memo ! Hilfe
 
gibt es dafür kein befehl bzw code für alles mögliche?

HenKst 21. Nov 2008 12:04

Re: Komplizierte suche in Memo ! Hilfe
 
Da brauchst du ja eigentlich keinen code für.
Du musst ja nur den "*" suchen und schaun ob er alleine steht oder das nächste zeichen auch ein "*" ist.
Dann findest du alles was "*" endet.
Du könntest auch Delimited text mit "*" als delimter aufrufen.
Dann hättest du eine stringlist in der in jeder zeile ein string steht der mit "*" endete.

Das Problem ist halt das da tatsächlich alles mögliche stehen kann.
Ich kann mir nicht vorstellen das das wirklich ist was du willst.

Oder wäre "lkjgfgkdsfhgkshrbtz afkgjbhertb*" ein erlaubter string?

Nitron 21. Nov 2008 12:09

Re: Komplizierte suche in Memo ! Hilfe
 
also beispiele was erlaubt ist ! (LABEL ist ein Bespiel)

Label * ->soll er mir anzeigen weil es hier kein FAR gibt !
also mache ich selber eine korektur im Programm
Far Label *
OK! Das soll er mir nicht mehr anzeigen da jetzt Far da ist !

Das gleiche gilt bei x* soll er mir anzeigen ich verbessere das selber
far x*
okay jetz springt er weiter

steht da jetzt dfghjkl* soll er mir das anzeigen weil far fehlt ich mache wieder eine korektur
far dfghjkl*

steht da
d * soll er mir das auch anzeigen ich mach korrektur
far d *

steh da aber jetzt

pa_p* soll er mir das auch anzeigen ich mach korrektur
far pa_p*

steht da aber jetzt /* dann soll er mir das net anzeigen oder }/* oder so.......

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 02:36 Uhr.
Seite 1 von 2  1 2      

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