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
 
#6

Re: TRichEdit - CFM_Link : nach SaveToFile ist alles futsch

  Alt 31. Okt 2007, 21:51
Hallo Zusammen!
Habe jetzt eine Lösung gefunden, auch nach dem Speichern und Wiedereinlesen aus einer Datei einen mit CFM_Link formatierten Textteil wiederherzustellen. Nachdem Volker bestätigte, dass dies von MS nicht vorgesehen ist, habe ich mich also auf eine eigene Lösung konzentrieren können. Vorab: Sie erscheint mir nicht sonderlich elegant und noch optimierungsfähig - aber sie hat den Charme in nur etwas mehr als einer Stunde entstanden zu sein.

Grundidee ist, die CFM_Link-Formatierung vor dem Speichern in eine andere Formatierung zu konvertieren und dies nach dem Einlesen aus der Datei wieder rückgängig zu machen. Diese "temporäre Hilfsformatierung" muss nun eine sein, die a) auch gespeichert und b) vom Anwender nicht vermisst wird.

Ich habe mich für CFM_Revised entschieden - kann mir im Augenblick nicht vorstellen, dass diese Formatierung im Rahmen meiner Programme benötigt wird. Insgesamt sind folgende 4 Prozeduren/Funktionen notwendig (hier ist deutliches Optimierungspotential) :

Delphi-Quellcode:
procedure reSetLink(re:TRichEdit;Start,Length:Integer;SwitchOn:Boolean);
var CF2 : TCharFormat2;
    OldRange,NewRange : TCharRange;
begin
  FillChar(CF2,SizeOf(CF2),0);
  CF2.cbSize:=SizeOf(CF2);
  CF2.dwMask:=CFM_Link;
  if SwitchOn then CF2.dwEffects:=CFE_Link;

  NewRange.cpMin:=Start;
  NewRange.cpMax:=Start+Length;

  SendMessage(re.Handle,EM_ExGetSel,0,LParam(@OldRange));
  SendMessage(re.Handle,EM_ExSetSel,0,LParam(@NewRange));
  SendMessage(re.Handle,EM_SetCharFormat,SCF_Selection,LParam(@CF2));
  SendMessage(re.Handle,EM_ExSetSel,0,LParam(@OldRange));
end;
Delphi-Quellcode:
function reIsLink(re:TRichEdit;Position:Integer):Boolean;
var CF2 : TCharFormat2;
    OldRange,NewRange : TCharRange;
begin
  FillChar(CF2,SizeOf(CF2),0);
  CF2.cbSize:=SizeOf(CF2);
  CF2.dwMask:=CFM_Link;

  NewRange.cpMin:=Position;
  NewRange.cpMax:=Position+1;

  SendMessage(re.Handle,EM_ExGetSel,0,LParam(@OldRange));
  SendMessage(re.Handle,EM_ExSetSel,0,LParam(@NewRange));
  SendMessage(re.Handle,EM_GetCharFormat,SCF_Selection,LParam(@CF2));
  SendMessage(re.Handle,EM_ExSetSel,0,LParam(@OldRange));

  Result:=CF2.dwEffects and CFE_Link=CFE_Link;
end;
Delphi-Quellcode:
procedure reSetRevised(re:TRichEdit;Start,Length:Integer;SwitchOn:Boolean);
var CF2 : TCharFormat2;
    OldRange,NewRange : TCharRange;
begin
  FillChar(CF2,SizeOf(CF2),0);
  CF2.cbSize :=SizeOf(CF2);
  CF2.dwMask :=CFM_Revised;
  if SwitchOn then CF2.dwEffects:=CFE_Revised;

  NewRange.cpMin:=Start;
  NewRange.cpMax:=Start+Length;

  SendMessage(re.Handle,EM_ExGetSel,0,LParam(@OldRange));
  SendMessage(re.Handle,EM_ExSetSel,0,LParam(@NewRange));
  SendMessage(re.Handle,EM_SetCharFormat,SCF_Selection,LParam(@CF2));
  SendMessage(re.Handle,EM_ExSetSel,0,LParam(@OldRange));
end;
Delphi-Quellcode:
function reIsRevised(re:TRichEdit;Position:Integer):Boolean;
var CF2 : TCharFormat2;
    OldRange,NewRange : TCharRange;
begin
  FillChar(CF2,SizeOf(CF2),0);
  CF2.cbSize:=SizeOf(CF2);
  CF2.dwMask:=CFM_Revised;

  NewRange.cpMin:=Position;
  NewRange.cpMax:=Position+1;

  SendMessage(re.Handle,EM_ExGetSel,0,LParam(@OldRange));
  SendMessage(re.Handle,EM_ExSetSel,0,LParam(@NewRange));
  SendMessage(re.Handle,EM_GetCharFormat,SCF_Selection,LParam(@CF2));
  SendMessage(re.Handle,EM_ExSetSel,0,LParam(@OldRange));

  Result:=CF2.dwEffects and CFE_Revised=CFE_Revised;
end;

Speichern und Laden erfolgen dann nach folgendem beispielhaften Schema:

Delphi-Quellcode:
procedure reSave(var RE:TRichEdit;FName:String);
var i : Integer;
begin
  for i:=0 to length(RE.Text)-1 do // konvertiere Link-Attribut
    if reIsLink(RE,i) then reSetRevised(RE,i,1,true); // in Revised-Attribut
  RE.SaveToFile(FName); // und nun Speichern
end;
Delphi-Quellcode:
procedure reLoad(var RE:TRichEdit;FName:String);
var i : Integer;
begin
  RE.LoadFromFile(FName); // aus der Datei einlesen und
  for i:=0 to length(RE.Text)-1 do // konvertiere Revised-Attribut
    if reIsRevised(RE,i) then reSetLink(RE,i,1,true); // zurück in Link-Attribut
end;
So, auch wenn die Resonanz auf meine Anfrage recht bescheiden war, vielleicht kann es ja doch der eine oder andere gebrauchen ...

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 07:51 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