Einzelnen Beitrag anzeigen

taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#6

AW: Richedit: Suche nach Attributen (z.B. fsBold)

  Alt 9. Dez 2021, 09: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
  Mit Zitat antworten Zitat