Index: foptionsfonts.lfm
===================================================================
--- foptionsfonts.lfm	(revision 4108)
+++ foptionsfonts.lfm	(working copy)
@@ -77,6 +77,7 @@
     Anchors = [akTop, akLeft, akRight]
     BorderSpacing.Top = 6
     BorderSpacing.Right = 4
+    OnExit = edtMainFontExit
     TabOrder = 2
   end
   object btnSelEditFnt: TButton[6]
@@ -107,6 +108,7 @@
     Anchors = [akTop, akLeft, akRight]
     BorderSpacing.Top = 6
     BorderSpacing.Right = 4
+    OnExit = edtEditorFontExit
     TabOrder = 4
   end
   object edtEditorFontSize: TSpinEdit[8]
@@ -153,6 +155,7 @@
     Anchors = [akTop, akLeft, akRight]
     BorderSpacing.Top = 6
     BorderSpacing.Right = 4
+    OnExit = edtViewerFontExit
     TabOrder = 7
   end
   object edtViewerFontSize: TSpinEdit[11]
@@ -195,6 +198,7 @@
     Anchors = [akTop, akLeft, akRight]
     BorderSpacing.Top = 6
     BorderSpacing.Right = 4
+    OnExit = edtLogFontExit
     TabOrder = 9
   end
   object btnSelLogFnt: TButton[14]
@@ -253,6 +257,7 @@
     Anchors = [akTop, akLeft, akRight]
     BorderSpacing.Top = 6
     BorderSpacing.Right = 4
+    OnExit = edtViewerBookFontExit
     TabOrder = 12
   end
   object edtViewerBookFontSize: TSpinEdit[18]
Index: foptionsfonts.pas
===================================================================
--- foptionsfonts.pas	(revision 4108)
+++ foptionsfonts.pas	(working copy)
@@ -28,7 +28,7 @@
 
 uses
   Classes, SysUtils,
-  fOptionsFrame, StdCtrls, Spin, Dialogs;
+  StdCtrls, Spin, Dialogs, Graphics, fOptionsFrame, uGlobs;
 
 type
 
@@ -61,11 +61,26 @@
     procedure btnSelViewFntClick(Sender: TObject);
     procedure btnSelLogFntClick(Sender: TObject);
     procedure btnSelViewerBookFntClick(Sender: TObject);
+    procedure edtEditorFontExit(Sender: TObject);
     procedure edtEditorFontSizeChange(Sender: TObject);
+    procedure edtLogFontExit(Sender: TObject);
+    procedure edtMainFontExit(Sender: TObject);
     procedure edtMainFontSizeChange(Sender: TObject);
+    procedure edtViewerBookFontExit(Sender: TObject);
+    procedure edtViewerFontExit(Sender: TObject);
     procedure edtViewerFontSizeChange(Sender: TObject);
     procedure edtLogFontSizeChange(Sender: TObject);
     procedure edtViewerBookFontSizeChange(Sender: TObject);
+  private
+    procedure LoadFont(aDCFont:TDCFont);
+    procedure SaveFont(aDCFont:TDCFont);
+    //
+    function GetFont(aDCFont:TDCFont):TFont;
+    procedure SetFont(aDCFont:TDCFont;aFont:TFont);
+    procedure SetFontSize(aDCFont:TDCFont;aFontSize:Integer);
+    procedure SetFontName(aDCFont:TDCFont;aFontName:String);
+    //
+    procedure RunDialogFont(aDCFont:TDCFont);
   protected
     procedure Load; override;
     function Save: TOptionsEditorSaveFlags; override;
@@ -79,100 +94,85 @@
 {$R *.lfm}
 
 uses
-  uGlobs, uLng;
+  uLng;
 
 { TfrmOptionsFonts }
 
-procedure TfrmOptionsFonts.btnSelEditFntClick(Sender: TObject);
+procedure TfrmOptionsFonts.btnSelMainFntClick(Sender: TObject);
 begin
-  dlgFnt.Font.Name  := edtEditorFont.Text;
-  dlgFnt.Font.Size  := edtEditorFontSize.Value;
-  dlgFnt.Font.Style := edtEditorFont.Font.Style;
-  if dlgFnt.Execute then
-    begin
-      edtEditorFont.Text       := dlgFnt.Font.Name;
-      edtEditorFontSize.Value  := dlgFnt.Font.Size;
-      edtEditorFont.Font.Style := dlgFnt.Font.Style;
-    end;
+  RunDialogFont(dcfMain);
 end;
 
-procedure TfrmOptionsFonts.btnSelMainFntClick(Sender: TObject);
+procedure TfrmOptionsFonts.btnSelEditFntClick(Sender: TObject);
 begin
-  dlgFnt.Font.Name  := edtMainFont.Text;
-  dlgFnt.Font.Size  := edtMainFontSize.Value;
-  dlgFnt.Font.Style := edtMainFont.Font.Style;
-  if dlgFnt.Execute then
-    begin
-      edtMainFont.Text       := dlgFnt.Font.Name;
-      edtMainFontSize.Value  := dlgFnt.Font.Size;
-      edtMainFont.Font.Style := dlgFnt.Font.Style;
-    end;
+  RunDialogFont(dcfEditor);
 end;
 
 procedure TfrmOptionsFonts.btnSelViewFntClick(Sender: TObject);
 begin
-  dlgFnt.Font.Name  := edtViewerFont.Text;
-  dlgFnt.Font.Size  := edtViewerFontSize.Value;
-  dlgFnt.Font.Style := edtViewerFont.Font.Style;
-  if dlgFnt.Execute then
-    begin
-      edtViewerFont.Text       := dlgFnt.Font.Name;
-      edtViewerFontSize.Value  := dlgFnt.Font.Size;
-      edtViewerFont.Font.Style := dlgFnt.Font.Style;
-    end;
+  RunDialogFont(dcfViewer);
 end;
 
+procedure TfrmOptionsFonts.btnSelViewerBookFntClick(Sender: TObject);
+begin
+  RunDialogFont(dcfViewerBook);
+end;
+
 procedure TfrmOptionsFonts.btnSelLogFntClick(Sender: TObject);
 begin
-  dlgFnt.Font.Name  := edtLogFont.Text;
-  dlgFnt.Font.Size  := edtLogFontSize.Value;
-  dlgFnt.Font.Style := edtLogFont.Font.Style;
-  if dlgFnt.Execute then
-    begin
-      edtLogFont.Text       := dlgFnt.Font.Name;
-      edtLogFontSize.Value  := dlgFnt.Font.Size;
-      edtLogFont.Font.Style := dlgFnt.Font.Style;
-    end;
+  RunDialogFont(dcfLog);
 end;
 
-procedure TfrmOptionsFonts.btnSelViewerBookFntClick(Sender: TObject);
+procedure TfrmOptionsFonts.edtMainFontExit(Sender: TObject);
 begin
-  dlgFnt.Font.Name  := edtViewerBookFont.Text;
-  dlgFnt.Font.Size  := edtViewerBookFontSize.Value;
-  dlgFnt.Font.Style := edtViewerBookFont.Font.Style;
-  if dlgFnt.Execute then
-    begin
-      edtViewerBookFont.Text       := dlgFnt.Font.Name;
-      edtViewerBookFontSize.Value  := dlgFnt.Font.Size;
-      edtViewerBookFont.Font.Style := dlgFnt.Font.Style;
-    end;
+  SetFontName(dcfMain, TEdit(Sender).Text);
 end;
 
-procedure TfrmOptionsFonts.edtEditorFontSizeChange(Sender: TObject);
+procedure TfrmOptionsFonts.edtEditorFontExit(Sender: TObject);
 begin
-  edtEditorFont.Font.Size := edtEditorFontSize.Value;
+  SetFontName(dcfEditor, TEdit(Sender).Text);
 end;
 
+procedure TfrmOptionsFonts.edtViewerFontExit(Sender: TObject);
+begin
+  SetFontName(dcfViewer, TEdit(Sender).Text);
+end;
+
+procedure TfrmOptionsFonts.edtViewerBookFontExit(Sender: TObject);
+begin
+  SetFontName(dcfViewerBook, TEdit(Sender).Text);
+end;
+
+procedure TfrmOptionsFonts.edtLogFontExit(Sender: TObject);
+begin
+  SetFontName(dcfLog, TEdit(Sender).Text);
+end;
+
 procedure TfrmOptionsFonts.edtMainFontSizeChange(Sender: TObject);
 begin
-  edtMainFont.Font.Size := edtMainFontSize.Value;
+  SetFontSize(dcfMain, TSpinEdit(Sender).Value);
 end;
 
-procedure TfrmOptionsFonts.edtViewerFontSizeChange(Sender: TObject);
+procedure TfrmOptionsFonts.edtEditorFontSizeChange(Sender: TObject);
 begin
-  edtViewerFont.Font.Size := edtViewerFontSize.Value;
+  SetFontSize(dcfEditor, TSpinEdit(Sender).Value);
 end;
 
-procedure TfrmOptionsFonts.edtLogFontSizeChange(Sender: TObject);
+procedure TfrmOptionsFonts.edtViewerFontSizeChange(Sender: TObject);
 begin
-  edtLogFont.Font.Size := edtLogFontSize.Value;
+  SetFontSize(dcfViewer, TSpinEdit(Sender).Value);
 end;
 
 procedure TfrmOptionsFonts.edtViewerBookFontSizeChange(Sender: TObject);
 begin
-  edtViewerBookFont.Font.Size := edtViewerBookFontSize.Value;
+  SetFontSize(dcfViewerBook, TSpinEdit(Sender).Value);
 end;
 
+procedure TfrmOptionsFonts.edtLogFontSizeChange(Sender: TObject);
+begin
+  SetFontSize(dcfLog, TSpinEdit(Sender).Value);
+end;
+
 class function TfrmOptionsFonts.GetIconIndex: Integer;
 begin
   Result := 3;
@@ -185,64 +185,100 @@
 
 procedure TfrmOptionsFonts.Load;
 begin
-  edtMainFont.Text   := gFonts[dcfMain].Name;
-  edtEditorFont.Text := gFonts[dcfEditor].Name;
-  edtViewerFont.Text := gFonts[dcfViewer].Name;
-  edtLogFont.Text    := gFonts[dcfLog].Name;
-  edtViewerBookFont.Text := gFonts[dcfViewerBook].Name;
-
-  edtMainFontSize.Value   := gFonts[dcfMain].Size;
-  edtEditorFontSize.Value := gFonts[dcfEditor].Size;
-  edtViewerFontSize.Value := gFonts[dcfViewer].Size;
-  edtLogFontSize.Value    := gFonts[dcfLog].Size;
-  edtViewerBookFontSize.Value := gFonts[dcfViewerBook].Size;
-
-  FontOptionsToFont(gFonts[dcfMain], edtMainFont.Font);
-  FontOptionsToFont(gFonts[dcfEditor], edtEditorFont.Font);
-  FontOptionsToFont(gFonts[dcfViewer], edtViewerFont.Font);
-  FontOptionsToFont(gFonts[dcfLog], edtLogFont.Font);
-  FontOptionsToFont(gFonts[dcfViewerBook], edtViewerBookFont.Font);
+  LoadFont(dcfMain);
+  LoadFont(dcfEditor);
+  LoadFont(dcfViewer);
+  LoadFont(dcfLog);
+  LoadFont(dcfViewerBook);
+  //все загружено
 end;
 
 function TfrmOptionsFonts.Save: TOptionsEditorSaveFlags;
 begin
   Result := [];
+  SaveFont(dcfMain);
+  SaveFont(dcfEditor);
+  SaveFont(dcfViewer);
+  SaveFont(dcfLog);
+  SaveFont(dcfViewerBook);
+end;
 
-  with gFonts[dcfMain] do
-  begin
-    Name  := edtMainFont.Text;
-    Size  := edtMainFontSize.Value;
-    Style := edtMainFont.Font.Style;
+procedure TfrmOptionsFonts.LoadFont(aDCFont: TDCFont);
+ var xFont:TFont;
+begin
+  xFont:=TFont.Create;
+  try
+    FontOptionsToFont(gFonts[aDCFont], xFont);
+    SetFont(aDCFont, xFont);
+  finally
+    FreeAndNil(xFont);
   end;
+end;
 
-  with gFonts[dcfEditor] do
-  begin
-    Name  := edtEditorFont.Text;
-    Size  := edtEditorFontSize.Value;
-    Style := edtEditorFont.Font.Style;
-  end;
+procedure TfrmOptionsFonts.SaveFont(aDCFont: TDCFont);
+begin
+  FontToFontOptions(GetFont(aDCFont), gFonts[aDCFont]);
+end;
 
-  with gFonts[dcfViewer] do
-  begin
-    Name  := edtViewerFont.Text;
-    Size  := edtViewerFontSize.Value;
-    Style := edtViewerFont.Font.Style;
+procedure TfrmOptionsFonts.SetFont(aDCFont: TDCFont; aFont: TFont);
+begin
+  case aDCFont of
+    dcfMain: begin
+      edtMainFont.Font := aFont;
+      edtMainFont.Text := aFont.Name;
+      edtMainFontSize.Value := aFont.Size;
+    end;
+    dcfEditor: begin
+      edtEditorFont.Font := aFont;
+      edtEditorFont.Text := aFont.Name;
+      edtEditorFontSize.Value := aFont.Size;
+    end;
+    dcfViewer: begin
+      edtViewerFont.Font := aFont;
+      edtViewerFont.Text := aFont.Name;
+      edtViewerFontSize.Value := aFont.Size;
+    end;
+    dcfLog: begin
+      edtLogFont.Font := aFont;
+      edtLogFont.Text := aFont.Name;
+      edtLogFontSize.Value := aFont.Size;
+    end;
+    dcfViewerBook: begin
+      edtViewerBookFont.Font := aFont;
+      edtViewerBookFont.Text := aFont.Name;
+      edtViewerBookFontSize.Value := aFont.Size;
+    end;
   end;
+end;
 
-  with gFonts[dcfLog] do
-  begin
-    Name  := edtLogFont.Text;
-    Size  := edtLogFontSize.Value;
-    Style := edtLogFont.Font.Style;
-  end;
+procedure TfrmOptionsFonts.SetFontSize(aDCFont: TDCFont; aFontSize: Integer);
+begin
+  GetFont(aDCFont).Size:=aFontSize;
+end;
 
-  with gFonts[dcfViewerBook] do
-  begin
-    Name  := edtViewerBookFont.Text;
-    Size  := edtViewerBookFontSize.Value;
-    Style := edtViewerBookFont.Font.Style;
+procedure TfrmOptionsFonts.SetFontName(aDCFont: TDCFont; aFontName: String);
+begin
+  GetFont(aDCFont).Name:=aFontName;
+end;
+
+function TfrmOptionsFonts.GetFont(aDCFont: TDCFont): TFont;
+begin
+  case aDCFont of
+    dcfMain      : result := edtMainFont.Font;
+    dcfEditor    : result := edtEditorFont.Font;
+    dcfViewer    : result := edtViewerFont.Font;
+    dcfLog       : result := edtLogFont.Font;
+    dcfViewerBook: result := edtViewerBookFont.Font;
+    else result:=nil; //DOTO: показать ошибку для программиста
   end;
 end;
 
+procedure TfrmOptionsFonts.RunDialogFont(aDCFont: TDCFont);
+begin
+  dlgFnt.Font := GetFont(aDCFont);
+  if dlgFnt.Execute then SetFont(aDCFont, dlgFnt.Font);
+end;
+
+
 end.
 
