Nope, vil gerne ha et helt procedure
Hej,
Du kan bruge RichEdit's egen FindText funktion eller bruge SearchBuf.
Jeg har lavet et eks. som bruger SearchBuf. Det kan både søge frem og tilbage.
Jeg har lavet det sådan at du har en record som indeholder søge informationerne (så du kan lave en "søg næste"). I denne record har jeg også lagt informationer så du på en nem måde kan tilføje en "replace" funktionalitet. Jeg har ikke lagt så mange kommentarer ind men hvis der er noget du ikke kan forstå så spørger du bare
Når du trykker på "test" knappen så bliver alle de steder i teksten, som søge rutinen finder, highlight'et med en rød font. Du skal skrive det som du søger efter i edit feltet ved siden af knappen.
"DoSearch" funktionen burde nemt kunne skrives om så den bruger FindText i steder for, men du vil midste funktionaliteten til at søge baglængs.
Jeg har ikke testet programmet 100% igennem med det burde give dig en god ide om hvordan det kan gøres.
Jeg har inkluderet kode (.pas) og form (.frm) filerne her under:
(unit1.pas)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
re: TRichEdit;
Edit1: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
StrUtils;
type
TSearchDir = (sdUp, sdDown);
TSearchAction = (saWrapAround, saReplace, saFinished, saWholeWord, saMatchCase);
TSearchActions = set of TSearchAction;
TSearchType = record
Buf : PChar; // Buffer som der skal søges i.
Start : Integer; // Start pos der skal søge fra.
Len : Integer; // Længden fra start til slutningen af det der skal søge på.
Current : Integer; // Den aktuelle position i Buf.
FoundStart : Integer; // Fundet start pos på det der søges efter.
FoundLen : Integer; // Længden på det der er fundet.
Replace : PChar; // Angiver hvad der skal replaces med.
SearchStr : String; // Det vi skal søge efter.
Direction : TSearchDir; // Angiver om der skal søges frem eller tilbage.
Action : TSearchActions; // Angiver hvordan der søges og om vi er færdige osv.
end;
function StartSearch( const ABuf : PChar;
ASearchFrom : Integer;
ASearchLength : Integer;
ASearchFor : String;
ASearchDir : TSearchDir;
ASearchAction : TSearchActions) : TSearchType;
begin
Result.Buf := ABuf;
Result.Start := ASearchFrom;
Result.Len := ASearchLength;
Result.Current := ASearchFrom;
Result.FoundStart := -1;
Result.FoundLen := -1;
Result.Replace := nil;
Result.Direction := ASearchDir;
Result.Action := ASearchAction;
Result.SearchStr := ASearchFor;
Exclude(Result.Action, saFinished);
end;
function DoSearch(var ASearch : TSearchType) : Boolean;
var
Op : TStringSearchOptions;
Res : PChar;
begin
Result := False;
Op := [];
if (saWholeWord in ASearch.Action) then
Include(Op, soWholeWord);
if (saMatchCase in ASearch.Action) then
Include(Op, soMatchCase);
if (ASearch.Direction = sdUp) then
begin
Res := SearchBuf(ASearch.Buf,
StrLen(ASearch.Buf),
ASearch.Current,
ASearch.Len-(ASearch.Current-ASearch.Start),
ASearch.SearchStr, Op);
end
else
begin
Include(Op, soDown);
Res := SearchBuf(ASearch.Buf,
StrLen(ASearch.Buf),
ASearch.Current,
0,
ASearch.SearchStr, Op);
end;
if (Res = nil) then
begin
Include(ASearch.Action, saFinished); // Signal we are finished
if (saWrapAround in ASearch.Action) then
begin // Okay, we need to search again and see if we can find it.
Exclude(ASearch.Action, saWrapAround); // remove wraparound action.
ASearch.Current := ASearch.Start;
Result := DoSearch(ASearch);
end;
end
else
begin
ASearch.FoundStart := Integer(Res)-(Integer(ASearch.Buf)+ASearch.Start);
ASearch.Current := ASearch.FoundStart;
ASearch.FoundLen := Length(ASearch.SearchStr);
Result := True;
if (ASearch.Direction = sdDown) then
begin
if (saWholeWord in ASearch.Action) then
ASearch.Current := ASearch.Current+ASearch.FoundLen
else
ASearch.Current := ASearch.Current+1;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Buf : PChar;
S : TSearchType;
L : Integer;
begin
Buf := re.Lines.GetText;
L := StrLen(Buf);
S := StartSearch(Buf, 0, L, Edit1.Text, sdDown, []);
with re do
begin
SelStart := 0;
SelLength := L;
SelAttributes.Color := clBlack;
SelAttributes.Style := [];
end;
while DoSearch(S) do
begin
Memo1.Lines.Add('Search:');
Memo1.Lines.Add(' Pos: '+IntToStr(S.FoundStart));
Memo1.Lines.Add(' Len: '+IntToStr(S.FoundLen));
Memo1.Lines.Add(' Cur: '+IntToStr(S.Current));
with re do
begin
SelStart := S.FoundStart;
SelLength := S.FoundLen;
SelAttributes.Color := clRed;
SelAttributes.Style := [fsBold];
end;
end;
end;
end.
(unit1.frm)
object Form1: TForm1
Left = 256
Top = 140
Width = 707
Height = 366
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 8
Top = 312
Width = 65
Height = 25
Caption = 'Test'
TabOrder = 0
OnClick = Button1Click
end
object re: TRichEdit
Left = 0
Top = 0
Width = 409
Height = 305
HideScrollBars = False
Lines.Strings = (
'Hejsa '
''
'Jeg vil gerne vide hvordan man kan finde en text man s'#248'ger p'#229' i ' +
'en RichEdit1? '
'Og sef'#248'lig ogs'#229' g'#229' ned i koden til hvor det er ;) '
''
'HJ'#198'LP Tak '
''
'[Redigeret d. 30/06-03 19:30:13 af Bamse]'
''
'[Redigeret d. 30/06-03 19:30:25 af Bamse] </vis_ui.php?id=1748>'
'Armen L.A. </vis_ui.php?id=1748>'
''
'30-06-03 21:32'
'Kommentar '
' </vis_ui.php?id=1748> </vis_ui.php?id=1748> <send_message.php?t' +
'ilui=1748'
'&mode=direkte&fraui=3287> <send_message.php?tilui=1748&mode=dire' +
'kte&fraui='
'3287> <post.php?isSvar=yeah&techid=2&f=2&t=955&m=3973> <post.php' +
'?'
''
'*************************************** '
'***************** nife ****************** '
'*************************************** ] '
''
'Det ville stadig v'#230're bedre med en finddialog')
TabOrder = 1
end
object Edit1: TEdit
Left = 80
Top = 312
Width = 121
Height = 21
TabOrder = 2
end
object Memo1: TMemo
Left = 416
Top = 0
Width = 281
Height = 305
TabOrder = 3
end
end
/Michael.
[Redigeret d. 03/07-03 13:16:09 af Michael Skovslund]