AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Dieter.Soergel · begonnen am 8. Dez 2021 · letzter Beitrag vom 9. Dez 2021
 
taaktaak

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

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

  Alt 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
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:12 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 by Thomas Breitkreuz