Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Farbe speichern und wiedergeben (https://www.delphipraxis.net/185064-farbe-speichern-und-wiedergeben.html)

Rippo 12. Mai 2015 13:17

Farbe speichern und wiedergeben
 
Hallo

ich möchte mit meinem TButtonColor, die ausgewählte farbe speichern und beim neuladen soll die ausgewählte farbe erscheinen.

jedoch klappt das laden nicht.


Delphi-Quellcode:
procedure SaveColorSettings();
const
  IniName = 'C:\Users\Color.ini';
var
  Ini: TIniFile;
  Color, i: Integer;
begin
 Ini := TIniFile.Create(IniName);
 try
   Ini.WriteInteger('Farben', ' i ', frmKonfig.Color);
 finally
   Ini.Free;
 end;
end;


procedure LoadColorSettings();
const
  IniName = 'C:\Users\Color.ini';
var
  Ini: TIniFile;
  i: integer;
  Color : Integer;
Begin
  Ini := TIniFile.Create(IniName);
  try
//frmKonfig.Color := StrToInt(Ini.ReadString('Farben', 'i', frmKonfig.Color));
//Color := Ini.ReadInteger('Farben',' i ', frmKonfig.Color);
//frmKonfig.Color := Color;
  finally
  Ini.Free;
end;
end;
Delphi-Quellcode:
´procedure TfrmKonfig.btnSpeichernClick(Sender: TObject);
 begin
    Color := ButtonColor1.SymbolColor;
    SaveColorSettings();
 end;
kann mir einer bitte eine gute lösung vorschlagen ggf. ein beispiel geben?

uligerhardt 12. Mai 2015 13:26

AW: Farbe speichern und wiedergeben
 
Zitat:

Zitat von Rippo (Beitrag 1301197)
jedoch klappt das laden nicht.


Delphi-Quellcode:
procedure SaveColorSettings();
const
  IniName = 'C:\Users\Color.ini';
var
  Ini: TIniFile;
  Color, i: Integer;
begin
 Ini := TIniFile.Create(IniName);
 try
   Ini.WriteInteger('Farben', ' i ', frmKonfig.Color);
 finally
   Ini.Free;
 end;
end;


procedure LoadColorSettings();
const
  IniName = 'C:\Users\Color.ini';
var
  Ini: TIniFile;
  i: integer;
  Color : Integer;
Begin
  Ini := TIniFile.Create(IniName);
  try
//frmKonfig.Color := StrToInt(Ini.ReadString('Farben', 'i', frmKonfig.Color));
//Color := Ini.ReadInteger('Farben',' i ', frmKonfig.Color);
//frmKonfig.Color := Color;
  finally
  Ini.Free;
end;
end;
Delphi-Quellcode:
´procedure TfrmKonfig.btnSpeichernClick(Sender: TObject);
 begin
    Color := ButtonColor1.SymbolColor;
    SaveColorSettings();
 end;

Wie "klappt nicht"? Wenn du mit ini.WriteInteger speicherst, sollte ini.ReadInteger zum Lesen funktionieren.

Wieso ' i ' mal mit Leerzeichen, mal ohne?

baumina 12. Mai 2015 13:28

AW: Farbe speichern und wiedergeben
 
Ich würde ColorToString und StringToColor verwenden.

Mavarik 12. Mai 2015 13:57

AW: Farbe speichern und wiedergeben
 
Zitat:

Zitat von Rippo (Beitrag 1301197)
Delphi-Quellcode:
procedure SaveColorSettings();
const
  IniName = 'C:\Users\Color.ini';
var
  Ini: TIniFile;
  Color, i: Integer;
begin
 Ini := TIniFile.Create(IniName);
 try
   Ini.WriteInteger('Farben', ' i ', frmKonfig.Color);
 finally
   Ini.Free;
 end;
end;

Hast Du uns nur einen Teil Source gepostet..?

Ich hoffe i sollte nicht i : Integer sein...

Rippo 12. Mai 2015 13:58

AW: Farbe speichern und wiedergeben
 
nein i steht nicht für integer

Popov 12. Mai 2015 14:23

AW: Farbe speichern und wiedergeben
 
@Rippo

TColor ist zwar nicht Integer, passt aber mit 4 Byte in den Integer. Somit ist das kein Problem:
Delphi-Quellcode:
ShowMessage(IntToStr(Color));
.

Viel problematischer ist dagegen das:
Delphi-Quellcode:
Ini.WriteInteger('Farben', ' i ', frmKonfig.Color);
und das
Delphi-Quellcode:
Ini.ReadString('Farben', 'i', frmKonfig.Color)
.

TIniFile ist toll und einfach, birgt aber Gefahren. Man sollte sich hüten die Bezeichnungen für Sections und Idents direkt jedes Mal aufs neue in die Funktion direkt einzutragen. Das birgt Gefahren sich zu verschreiben. Es mal so, mal so zu schreiben. Besser ist eine globale Konstante. Auch den Pfad sollte man in eine Funktion auslagern, damit die Pfade sich nicht unterscheiden.

Auch wenn ich nicht glaube, dass das der Fehler ist, hast du das Ident mal als
Delphi-Quellcode:
'i'
und mal als
Delphi-Quellcode:
' i '
geschrieben (vor und nach i sind Leerzeichen). Ich weiß nicht ob TIniFile die Namen trimmt, aber beide Idenst sind nicht gleich.

Perlsau 12. Mai 2015 19:19

AW: Farbe speichern und wiedergeben
 
Zitat:

Zitat von Popov (Beitrag 1301213)
TColor ist zwar nicht Integer, passt aber mit 4 Byte in den Integer. Somit ist das kein Problem:
Delphi-Quellcode:
ShowMessage(IntToStr(Color));
.

Selbstverständlich kann man TColor auch einen Integer zuweisen, schließlich mache ich das seit Jahr & Tag ganz genau so, um diverse Farbeinstellungen aus der Datenbank zu lesen:
Delphi-Quellcode:
  GLD.FarbeBrowse     := DatMod.Qset_Benutzer.FieldByName('FARBEBROWSE').AsInteger;
  GLD.FarbeEdit       := DatMod.Qset_Benutzer.FieldByName('FARBEEDIT').AsInteger;
  GLD.FarbeAppend     := DatMod.Qset_Benutzer.FieldByName('FARBEAPPEND').AsInteger;
wobei diese Variablen als TColor deklariert sind:
Delphi-Quellcode:
Var
  FarbeBrowse,
  FarbeEdit,
  FarbeAppend  : TColor;
Du siehst: TColor ist praktisch ein Integer, da voll zuweisungskompatibel.

Bjoerk 12. Mai 2015 19:33

AW: Farbe speichern und wiedergeben
 
Delphi-Quellcode:
  AColor := TColor(Ini.ReadInteger('Section', 'Ident', Integer(clWhite)));

  ..

  Ini.WriteInteger('Section', 'Ident', Integer(AColor));

Popov 12. Mai 2015 20:18

AW: Farbe speichern und wiedergeben
 
@Bjoerk

Kann man machen und eigentlich sollte man es so machen. Sollte aber auch ohne die Umwandlung funktionieren.

Aber wo wir schon mal da sind, ich mach das i.d.R. so mit dem Laden der Farbe aus der Ini:
Delphi-Quellcode:
AColor := TColor(Ini.ReadInteger('Section', 'Ident', Integer(AColor)));
//...
Hier wird beim Fehler keine andere Farbe zugewiesen, sondern bleibt gleich wie vorher.

Bjoerk 12. Mai 2015 20:43

AW: Farbe speichern und wiedergeben
 
Color ist ein int32. Deshalb kann man sich gelegentlich den Cast schenken. Eigentlich LongInt.

Welchem Fehler? Bleiben tut da gar nix? Ist der Key nicht vorhanden wird Default verwendet. Ist der Key da, aber der Value nicht da oder fehlerhaft gibt es normalerweise eine Exception (Intern StrToInt).

Popov 12. Mai 2015 20:53

AW: Farbe speichern und wiedergeben
 
Zitat:

Zitat von Bjoerk (Beitrag 1301272)
Welchem Fehler?

Der Fehler der vorkommt wenn noch keine Farbe in der Ini gespeichert.

In deinem Code ist kein Fehler, das wollte ich nicht sagen, das ist nur ein Tipp aus der Praxis für die Praxis. Vielleicht wird so klarer was ich meine:
Delphi-Quellcode:
  Panel1.Color := TColor(Ini.ReadInteger('Section', 'Ident', Integer(Panel1.Color)));
...
Man muss keinen Defaut-Wert zuweisen, man nimmt den Default-Wert aus der Variable der man zuweisen will. Ist ein Wert in der Ini, wird der genommen, ansonsten bleibt er der alte.

Perlsau 12. Mai 2015 21:25

AW: Farbe speichern und wiedergeben
 
[QUOTE=Popov;1301273]
Zitat:

Zitat von Bjoerk (Beitrag 1301272)
... das ist nur ein Tipp aus der Praxis für die Praxis.

Dozent mit Praxis? Ich dachte immer, Dozenten seien reine Theoretiker :stupid:

Sir Rufo 12. Mai 2015 21:31

AW: Farbe speichern und wiedergeben
 
Zitat:

Zitat von baumina (Beitrag 1301201)
Ich würde ColorToString und StringToColor verwenden.

Für eine INI, die ja auch lesbar und änderbar sein soll, ist das auch meine bevorzugte Wahl

Popov 12. Mai 2015 21:57

AW: Farbe speichern und wiedergeben
 
Den feinen Unterschied merkt man hier:
Delphi-Quellcode:
  ShowMessage(ColorToString(clWhite));
  ShowMessage(IntToStr(clWhite));

  ShowMessage(ColorToString(clWindowText));
  ShowMessage(IntToStr(clWindowText));

Popov 12. Mai 2015 22:00

AW: Farbe speichern und wiedergeben
 
Zitat:

Zitat von Perlsau (Beitrag 1301281)
Dozent mit Praxis? Ich dachte immer, Dozenten seien reine Theoretiker :stupid:

Es gibt auch Leute die haben einen normalen Job und arbeiten nebenbei, bzw. gelegentlich als Dozenten, weil das ihnen Spaß macht :thumb:

Headbucket 13. Mai 2015 06:05

AW: Farbe speichern und wiedergeben
 
Zitat:

Zitat von Popov (Beitrag 1301294)
Den feinen Unterschied merkt man hier:
Delphi-Quellcode:
  ShowMessage(ColorToString(clWhite));
  ShowMessage(IntToStr(clWhite));

  ShowMessage(ColorToString(clWindowText));
  ShowMessage(IntToStr(clWindowText));

Was soll man hier für einen Unterschied erkennen?

ShowMessage(ColorToString(clWhite)); -> clWhite
ShowMessage(IntToStr(clWhite)); -> 16777215
ShowMessage(ColorToString(clWindowText)); -> clWindowText
ShowMessage(IntToStr(clWindowText)); -> -16777208

Da TColor folgendermaßen definiert ist
Delphi-Quellcode:
type TColor = -2147483648..2147483647;
also alles wie zu erwarten.

Ich muss gestehen, dass ich aber auch meist einfach direkt den Interger-Wert abspeichere.

Grüße

Popov 13. Mai 2015 09:02

AW: Farbe speichern und wiedergeben
 
Zitat:

Zitat von Headbucket (Beitrag 1301305)
Was soll man hier für einen Unterschied erkennen?

Genau den.

Jasocul 13. Mai 2015 09:40

AW: Farbe speichern und wiedergeben
 
Ist das nicht völlig Wurst, wie man es speichert?

Eine INI-Datei manuell zu verändern sollte nicht Sache eines "dummen" Anwenders sein. Also hantieren nur "Fachleute" damit.

Im aktuellen Beispiel: Was steht denn drin, wenn ich keine Standard-Farben nehme und die String-Variante verwende? Vermutlich auch wieder Zahlen.

Für die Handhabung innerhalb des Programms ist es egal, ob da Strings oder Zahlen sind. Die Farben werden richtig gesetzt.

Der Vorteil von Zahlen ist dabei, dass die immer umgesetzt werden können. Zumindest, solange diese im Integer-Bereich sind. Strings sind zwar lesbarer, aber bei manueller Änderung können kleine Tipp-Fehler evtl. sogar eine Exception auslösen (habe ich jetzt nicht extra geprüft). OK, das kann man sicher auch im Programm abfangen. Ein Tippfehler bei einer Zahl, hat höchstens einen belustigenden Effekt.

Ich werde daher weiterhin Farben als Zahlenwert speichern.

Aber jeder, wie er mag. :wink:

baumina 13. Mai 2015 09:54

AW: Farbe speichern und wiedergeben
 
Zitat:

Zitat von Jasocul (Beitrag 1301330)
Also hantieren nur "Fachleute" damit.

Im aktuellen Beispiel: Was steht denn drin, wenn ich keine Standard-Farben nehme und die String-Variante verwende? Vermutlich auch wieder Zahlen.

Dann steht der Hexwert drin, genau so wie die "Fachleute" es aus dem Objektinspektor gewohnt sind.

BadenPower 13. Mai 2015 10:29

AW: Farbe speichern und wiedergeben
 
Mir stellt sich nun aber eine andere Frage:

Hat der TE inzwischen sein "Problem" gelöst und was hat "beim Laden nicht geklappt"?

uligerhardt 13. Mai 2015 10:36

AW: Farbe speichern und wiedergeben
 
Zitat:

Zitat von Jasocul (Beitrag 1301330)
Im aktuellen Beispiel: Was steht denn drin, wenn ich keine Standard-Farben nehme und die String-Variante verwende? Vermutlich auch wieder Zahlen.

In Delphi-Referenz durchsuchenGraphUtil gäbe es auch noch Delphi-Referenz durchsuchenColorToWebColorName/Delphi-Referenz durchsuchenWebColorNameToColor. Damit würdest du mehr Farben abdecken.

Rippo 13. Mai 2015 10:50

AW: Farbe speichern und wiedergeben
 
Habs gelöst

ich hab übesehen das die procedure ganz unten war und hab die LoadColorSettings in OnShow gemacht
jetzt gehts

Rippo 13. Mai 2015 13:35

AW: Farbe speichern und wiedergeben
 
Andere Frage zu TButtonColor

Wenn ich die farbe auswähle, wie schaffe ich es das sich diese Farbe auf die anderen Formulare überträgt und abgespeichert wird? und beim laden diese ausgwählte farbe erscheint?

Delphi-Quellcode:
procedure TfrmKonfig.ButtonColor1Click(Sender: TObject);
begin
  Color := ButtonColor1.SymbolColor;
end;
Delphi-Quellcode:
                   //Farbe Speichern
procedure TfrmKonfig.SaveColorSettings;
const
  IniName = 'C:\Color.ini';
var
  Ini: TIniFile;
  Color : Integer;
begin
 Ini := TIniFile.Create(IniName);
 try
   Ini.WriteInteger('Farben', 'Ident', Color);
 finally
   Ini.Free;
 end;
end;
                   // Farbe wiedergeben
procedure Tfrmkonfig.LoadColorSettings;
const
  IniName = 'C:\Color.ini';
var
  Ini: TIniFile;
  Color : Integer;
Begin
  Ini := TIniFile.Create(IniName);
  try
   Color := TColor(Ini.ReadInteger('Farben','Ident', Color));
   //frmKonfig.Color := TColor(Ini.ReadInteger('farben', 'Ident', Color));
  finally
   Ini.Free;
  end;
end;
Delphi-Quellcode:
procedure TfrmKonfig.btnSpeichernClick(Sender: TObject);
 begin
    Color := ButtonColor1.SymbolColor;
    SaveColorSettings;
 end;
Delphi-Quellcode:
procedure TfrmKonfig.FormShow(Sender: TObject);
begin
    LoadColorSettings;
end;

Bjoerk 13. Mai 2015 14:56

AW: Farbe speichern und wiedergeben
 
Zum Beispiel so. Für jede Form eine ander Section wählen. In FormCreate load und in FormDestroy Save ausführen.
Delphi-Quellcode:
  function LoadFormColorFromIniFile(const FileName, Section: string): TColor;
  procedure SaveFormColorToIniFile(const FileName, Section: string; const Color: TColor);


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz