Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
Delphi 7 Professional
|
AW: Richedit: Suche nach Attributen (z.B. fsBold)
9. Dez 2021, 10:34
Moin, Moin,
es geht in der Tat schneller. Meine Lösung wäre diese:
Delphi-Quellcode:
procedure InitCF2(var CF2:TCharFormat2;Mask:DWord);
begin
FillChar(CF2,SizeOf(CF2),0);
CF2.cbSize:=SizeOf(CF2);
CF2.dwMask:=Mask
end;
procedure GetCharFormat(RE:TRichEdit;var CF2:TCharFormat2;Start,Length:LongInt);
var SelRange : TCharRange;
begin
SelRange.cpMin:=Start;
SelRange.cpMax:=Start+Length;
RE.Perform(EM_ExSetSel,0,LParam(@SelRange));
RE.Perform(EM_GetCharFormat,SCF_Selection,LParam(@CF2));
end;
var FOldEventMask : LongInt;
procedure BeginUpdate(RE:TRichEdit;LockEvents:Boolean=true);
begin
if LockEvents then FOldEventMask:=SendMessage(RE.Handle,EM_SetEventMask,0,0);
SendMessage(RE.Handle,WM_SetRedraw,0,0)
end;
procedure EndUpdate(RE:TRichEdit;UnLockEvents:Boolean=true);
begin
SendMessage(RE.Handle,WM_SetRedraw,1,0);
if UnlockEvents then SendMessage(RE.Handle,EM_SetEventMask,0,FOldEventMask )
end;
procedure TfoTest07.buFindPosClick(Sender:TObject);
var CF2 : TCharFormat2;
i,SelStart,SelLen : Integer;
begin
BeginUpdate(RE);
laInfo.Caption:='';
//InitAndStartTimer;
SelStart:=RE.SelStart; // backup selection
SelLen :=RE.SelLength;
InitCF2(CF2,CFM_Bold);
for i:=1 to length(RE.Text) do begin
GetCharFormat(RE,CF2,i,1);
if cf2.dwEffects and cfm_Bold=cfm_Bold then begin laInfo.Caption:='Bold attribute found at '+IntToStr(i);
Break;
end;
end;
RE.SelStart :=SelStart; // restore selection
RE.SelLength:=SelLen;
if laInfo.Caption='' then laInfo.Caption:='No bold attribute found';
//StopAndShowTimer;
EndUpdate(RE);
RE.SetFocus;
end;
Auf diese Weise findet sich die Positon in einem 65.535 Zeichen langen Richedit auf einem nicht sonderlich schnellen PC in etwa einer halben Sekunde, wenn die letzten Zeichen in BOLD formatiert sind.
Gruß Ralph
Ralph
|
|
Zitat
|