Speichern von Settings. [.Gelöst]

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Speichern von Settings. [.Gelöst]

Beitrag von Maik81ftl »

Moin Moin,

bin gerade dabei, gewisse daten beim laufenden Betrieb zu speichern.

dazu verwende ich folgende zeilen.

Code: Alles auswählen

Unit udata

Code: Alles auswählen

TProgset = Record
             Menst, Stark, Periode: TColor;
             Font: String;
  end;
 
  T_User = record
          Name,
          Lastname,
          Geburtsort,
          Geburtstag : String;
          Groesse,
          Gewicht,
          BMI        : real;
  end;
 
  TUser = class
    FFilename, FPath, FExt: string;
    fUser: T_User;
    fName, fLastname, fGeburtsort, fGeburtstag: String;
    fGroesse, fGewicht, fBMI: real;
    fProgSet: TProgSet;
  private
//    fFarbe: Array[0..2] of TColor;
//    function GetUser: T_User;
  public
    constructor Create;
    destructor Done;
    procedure SetColor(Progset: TProgSet);
    procedure SetUser(User: T_User);
    property User: T_User read fUser write SetUser;
    property Farben: TProgSet read fProgSet write SetColor;
  end;
 
constructor TUser.Create;
begin
  inherited;
  fPath            := ExtractFilePath(GetAppConfigFile(false));
  fExt             := 'Setting';
  fUser.Name       := 'Maxim';
  fUser.Lastname   := 'Mustermann';
  fUser.Geburtsort := 'Musterhausen';
  fUser.Geburtstag := '01.01.2000';
  fUser.Gewicht    := 70.0;
  fUser.Groesse    := 1.65;
  fUser.BMI        := StrToFloat(FloatToStrF(70.0/(1.65*1.65), ffnumber, 0, 2));
  fName            := 'Maxim';
  fLastname        := 'Mustermann';
  fProgSet.Menst:= clRed;
  fProgSet.Stark:= clBlue;
  fProgSet.Periode:= clgreen;
  fProgSet.Font:= 'default';
  SetColor(fProgset);
  SetUser(fUser);
end;
 
Destructor TUser.Done;
begin
  inherited;
end;
 
procedure TUser.SetColor(ProgSet: TProgSet);
var s: String;
begin
  fFilename:= Format('%s%s', [fPath, fName+fLastname+'.'+fExt]);
  if fFileName <> '' then
     begin
     if FileExists(FFilename) then DeleteFile(FFilename);
     with TIniFile.Create(fFileName) do try
       s := Format('[%s]', [fName, fLastname]);
       WriteString(s, 'Farbe der Menstruation', ColorToString(ProgSet.Menst));
       WriteString(s, 'Farbe der Regelstärke', ColorToString(ProgSet.Stark));
       WriteString(s, 'Farbe der Prognose', ColorToString(ProgSet.Periode));
       WriteString(s, 'Schriftart für das Programm', Progset.Font);
     finally
       Free;
     end;
  end;
end;
 
procedure TUser.SetUser(User: T_User);
var s: String;
begin
  fUser:= User;
  fFilename:= Format('%s%s', [fPath, fName+'.'+fLastname]);
  if fFileName <> '' then
     begin
     if FileExists(FFilename) then DeleteFile(FFilename);
     with TIniFile.Create(fFileName) do try
       s := Format('[%s]', [fName, fLastname]);
       WriteString(s, 'Name', fUser.Name);
       WriteString(s, 'Nachname', fUser.Lastname);
       WriteString(s, 'Geburtsort', fUser.Geburtsort);
       WriteString(s, 'Geburtstag', fUser.Geburtstag);
       WriteFloat(s, 'Gewicht', fUser.Gewicht);
       WriteFloat(s, 'Größe', fUser.Groesse);
       WriteFloat(s, 'BMI', fUser.BMI);
     finally
       Free;
     end;
  end;
end;
Dies ist die Klasse, welche ich geschrieben habe und soweit, wie ich diese nur über den Create aufrufe auch alles macht, was es soll.

der erste aufruf erfolgt über folgende Zeile in der Unit3

Code: Alles auswählen

User:= TUser.Create;
Wenn ich nun allerdings aus dem Programm die Klasse wie folgt anspreche erhalte ich meinen Lieblings Fehler... :mrgreen:

Code: Alles auswählen

procedure TForm3.Button1Click(Sender: TObject);
begin
  Settings.Clear;
  ProgSet.Menst:= Label6.Font.Color;
  ProgSet.Stark:= Label7.Font.Color;
  ProgSet.Periode:= Label9.Font.Color;
  ProgSet.Font:= Label10.Font.Name;
  _User.Name:= Edit1.Text;
  _User.Lastname:= Edit2.Text;
  _User.Geburtsort:= Edit3.Text;
  _User.Geburtstag:= Edit4.Text;
  User.Farben:= ProgSet;   //<--- Hier tritt der Access violation auf, wenn ich dies aber in der IDE ausführe kommt der SIGSEGV auf. 
end;
Hat da jemand ne Idee, was ich falsch machen?
Zuletzt geändert von Maik81ftl am Do 28. Apr 2011, 12:16, insgesamt 1-mal geändert.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Speichern von Settings.

Beitrag von Eclipticon »

Warum heisst die Instanz von TUser mal User, dann wieder _User?

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Speichern von Settings.

Beitrag von shokwave »

Meine Idee wäre:

Code: Alles auswählen

with TIniFile.Create(fFileName) do try
Ich weiß nicht ob das wirklich funktioniert. Ich mach das immer so:

Code: Alles auswählen

var myINI:TInifile
begin
myINI:=TInifile.Create('filename.ini');
myINI.WriteString('Blah', 'Blub', 'test');
myINI.free;
end;
mfg Ingo

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Speichern von Settings.

Beitrag von MAC »

hey, lieblingserror :)

also ich würd als erstes mal die Procedure TUser.SetColor mit breakpoints ausfüllen und da suchen.
Wenn der Fehler bei

Code: Alles auswählen

WriteString(s, 'Farbe der Menstruation', ColorToString(ProgSet.Menst));
liegt dann solltest du den code umschreiben (müsste eigentlich aber auch so funktionieren...)

Code: Alles auswählen

afile := TIniFile.Create(fFileName);
try
if assigned(afile) then
begin
       s := Format('[%s]', [fName, fLastname]);
       afile.WriteString(s, 'Farbe der Menstruation', ColorToString(ProgSet.Menst));
       afile.WriteString(s, 'Farbe der Regelstärke', ColorToString(ProgSet.Stark));
       afile.WriteString(s, 'Farbe der Prognose', ColorToString(ProgSet.Periode));
       afile.WriteString(s, 'Schriftart für das Programm', Progset.Font);
end;
finally
afile.Free;
end;
mal 2 andere Fragen:

Code: Alles auswählen

s := Format('[%s]', [fName, fLastname]);
geht dass ,das im text nur 1 %s steht aber 2 parameter dabei sind ? oder wie, ich benutze die funktion nie :)

Wo ist ProgSet in Button1Click definiert ?

Code: Alles auswählen

Signatur := nil;

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Speichern von Settings.

Beitrag von Maik81ftl »

Eclipticon hat geschrieben:Warum heisst die Instanz von TUser mal User, dann wieder _User?
Die Instanz wird in 2 Unit aufgerufen (in der Udata) sowie in der Unit3, soll nur der Trennung dienen, ob die von der udata oder unit3 angesprochen wird.
shokwave hat geschrieben:Meine Idee wäre:

Code: Alles auswählen

with TIniFile.Create(fFileName) do try
Ich weiß nicht ob das wirklich funktioniert. Ich mach das immer so:

Code: Alles auswählen

var myINI:TInifile
begin
myINI:=TInifile.Create('filename.ini');
myINI.WriteString('Blah', 'Blub', 'test');
myINI.free;
end;
die, welche ich verwende geht Sehr gut dafür muß ich mal DiBo33 danke sagen, da von Ihm die Grundidee kahm.
MAC hat geschrieben:hey, lieblingserror :)

also ich würd als erstes mal die Procedure TUser.SetColor mit breakpoints ausfüllen und da suchen.
Wenn der Fehler bei

Code: Alles auswählen

WriteString(s, 'Farbe der Menstruation', ColorToString(ProgSet.Menst));
liegt dann solltest du den code umschreiben (müsste eigentlich aber auch so funktionieren...)

Code: Alles auswählen

afile := TIniFile.Create(fFileName);
try
if assigned(afile) then
begin
       s := Format('[%s]', [fName, fLastname]);
       afile.WriteString(s, 'Farbe der Menstruation', ColorToString(ProgSet.Menst));
       afile.WriteString(s, 'Farbe der Regelstärke', ColorToString(ProgSet.Stark));
       afile.WriteString(s, 'Farbe der Prognose', ColorToString(ProgSet.Periode));
       afile.WriteString(s, 'Schriftart für das Programm', Progset.Font);
end;
finally
afile.Free;
end;
mal 2 andere Fragen:

Code: Alles auswählen

s := Format('[%s]', [fName, fLastname]);
geht dass ,das im text nur 1 %s steht aber 2 parameter dabei sind ? oder wie, ich benutze die funktion nie :)

Wo ist ProgSet in Button1Click definiert ?
Jo MAC der Lieblingsfehler aller :mrgreen: Aber danke noch mal, das du nach der Button1Click gefragt hast ^^

Code: Alles auswählen

procedure TForm3.FormCreate(Sender: TObject);
begin
  ProgSet:= stdcolor;
  User:= TUser.Create;
  Form3.Font.Name:= ProgSet.Font;
  Label7.Font.Color:= ProgSet.Menst;
  Label8.Font.Color:= ProgSet.Stark;
  Label9.Font.Color:= ProgSet.Periode;
end;
 
procedure TForm3.Button1Click(Sender: TObject);
begin
  Settings.Clear;
  ProgSet.Menst:= Label6.Font.Color;
  ProgSet.Stark:= Label7.Font.Color;
  ProgSet.Periode:= Label9.Font.Color;
  ProgSet.Font:= Label10.Font.Name;
  _User.Name:= Edit1.Text;
  _User.Lastname:= Edit2.Text;
  _User.Geburtstag:= Edit3.Text;
  _User.Gewicht:= StrToFloat(Edit4.Text);
  _User.Groesse:= StrToFloat(Edit5.Text);
  User.Farben:= ProgSet;
  User.SetUser(_User);
end;
in der Überstehenden Procedure hab ich etwas vermist, :D da ich in dieser Unit nun ausmisten kann, ist mit wohl in der Button1click der Ausdruck

Code: Alles auswählen

Settings.Clear;
durch die lappen gegangen. diesen Ausgeklammert zum test und siehe da? Geht :roll:

und das mit den Parametern geht. Ändere ich den Parameter bekomm ich probleme.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Speichern von Settings.

Beitrag von pluto »

Ich habe mir mal was Universelles geschrieben. Findest du im Anhang.

Ob das noch läuft weiß ich nicht. Könnte. Ich nutze meine ich nur Standard Komponenten.
Dateianhänge
uTool_Config.pas
(9.26 KiB) 95-mal heruntergeladen
MFG
Michael Springwald

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Speichern von Settings.

Beitrag von Maik81ftl »

pluto hat geschrieben:Ich habe mir mal was Universelles geschrieben. Findest du im Anhang.

Ob das noch läuft weiß ich nicht. Könnte. Ich nutze meine ich nur Standard Komponenten.
Hab's mir mal mit durchgeschaut. mal sehen, ob ich das bei mir anpassen kann.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Antworten