Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1655
Erhaltene Danke: 304

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 05.05.16 18:14 
Hallo Forum

Problemstellung:
In einem Projekt speichere ich einige Font-Werte eines TRichEdit im FormClose Ereignis und lade sie im FormCreate wieder.
Führe ich dabei eine Änderung des Font im TFontDialog durch, beende anschließend die Anwendung und starte sie erneut, wird mir beim nächsten Start die Änderung richtig angezeigt.
Aber aus irgendeinem Grund wird beim 3. Programmstart nach der Änderung das Font zurückgesetzt.
Die zurückgesetzten Werte ensprechen dabei nicht den vorgegebenen Werten, die der Ini als Standardwerte zugewiesen wurden, sondern den Standardwerten des TRichEdit.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
uses ShlObj, ActiveX, IniFiles;

private
  procedure SaveSettings();
  procedure LoadSettings();

const
  APP_AUTHOR_DIR  = 'Frühlingsrolle';
  APP_PROJECT_DIR = 'Demo';
  F_NAME  = 'Tahoma';
  F_SIZE  = 10;
  F_STYLE = 0;
  F_COLOR = 'clWindowText';

// http://www.delphi-library.de/viewtopic.php?t=9428
function GetSpecialFolder(aFolder: Integer): String;
var
   pIdL: PItemIDList;
   Path: array [0..Max_Path] of Char;
   Allocator: IMalloc;
begin
   SHGetSpecialFolderLocation (0, aFolder, pIdL);
   SHGetPathFromIDList (pIDL, Path);
   if Succeeded (SHGetMalloc (Allocator)) then
   begin
     Allocator.Free (pIdL);
     {$IFDEF VER100}
     Allocator.Release;
     {$ENDIF}
   end;
   result := Path;
end;

function SpecialPath(const FileName: string): string;
var
  LocalPath, FullPath: string;
begin
  LocalPath := GetSpecialFolder(CSIDL_LOCAL_APPDATA);
  FullPath  := LocalPath + '\' + APP_AUTHOR_DIR + '\' + APP_PROJECT_DIR;
  if not DirectoryExists(FullPath) then
    ForceDirectories(FullPath);
  result := FullPath + '\' + FileName;
end;

procedure TfrmMainDemo.SaveSettings;
var
  Ini: TMemIniFile;
begin
  Ini := TMemIniFile.Create(SpecialPath('Einstellungen.ini'));
  try
    Ini.WriteString('Schrift''Art', FontDialog1.Font.Name);
    Ini.WriteInteger('Schrift''Größe', FontDialog1.Font.Size);
    Ini.WriteInteger('Schrift''Format', Byte(FontDialog1.Font.Style));
    Ini.WriteString('Schrift''Farbe', ColorToString(FontDialog1.Font.Color));
    Ini.UpdateFile;
  finally
    Ini.Free;
  end;
end;

procedure TfrmMainDemo.LoadSettings;
var
  Ini   : TMemIniFile;
begin
  Ini := TMemIniFile.Create(SpecialPath('Einstellungen.ini'));
  try
    with redText.Font do
    begin
      Name := Ini.ReadString('Schrift''Art', F_NAME);
      Size := Ini.ReadInteger('Schrift''Größe', F_SIZE);
      Style := TFontStyles(Byte(Ini.ReadInteger('Schrift''Format', F_STYLE)));
      Color := StringToColor(Ini.ReadString('Schrift''Farbe', F_COLOR));
    end;
  finally
    Ini.Free;
  end;
end;

procedure TfrmMainDemo.btnFontClick(Sender: TObject);
begin
  FontDialog1.Font := redText.Font;
  if FontDialog1.Execute then
    redText.Font := FontDialog1.Font;
end;

procedure TfrmMainDemo.FormCreate(Sender: TObject);
var
  i, j: Integer;
begin
  LoadSettings();
  { ... }
end;

procedure TfrmMainDemo.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  SaveSettings();
  { ... }
end;


Zum Vergleich, beim 3. Start steht anschließend in der Ini:
ausblenden Quelltext
1:
2:
3:
4:
5:
[Schrift]
Art=Tahoma
Größe=8
Format=0
Farbe=clWindowText

Das sind jene Werte des TRichEdit, nicht aber der vorgegebenen Konstanten.
Gespeichert wird die Ini Datei unter dem Pfad:
ausblenden Quelltext
1:
C:\Users\---\AppData\Local\Frühlingsrolle\Demo\Einstellungen.ini					


Ausgeführt wurde es auf Win7 64bit mit der IDE Delphi2006.

Kann das jemand reproduzieren?

Nachtrag:
Nachdem ich die Speichern Methode aus dem FormClose entfernt und beim Ausführen des Font-Dialogs hinzugefügt habe, scheint es so, als sei der Fehler behoben worden zu sein.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TfrmMainDemo.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //SaveSettings(); <--- wurde entfernt
  { ... }
end;

procedure TfrmMainDemo.btnFontClick(Sender: TObject);
begin
  FontDialog1.Font := redText.Font;
  if FontDialog1.Execute then
  begin
    redText.Font := FontDialog1.Font;
    SaveSettings;  // <--- und hier eingetragen
  end;
end;


Das Thema hat sich erledigt !!!

_________________
„Wo andere blind der Wahrheit folgen, denk daran ... Nichts ist wahr!" (Assassin's Creed I-II)