Solved

Set the RichEdit1 with the chosen fontname and size.

Posted on 2009-06-29
2
414 Views
Last Modified: 2012-05-07
Dear Experts,

I have a MainForm with a Richtedit on it and a dialog form called Settings
with a Combox (to choose the fontname) and an Edit with an UpDown component
(for choosing the fontsize). The chosen fontname and size will be save and
loaded from an INI-file. Now I have to tell the richedit to load the saved
fontname and size at startup of my application.  How can I do that. Who
can help me...

Greetings,

Peter Kiers



SETTINGS FORM: 

============

 

 private

    { Private declarations }

    fSettingsFile: string; 

    procedure LoadSettings;

    procedure SaveSettings;

  public

    { Public declarations }

  end;
 

var

  SettingsDlg: TSettingsDlg;

  fFontName: string;      

  fFontSize: Integer;    
 

implementation
 

uses Main;
 

{$R *.dfm}
 

procedure TSettingsDlg.FontNameChange(Sender: TObject);

begin

  fFontName := FontName.Items[FontName.ItemIndex];   

end;

(*-----------------------------------------*)

procedure TSettingsDlg.FontSizeChange(Sender: TObject);

begin

  fFontSize := StrToInt(FontSize.Text);       

end;

(*-----------------------------------------*)

procedure TSettingsDlg.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  SaveSettings;

end;

(*-----------------------------------------*)

procedure TSettingsDlg.FormCreate(Sender: TObject);

begin

  fSettingsFile := ChangeFileExt(Application.ExeName, '.ini'); 

  FontName.Items := Screen.Fonts;    

end;

(*-----------------------------------------*)

procedure TSettingsDlg.FormShow(Sender: TObject);

begin   

  LoadSettings;  

  FontName.ItemIndex := FontName.Items.IndexOf(fFontName);

  FontSize.Text := IntToStr(fFontSize);

end;

(*-----------------------------------------*)

procedure TSettingsDlg.LoadSettings;

var ini: TIniFile;

begin

  ini := TIniFile.Create(fSettingsFile);

  try

    fFontName := ini.ReadString('FONT', 'FaceName', fFontName);     

    fFontSize := ini.ReadInteger('FONT', 'PointSize', fFontSize);   

  finally

    FreeAndNil(ini);

  end;

end;

(*-----------------------------------------*)

procedure TSettingsDlg.SaveSettings;

var ini: TIniFile;

begin

  ini := TIniFile.Create(fSettingsFile);

  try

    ini.WriteString('FONT', 'FaceName', fFontName);    

    ini.WriteInteger('FONT', 'PointSize', fFontSize);    

  finally

    FreeAndNil(ini);

  end;

end;

(*-----------------------------------------*)

end.
 

MAINFORM: 

============

procedure TMainForm.Settings1Click(Sender: TObject);

var

  dlgSettingsDialog: TSettingsDlg;

  SaveSelStart, SaveSelLength: Integer;

begin

  dlgSettingsDialog := TSettingsDlg.Create(Self);

  try

    dlgSettingsDialog.ShowModal;

  finally

   if RichEdit1.Text <> '' then

    begin

    SaveSelStart := RichEdit1.SelStart;

    SaveSelLength := RichEdit1.SelLength;

    RichEdit1.SelectAll;

    RichEdit1.SelAttributes.Name := dlgSettingsDialog.FontName.Text;

    RichEdit1.SelAttributes.Size := StrToInt(dlgSettingsDialog.FontSize.Text);

    RichEdit1.SelStart := SaveSelStart;

    RichEdit1.SelLength := SaveSelLength;

  end else

  begin

    RichEdit1.Font.Name := dlgSettingsDialog.FontName.Text;

    RichEdit1.Font.Size := StrToInt(dlgSettingsDialog.FontSize.Text);

  end;

  end;

  FreeAndNil(dlgSettingsDialog);

end;

Open in new window

0
Comment
Question by:peterkiers
2 Comments
 
LVL 36

Accepted Solution

by:
Geert Gruwez earned 500 total points
Comment Utility
i guess you like circular unit referencing ?

try it like this (can be used from any form containing a richedit)
try and prevent global variables, using implementation variables instead !

if the user presses cancel (or close) your code applies the settings anyway ...

it's a little problem to set one way of loading/saving settings.
This time i used the form, most of the time i use a separate object (not a form) for loading/saving the settings

your try finally for dlgSettingsDialog is wrong too ...
SETTINGS FORM: 

============

 

 private

    { Private declarations }

    fSettingsFile: string; 

    fFontName: string;      

    fFontSize: Integer; 

    procedure LoadSettings;

    procedure SaveSettings;

  public

    { Public declarations }

  end;

 

var

  SettingsDlg: TSettingsDlg;
 

procedure RichEditSettings(ARichEdit: TRichEdit; LoadFromIni: Boolean = False);  

 

implementation

 

{$R *.dfm}
 

procedure RichEditSettings(ARichEdit: TRichEdit; LoadFromIni: Boolean = False);  

var

  dlgSettingsDialog: TSettingsDlg;

  SaveSelStart, SaveSelLength: Integer;

  Apply: Boolean;

begin

  if Assigned(ARichEdit) then 

  begin

    dlgSettingsDialog := TSettingsDlg.Create(ARichEdit.Owner);

    try

      Apply := False;

      with dlgSettingsDialog do 

      begin 

        if LoadFromIni then 

        begin

          LoadSettings;

          Apply := True;

        end else if dlgSettingsDialog.ShowModal = mrOk then 

          Apply := True;

        if Apply then 

        begin

          if ARichEdit.Text <> '' then

          begin

            SaveSelStart := ARichEdit.SelStart;

            SaveSelLength := ARichEdit.SelLength;

            ARichEdit.SelectAll;

            ARichEdit.SelAttributes.Name := fFontName;

            ARichEdit.SelAttributes.Size := fFontSize;

            ARichEdit.SelStart := SaveSelStart;

            ARichEdit.SelLength := SaveSelLength;

          end else

          begin

            ARichEdit.Font.Name := fFontName;

            ARichEdit.Font.Size := fFontSize;

          end;

        end;

      end;

    finally

      FreeAndNil(dlgSettingsDialog);

    end;

  end else 

    Raise Exception.Create('Richedit not assigned !');

end;

  

procedure TSettingsDlg.FontNameChange(Sender: TObject);

begin

  fFontName := FontName.Items[FontName.ItemIndex];   

end;

(*-----------------------------------------*)

procedure TSettingsDlg.FontSizeChange(Sender: TObject);

begin

  fFontSize := StrToInt(FontSize.Text);       

end;

(*-----------------------------------------*)

procedure TSettingsDlg.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  SaveSettings;

end;

(*-----------------------------------------*)

procedure TSettingsDlg.FormCreate(Sender: TObject);

begin

  fSettingsFile := ChangeFileExt(Application.ExeName, '.ini'); 

  FontName.Items := Screen.Fonts;    

end;

(*-----------------------------------------*)

procedure TSettingsDlg.FormShow(Sender: TObject);

begin   

  LoadSettings;  

  FontName.ItemIndex := FontName.Items.IndexOf(fFontName);

  FontSize.Text := IntToStr(fFontSize);

end;

(*-----------------------------------------*)

procedure TSettingsDlg.LoadSettings;

var ini: TIniFile;

begin

  ini := TIniFile.Create(fSettingsFile);

  try

    fFontName := ini.ReadString('FONT', 'FaceName', fFontName);     

    fFontSize := ini.ReadInteger('FONT', 'PointSize', fFontSize);   

  finally

    FreeAndNil(ini);

  end;

end;

(*-----------------------------------------*)

procedure TSettingsDlg.SaveSettings;

var ini: TIniFile;

begin

  ini := TIniFile.Create(fSettingsFile);

  try

    ini.WriteString('FONT', 'FaceName', fFontName);    

    ini.WriteInteger('FONT', 'PointSize', fFontSize);    

  finally

    FreeAndNil(ini);

  end;

end;

(*-----------------------------------------*)

end.

 

MAINFORM: 

============

procedure TMainForm.Settings1Click(Sender: TObject);

begin

  RichEditSettings(RichEdit1);

end;
 

procedure TMainForm.FormCreate(Sender: TObject);

begin

  RichEditSettings(RichEdit1, True);

end;

Open in new window

0
 
LVL 1

Author Comment

by:peterkiers
Comment Utility
Wauw, i am impressed. 500 p's comming your way...

Greetings, Peter Kiers
0

Featured Post

Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

Join & Write a Comment

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're looking for how to monitor bandwidth using netflow or packet s…

728 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now