![]() |
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:
Ich will aber das er mit die Zeilen makiert in der Irgendwas* und in der gleichen zeile kein Far steht
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. ------------------------------------ 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 |
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:
suchtext1 ist der Text der gefunden werden soll, suchtext2 der Text der nicht vorhanden sein soll.
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; 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 |
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 ! |
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? |
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* |
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]); |
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 |
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:
Es soll ja nur irgendwas getan werden wenn dieser in der Zeile nicht vorhanden ist. |
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. |
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,...); |
Re: Komplizierte suche in Memo ! Hilfe
huch
da fehlen die ) bei den pos ;) Kommt davon wenn man blind kopiert^^
Delphi-Quellcode:
so müsste es aussehn
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; |
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 ! |
Re: Komplizierte suche in Memo ! Hilfe
Zitat:
habe das jetzt so
Delphi-Quellcode:
er sagt mir aber das ich ungenügende parameter habe !
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); |
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:
Das sollte dir eine gesuchte Zeile markierenprocedure 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; Ist aber nicht getestet^^ |
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 ! |
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 ? |
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:
GreeZ HenKst
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; |
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:
Im Programm rufst du das so auf:
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;
Delphi-Quellcode:
cu
// 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 ); Oliver [edit]der fehler ist nun behoben[/edit] [edit2]jetzt tut die function genau das was sie soll :mrgreen: [/edit2] |
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 !
|
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 ? |
Re: Komplizierte suche in Memo ! Hilfe
Zitat:
Zitat:
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 |
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 |
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 ! |
Re: Komplizierte suche in Memo ! Hilfe
*auchcodeklau*
Delphi-Quellcode:
das ist doch (fast) genau was diese Abfrage macht.
if
( Pos( FindenStr, Memo.Lines[ LineIdx ] ) > 0 ) and ( Pos( NichtFindenStr, Memo.Lines[ LineIdx ] ) = 0 ) then 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 2:
Fall 1:
String= "far blablal u8*" (Pos( "u8*", string) <> 0) = true and (Pos( "far", string) = 0 ) = false durchlauf beendet;
Code:
String= "blablal u8*"
(Pos( "u8*", string) <> 0) = true string:= copy(string, 1, Pos( "u8*", string)); and (Pos( "far", string) = 0 ) = true markierung beginnt; |
Re: Komplizierte suche in Memo ! Hilfe
Zitat:
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. |
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 ! |
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. |
Re: Komplizierte suche in Memo ! Hilfe
gibt es dafür kein befehl bzw code für alles mögliche?
|
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? |
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....... |
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 ! |
Re: Komplizierte suche in Memo ! Hilfe
na dann...
mit pos:
Delphi-Quellcode:
mit delimitedtext (find ich schöner^^)
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;
Delphi-Quellcode:
Das sollte erstmal alles finden.
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; Für ausnahmen musst du dir wohl einen array von strings machen die nicht vor '*' stehen dürfen. |
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 |
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: |
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? |
Re: Komplizierte suche in Memo ! Hilfe
(str[p+1] <> '*') AND//'*' steht alleine?
muss da hin ;) |
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? |
Re: Komplizierte suche in Memo ! Hilfe
hap
ich hab als Suchstring jetzt permanent '*' angenommen, der wird also nicht mehr übergeben.
Delphi-Quellcode:
müsste also reichen
MyLastFindLine := SuchenInMemo( Memo1, Edit2.Text, MyLastFindLine )
|
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; |
Re: Komplizierte suche in Memo ! Hilfe
Zitat:
in dem fall wäre das mit
Delphi-Quellcode:
vermutlich gelöst, aber es gibt bestimmt noch mehr solcher fälle
if (pos('/', str) > 0) and (pos('/', str) < pos('*', str))
also bauen wir uns ne funktion ;)
Delphi-Quellcode:
der übergibst du deinen ausnahmen array und die memozeile
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; 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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:36 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