Entwickler-Ecke

Sonstiges (Delphi) - Text suchen und Selectiren bis zu einem bestimmten Zeichen.


F.Art - So 06.07.03 14:59
Titel: Text suchen und Selectiren bis zu einem bestimmten Zeichen.
Wie macht man es das er bis zu einem bestimmten Zeichen oder Zeichenfolge scannen läst um dies dann raus zu kopieren?



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function SearchAndSelect(Quelltext:TMemo; const Search: String): Boolean;
var
  FoundPos: Integer;
begin
  Result := False;
  if Length(Search) < 1 then
    Exit;
  FoundPos := Pos(Search, Quelltext.Text);
  if FoundPos < 1 then
    Exit;
  with Quelltext do
  begin
    SelStart := FoundPos +4;
    SelLength := Length(Search)+9;
    SetFocus;
  end;
  Result := True;
end;


Moritz M. - So 06.07.03 15:53

Auf was genau willst du hinaus?


F.Art - So 06.07.03 17:47


Quelltext
1:
a:link,a:active,a:visited { color : #006699; }                    


Das er den Text 'active' such und von tive bis color alles makiert und woanders ins Delphi Projekt verwendet. Und die länge des zu selektierenden Textes ist immer unterschiedlich lang.


Wolff68 - So 06.07.03 21:55

Hier eine Routine, die alle Möglichkeiten des FindDialogs ausnützt.
(TFindDialog findest auf der Seite Dialoge)
Die Trennzeichen kann man auch noch erweitern, wenn man will.
Diese werden benötigt für die "Ganzes Wort"-Suche.

Aus folgendem Grund verwende ich hier nicht die Pos-Funktion.
Erstens kann man damit nicht rückwärts suchen, zweitens muß immer der String zerlegt werden.

Eventuelle Probleme: Wenn der Suchstring ganz am Anfang, oder Ende des Textes steht, und mit "Ganzes Wort" gesucht wird.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
implementation

{$R *.dfm}

const Trennzeichen = [' ',',','.','!','?','"'];

procedure TForm1.Button1Click(Sender: TObject);
begin
  FindDialog1.Execute;
end;

procedure TForm1.FindDialog1Find(Sender: TObject);

  function Vergleiche(j: Integer): Boolean;
  var found : String;
  begin
    Found := Copy(Memo1.Text, j-1, Length(FindDialog1.FindText)+2);
    Result := false;
    IF frMatchCase in FindDialog1.Options then begin // Groß-Klein beachten
      IF Copy(Memo1.Text, j, Length(FindDialog1.FindText))
         = FindDialog1.FindText then Result := true;
    end
    else begin // Groß-Klein egal
      IF LowerCase(Copy(Memo1.Text, j, Length(FindDialog1.FindText)))
         = LowerCase(FindDialog1.FindText) then Result := true;
    end;

    { Nur ganze Wörter? Dann vorher und nachher Trennzeichen abfragen}
    IF (Result = true) AND (frWholeWord in FindDialog1.Options) then begin
      Result := (Memo1.Text[j-1in Trennzeichen)
                AND
                (Memo1.Text[j+Length(FindDialog1.FindText)] in Trennzeichen);
    end;
  end;

var
  i : Integer;
begin
  IF frDown in FindDialog1.Options then begin // Abwärts suchen
    For i := Memo1.SelStart+Memo1.SelLength to Length(Memo1.Text) do begin
      IF Vergleiche(i) then begin // Gefunden
        Memo1.SelStart  := i-1;
        Memo1.SelLength := Length(FindDialog1.FindText);
        Exit;
      end;
    end;
    ShowMessage('Text nicht gefunden!');
  end
  else begin // Aufwärts suchen
    For i := Memo1.SelStart downto 0 do begin
      IF Vergleiche(i) then begin // Gefunden
        Memo1.SelStart  := i-1;
        Memo1.SelLength := Length(FindDialog1.FindText);
        Exit;
      end;
    end;
    ShowMessage('Text nicht gefunden!');
  end;
end;


Sollte eigentlich sein, was Du suchst.