Delphi - RTF szerkesztő a TRichEdit komponenshez

RTF 3. rész

forráskód letöltése
Cikksorozatunk befejező részében sort kerítünk arra, hogy a TRichEdit komponensbe szerkesztési időben beírt és megformázott szövegnél a formázási információk is tárolásra kerüljenek az adott Form DFM állományában, így a project újbóli megnyitása esetén a szöveg formázása is megmarad. A mellékelt példaprogram megnyitása előtt a StoredRichEdit.pas-ban lévő komponenst telepítenie kell a Delphi alá. A múlt heti cikkben mellékelt RTFEditor02.pas-ban lévő objektum szintén installálva kell hogy legyen, ha esetleg ezt törölte, akkor most telepítse újra a mostani példa megnyitása előtt.

Ahhoz, hogy a beírt szöveg formázási tulajdonságai is mentésre kerüljenek, szükségünk lesz egy új komponensre, mivel az eredeti nem rendelkezik ilyen funkciókkal. Ezt a komponenst a TRichEdit-ből származtatjuk.

Az új komponensbe definiálunk egy új property-t, melyet a gyakorlatban published property-ként kezelhetünk, viszont nem jelenik meg sehol.

Ezt a komponens DefineProperties eljárását felülírva oldjuk meg. Itt paraméterként kapunk egy TFiler objektumot. Ennek DefineProperty eljárását hívva adhatunk meg új property-t. Első paraméterként az új property nevét adjuk meg sztringként. Másodikként és harmadikként egy-egy eljárást kell megadnunk, melyek a property olvasásáért illetve írásáért felelősek. Utolsó paraméterként egy logikai adatra van szükség, hogy a property-nk rendelkezik-e értékkel. Nyilván, hogy ha a komponens Lines property-e üres, akkor az RTF formázási információt sem kell tárolnunk.
procedure TStoredRichEdit.DefineProperties(Filer: TFiler);
  function DoWrite: Boolean;
  begin
    result:=true;
    FS:=LinesToString(Self);
    if Assigned(Filer.Ancestor) then begin
      if Filer.Ancestor is TStoredRichEdit then begin
        result:=FS<>TStoredRichEdit(Filer.Ancestor).FS;
      end;
    end else begin
      result:=Lines.Count>0;
    end;
  end;
begin
  inherited;
  Filer.DefineProperty('RTFTextData', ReadData,
      WriteData, DoWrite);
end;
Amikor erre a property-re szükség van, akkor automatikusan meghívásra kerül az a két eljárás, melyet paraméterként átadtunk. Amikor ki kell írni a property tartalmát a DFM-be, akkor fut a WriteData eljárásunk. Itt attól függően, hogy egyszerű vagy formázott szöveg van-e a komponensben, vagy kiírjuk csak a szöveget, vagy az RTF-et konvertáljuk sztringgé és ezt írjuk ki a DFM-be.
procedure TStoredRichEdit.WriteData(Writer: TWriter);
begin
  if PlainText then begin
    Writer.WriteString(Lines.Text);
  end else begin
    Writer.WriteString(LinesToString(Self));
  end;
end;
A property beolvasása hasonlóan történik ehhez.
procedure TStoredRichEdit.ReadData(Reader: TReader);
begin
  if PlainText then begin
    Lines.Text:=Reader.ReadString;
  end else begin
    StringToLines(Reader.ReadString, Self);
  end;
end;


RTF cikksorozat