AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TRichEdit - CFM_Link : nach SaveToFile ist alles futsch
Thema durchsuchen
Ansicht
Themen-Optionen

TRichEdit - CFM_Link : nach SaveToFile ist alles futsch

Ein Thema von taaktaak · begonnen am 30. Okt 2007 · letzter Beitrag vom 2. Nov 2007
 
taaktaak

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

Re: TRichEdit - CFM_Link : nach SaveToFile ist alles futsch

  Alt 2. Nov 2007, 08:15
Moin, Moin.

Hmmm, mit dem Optimieren ist das so eine Sache.

1. Das Speichern ist nicht so kritisch, da der Anwender hier keine so hohe Anforderung hat, sofort eine optische Rückmeldung zu erhalten.

2. Anders beim Laden aus der Datei, nach Auswahl des Textes in einer Auswahlliste sollte das RichEdit (im Optimalfall) praktisch sofort gefüllt sein - leider bremst die Prüfung auf vorhande Revised-Attribute im Text den Ladevorgang enorm aus (Ladezeit für etwa 13000 Zeichen langen Text auf einem Notebook: über 3 Sekunden).

Habe nun die für den Ladevorgang zuständigen Routinen verbessert:

Delphi-Quellcode:
  function IsRevised(re:TRichEdit;Position:Integer):Boolean;
  var NewRange : TCharRange;
  begin
    NewRange.cpMin:=Position;
    NewRange.cpMax:=Position+1;
    SendMessage(re.Handle,EM_ExSetSel,0,LParam(@NewRange));
    SendMessage(re.Handle,EM_GetCharFormat,SCF_Selection,LParam(@CF2Get));
    Result:=CF2Get.dwEffects and CFE_Revised=CFE_Revised;
  end;

  procedure SetLink(re:TRichEdit;Position:Integer);
  var NewRange : TCharRange;
  begin
    NewRange.cpMin:=Position;
    NewRange.cpMax:=Position+1;
    SendMessage(re.Handle,EM_ExSetSel,0,LParam(@NewRange));
    SendMessage(re.Handle,EM_SetCharFormat,SCF_Selection,LParam(@CF2Set));
  end;
Gegenüber der Ursprungsversion sind die Initialisierungen 'raus (muss ja nicht 13.000x initialisiert werden). Ebenso Save/Restore der SelPosition. Die eigentliche Ladeprozendur sieht dann beispielhaft folgendermassen aus (im Original abweichend, nur um das Schema zu demonstrieren):

Delphi-Quellcode:
procedure Load(var RE:TRichEdit;FName:String);
var i : Integer;
    CF2Get,
    CF2Set : TCharFormat2;
  
  FillChar(CF2Get,SizeOf(CF2Get),0);
  CF2Get.cbSize:=SizeOf(CF2Get);
  CF2Get.dwMask:=CFM_Revised;

  FillChar(CF2Set,SizeOf(CF2Set),0);
  CF2Set.cbSize :=SizeOf(CF2Set);
  CF2Set.dwMask :=CFM_Link;
  CF2Set.dwEffects:=CFE_Link;
  
  RE.Lines.BeginUpdate;
  RE.Lines.LoadFromFile(FName);

  for i:=0 to length(RE.Text)-1 do // konvertiere Revised-Attribut
    if IsRevised(RE,i) then SetLink(RE,i); // zurück in Link-Attribut

  RE.Lines.EndUpdate;

  // ...
end;
"Rumbasteln" an der FOR-Schleife, die den RichEdit-Text prüft und ggf. das Attribut konvertiert, brachten bisher leider NUR Geschwindigkeitsnachteile (z.B. wortweise weiter, wenn am Anfang des Textes kein Attribut gefunden).

Die Ladezeit konnte nun auf etwas über 2 Sekunden reduziert werden - ist aber immer noch zu lang. Hat jemand eine Idee?

Gruß Ralph

PS : Muss jetzt mal was für die Firma tun und bin erst mal nicht am PC
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 07:48 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-2025 by Thomas Breitkreuz