Fehler beim Auswerten?

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Fehler beim Auswerten?

Beitrag von Maik81SE »

Moin und schönen Sonntag Abend Gemeinde,

nachdem ich in den Letzten Jahren erfolgreich mit den Ini-Files gearbeitet habe und nach dem selben Prizip nun eine Sammlung für meine 3 Programme erstellen wollte stehe ich wohl gerade auf dem Schlauch, weiß aber nicht in welcher Zeile der Wert falsch übernommen wird.

Code: Alles auswählen

unit set_data_v06_07112020;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, iniFiles;

Type
  TVeeJee_Set                     = class
    fFilename,
    fPath,
    fProg,
    fExt                          : String;
    fTSOL,                        : Boolean;   // TrayIcon Show on Load (tsol)
  private
    function GetTSOL: boolean;

    procedure SetTSOL(Value: Boolean);
  public
    constructor Create;
    destructor Done;
    property TSOL: boolean read GetTSOL write SetTSOL;
  end;

implementation

{ TVeeJee }

constructor TVeeJee_Set.Create;
begin
  inherited;
  fExt                            := 'Settings';
  fProg                           := 'VeeJee-Live';
  fPath                           := ExtractFilePath(GetAppConfigFile(false)) + fProg + PathDelim;
  fFilename                       := Format('%s%s', [fPath, fExt]);
  if FileExists(fFileName+'.tsol') then
    fTSOL                         := GetTSOL
  else
    SetTSOL(false);
end;

destructor TVeeJee_Set.Done;
begin
  inherited;
end;

function TVeeJee_Set.GetTSOL: boolean;
var s                             : String;
begin
  if FileExists(fFileName+'.tsol') then begin
    with TIniFile.Create(fFileName+'.tsol') do begin
        s                         := Format('%s', ['TrayShow']);
        fTSOL                     := ReadBool(s, 'TrayShowOnLoad:', False);
        end;
    end;
  Result                          := fTSOL;
end;

procedure TVeeJee_Set.SetTSOL(Value: Boolean);
var s                             : String;
begin
  if FileExists(fFileName+'.tsol') then DeleteFile(fFileName+'.tsol');
  with TIniFile.Create(fFileName+'.tsol') do try
      s                           := Format('%s', ['TrayShow']);
      WriteBool(s, 'TrayShowOnLoad:', Value);
  finally
    Free;
    end;
end;

end.
die File liegt im .config-Ordner des Linux-Users und wird auch gefunden.

Der Inhalt der entsprechenden File schaut wie folgt aus.

Code: Alles auswählen

[TrayShow]
TrayShowOnLoad:=1
dennoch wird die

Code: Alles auswählen

function GetTSOL
mit dem defaultwert übergeben.
Diese Klasse wird in der OnShow das erste mal aufgerufen und somit gehe ich hier von einem internen Fehler aus, welchen ich gerade wohl nicht sehe. :shock:

Zusatzinfo...
Das Programm wird aktuell auf einem Pi4 geschrieben.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Fehler beim Auswerten?

Beitrag von wp_xyz »

Zuerst dachte ich, das liegt an dem Doppelpunkt, aber Windows kommt damit zurecht und liest den Wert richtig ein. Lass ihn trotzdem mal weg. Vielleicht wird auf dem Pi ein Doppelpunkt als Spezialzeichen interpretiert, etwa so wie der Strichpunkt für den Beginn eines Kommentars.

Das einzige was mir auffällt, ist, dass das eine etwas seltsame Getter/Setter-Konstruktion ist: GetTSOL soll den Wert der Eigenschaft TSOL auslesen (das ist die Aufgabe eines Getters), aber gleichzeitig wird der Wert auch geschrieben, denn du übergibst den aus der ini-Datei gelesenen Wert an fTSOL. Und die Setter-Prozedur, auf der anderen Seite, schreibt nur in die Ini-Datei, aber nicht in die entsprechende Variable fTSOL. Ist das so beabsichtigt? Das kann man zwar so machen, aber in meinen Augen ist das keine klare Aufgabenteilung. Was spricht gegen die stinknormale Kombination "ReadIni" und "WriteIni"?

Außerdem fehlt das .Free in GetTSOL.

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Fehler beim Auswerten?

Beitrag von Sieben »

Mein Linux mag den Doppelpunkt nicht, der Wert wird nicht ausgelesen.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Fehler beim Auswerten?

Beitrag von PascalDragon »

wp_xyz hat geschrieben:
Mo 9. Nov 2020, 00:38
Zuerst dachte ich, das liegt an dem Doppelpunkt, aber Windows kommt damit zurecht und liest den Wert richtig ein. Lass ihn trotzdem mal weg. Vielleicht wird auf dem Pi ein Doppelpunkt als Spezialzeichen interpretiert, etwa so wie der Strichpunkt für den Beginn eines Kommentars.
Hast du es in einem FPC Programm ausprobiert? Der INI-File Code ist nämlich plattformunabhängig und bei mir wird der Wert mit dem Doppelpunkt auch unter Windows nicht erkannt.
FPC Compiler Entwickler

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehler beim Auswerten?

Beitrag von theo »

Nur mal so aus Interesse, hat wahrscheinlich mit dem Fehler nichts zu tun.
Was ist der Sinn von:

Code: Alles auswählen

s                         := Format('%s', ['TrayShow']);
fTSOL                     := ReadBool(s, 'TrayShowOnLoad:', False);
Warum nicht einfach:

Code: Alles auswählen

fTSOL                     := ReadBool('TrayShow', 'TrayShowOnLoad', False);
Und "with" ist immer schlecht. Das mache ich immer als erstes weg, wenn ich auf Fehlersuche in fremden Code bin. Free hast du auch vergessen in GetTSOL. Vielleicht wegen "with"?
Warum DeleteFile? Einfach den Wert überschreiben oder allenfalls EraseSection würde reichen.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Fehler beim Auswerten?

Beitrag von wp_xyz »

PascalDragon hat geschrieben:
Mo 9. Nov 2020, 09:48
wp_xyz hat geschrieben:
Mo 9. Nov 2020, 00:38
Zuerst dachte ich, das liegt an dem Doppelpunkt, aber Windows kommt damit zurecht und liest den Wert richtig ein. Lass ihn trotzdem mal weg. Vielleicht wird auf dem Pi ein Doppelpunkt als Spezialzeichen interpretiert, etwa so wie der Strichpunkt für den Beginn eines Kommentars.
Hast du es in einem FPC Programm ausprobiert? Der INI-File Code ist nämlich plattformunabhängig und bei mir wird der Wert mit dem Doppelpunkt auch unter Windows nicht erkannt.
Der folgende Code gibt bei mir (Win 10, FPC 3.2, aber auch FPC trunk) TRUE aus, das heißt, dass der Doppelpunkt als normales Textzeichen gewertet wird:

Code: Alles auswählen

program Project1;

uses
  IniFiles;

var
  ini: TIniFile;
begin
  ini := TIniFile.Create('test.ini');
  try
    ini.WriteBool('TrayShow', 'TrayShowOnLoad:', true);
  finally
    ini.Free;
  end;

  ini := TIniFile.Create('test.ini');
  try
    WriteLn(ini.ReadBool('TrayShow', 'TrayShowOnLoad:', false));
  finally
    ini.Free;
  end;

  ReadLn;
end.

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Fehler beim Auswerten?

Beitrag von Sieben »

Sorry, das habe ich jetzt erst gesehen:

Code: Alles auswählen

'TrayShowOnLoad:'
Wenn der Doppelpunkt Bestandteil des Keys ist, wird auch bei mir korrekt gelesen. Man sieht nur das Pläsier nicht ein. :wink:

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Fehler beim Auswerten?

Beitrag von PascalDragon »

Ich schließe mich Sieben an. Hatte auch nicht gemerkt, dass der Doppelpunkt auch als Teil des Namens abgefragt wird. Aber ja, dann sollte das auch plattformunabhängig so funktionieren. :)
FPC Compiler Entwickler

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Fehler beim Auswerten?

Beitrag von Timm Thaler »

Vielleicht sollte man Sachen nicht tun - die einem um die Ohren fliegen könnten? Es gibt zwar keine strenge Konvention zu den Keys, aber:
Some implementations allow a colon (:) as the name/value delimiter (instead of the equals sign).
https://en.wikipedia.org/wiki/INI_file

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

[Gelöst] Fehler beim Auswerten? & Obtimiert.

Beitrag von Maik81SE »

theo hat geschrieben:
Mo 9. Nov 2020, 10:14
Nur mal so aus Interesse, hat wahrscheinlich mit dem Fehler nichts zu tun.
Was ist der Sinn von:

Code: Alles auswählen

s                         := Format('%s', ['TrayShow']);
fTSOL                     := ReadBool(s, 'TrayShowOnLoad:', False);
Diese Variante habe ich 2014 aus einem Tutorial entnommen.
theo hat geschrieben:
Mo 9. Nov 2020, 10:14
Warum nicht einfach:

Code: Alles auswählen

fTSOL                     := ReadBool('TrayShow', 'TrayShowOnLoad', False);
Sehr guter Tip.
Spart schon mal einiges an Programmzeilen und dadurch mögliche Tippfehler.
theo hat geschrieben:
Mo 9. Nov 2020, 10:14
Und "with" ist immer schlecht. Das mache ich immer als erstes weg, wenn ich auf Fehlersuche in fremden Code bin. Free hast du auch vergessen in GetTSOL. Vielleicht wegen "with"?
Warum DeleteFile? Einfach den Wert überschreiben oder allenfalls EraseSection würde reichen.
EraseSection? Hört ich Speicherschonender an, höre ich aber jetzt zum ersten mal. :o

Was "With do" angeht, dies hat den sind, damit ich nicht unnötig eine neues Object erstellen muß.
Nutze ich aber auch um Zuweisungen du einem Bestimmten Object (Memo, LabeledEdit und co.) kürzer zu schreiben.
Ob dies von Vorteill ist oder nicht, darüber lässt sich streiten, Vorteil, welchen ich da sehen, wenn ich zB . alles einklappe und nur zb ein Bestimmten Button anschauen will, findet man ihn sicherlich schneller.

Code: Alles auswählen

procedure TTray_Form.FormCreate(Sender: TObject);
begin
  VeeJee                          := TVeeJee_Set.Create;
  Screen                          := TScreen.Create(NIL);
  setlength(Tray_PM, 10);
  Tray_CBox                       := TCheckBox.Create(NIL);

  with Tray_CBox do begin
    Left                          := Tray_CB.L;
    Top                           := Tray_CB.T;
    Caption                       := Tray_CB.Text;
    Parent                        := Tray_Form;
    OnClick                       := @TrayLoad;
    Checked                       := VeeJee.TSOL;
    end;
  TrayIcon1.Visible               := Tray_CBox.Checked;

end;
Ist daher Geschmackssache.
PascalDragon hat geschrieben:
Mo 9. Nov 2020, 13:01
Ich schließe mich Sieben an. Hatte auch nicht gemerkt, dass der Doppelpunkt auch als Teil des Namens abgefragt wird. Aber ja, dann sollte das auch plattformunabhängig so funktionieren. :)
Auf meinem PI muss der : weg.
Timm Thaler hat geschrieben:
Mo 9. Nov 2020, 14:45
Vielleicht sollte man Sachen nicht tun - die einem um die Ohren fliegen könnten? Es gibt zwar keine strenge Konvention zu den Keys, aber:
Some implementations allow a colon (:) as the name/value delimiter (instead of the equals sign).
https://en.wikipedia.org/wiki/INI_file
Sollte man sich merken. :mrgreen:
Zuletzt geändert von Maik81SE am Mo 9. Nov 2020, 17:30, insgesamt 1-mal geändert.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Offropic

Beitrag von Maik81SE »

wp_xyz hat geschrieben:
Mo 9. Nov 2020, 00:38
Das einzige was mir auffällt, ist, dass das eine etwas seltsame Getter/Setter-Konstruktion ist: GetTSOL soll den Wert der Eigenschaft TSOL auslesen (das ist die Aufgabe eines Getters), aber gleichzeitig wird der Wert auch geschrieben, denn du übergibst den aus der ini-Datei gelesenen Wert an fTSOL. Und die Setter-Prozedur, auf der anderen Seite, schreibt nur in die Ini-Datei, aber nicht in die entsprechende Variable fTSOL. Ist das so beabsichtigt?
Um diese Angelegenheit kümmert sich diese schöne Zeile.

Code: Alles auswählen

property TSOL: boolean read GetTSOL write SetTSOL default false;
oder hattest du auf diese Zeilen angespielt?

Code: Alles auswählen

  if FileExists(fFileName+'.tsol') then
    fTSOL                         := GetTSOL
  else
    SetTSOL(false);
Wenn ja, dann geb ich dir recht...
Das was Schrott

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Antworten