AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ini-Writes global abfangen?

Ein Thema von a.def · begonnen am 10. Apr 2017 · letzter Beitrag vom 12. Apr 2017
Antwort Antwort
Seite 2 von 4     12 34      
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Ini-Writes global abfangen?

  Alt 10. Apr 2017, 14:48
Naja, mehrere Wege führen nach Rom.
Eine weitere Option wäre ein sog. "Virtual Method Interceptor". Damit kannst Du eine Art Benachrichtigungs-Mechanismus implementieren, der auf Methoden anderer Klassen reagiert.

http://docwiki.embarcadero.com/CodeE...eptor_(Delphi)

Je nachdem, was Dein eigentliches Ziel ist, setzt Du dies auf .UpdateFile oder gleich auf die WriteXX-Methoden an. Diese Lösung ist dahingehend sehr mächtig, Du kannst die Werte der an die eigentliche Methode zu übergebenen Parameter abfragen und ändern oder den Aufruf gänzlich unterbinden.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#12

AW: Ini-Writes global abfangen?

  Alt 10. Apr 2017, 14:49
Um euch aufzuklären:
wenn eine bestimmte Situation im Programm gegeben ist, sollte UpdateFile nichts schreiben dürfen.
Das war mein Hintergedanke. Ich könnte auch vor jedes UpdateFile einfach ein Abfrage schreiben aber das wäre eine echte 0815-Lösung.
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Ini-Writes global abfangen?

  Alt 10. Apr 2017, 15:00
Warum nicht einfach eine Kopie der System.Inifiles Unit im das Projekt aufnehmen
und die gewünschten Änderungen dort einpflegen?
Dann sind keine Änderungen ansonsten im Code notwendig
Fritz Westermann
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#14

AW: Ini-Writes global abfangen?

  Alt 10. Apr 2017, 15:02
Daran habe ich auch schon gedacht. Aber darf ich das so einfach machen?
Leider habe ich "AutoSave" noch nicht (ab Berlin). Das würde ich mir dann in der eigenen Unit nachrüsten.
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Ini-Writes global abfangen?

  Alt 10. Apr 2017, 15:05
Daran habe ich auch schon gedacht. Aber darf ich das so einfach machen?
Leider habe ich "AutoSave" noch nicht (ab Berlin). Das würde ich mir dann in der eigenen Unit nachrüsten.
Klar kannst Du das machen. Solange Du es nicht als Source weitergibst ist das kein Problem
Fritz Westermann
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#16

AW: Ini-Writes global abfangen?

  Alt 10. Apr 2017, 15:38
Meine Lösung für alle die es interessiert:

Delphi-Quellcode:
unit classIni;

interface

uses
 SysUtils, IniFiles;

type
 TMemIniFile_ = class(TMemIniFile)

 private
  FAutoSave: Boolean;
 public
  constructor Create(const FileName: string; const AutoSave: Boolean = True); overload;
  constructor Create(const FileName: string; const Encoding: TEncoding; const AutoSave: Boolean = True); overload;
  destructor Destroy; override;
 end;

implementation

{TMemIniFile}

constructor TMemIniFile_.Create(const FileName: string; const Encoding: TEncoding; const AutoSave: Boolean = True);
begin
 inherited Create(FileName, Encoding);
 FAutoSave := AutoSave;
end;

constructor TMemIniFile_.Create(const FileName: string; const AutoSave: Boolean = True);
begin
 inherited Create(FileName);

 FAutoSave := AutoSave;
end;

destructor TMemIniFile_.Destroy;
begin
 if FAutoSave then
  UpdateFile;

 inherited;
end;

end.
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
 IniF: TCustomIniFile;
begin
 IniF := TMemIniFile_.Create('.....', False);

 try
  IniF.WriteString('section', 'ident', 'value');
 finally
  IniF.Free;
 end;
Info zum Parameter False:
da sollte natürlich nicht einfach nur False stehen, da es nicht wirklich Sinn ergibt.
Mein Problem bestand darin, dass mein Programm keine Ini-Dateien schreiben soll, wenn es im aktuellen Verzeichnis keine Schreibrechte hat.
Das prüft mein Programm beim start und setzt ggf. eine globale Variable (eigene Unit, Record) auf False. Diese Variable übergebe ich dann als zweiten "AutoSave"-Parameter.
Wer mindestens Berlin hat, braucht das nicht.

Gefunden hier: http://www.delphipraxis.net/1352811-post18.html, von Fritzew
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Ini-Writes global abfangen?

  Alt 10. Apr 2017, 15:49
Mal eine Konkretisierung von Daniels Vorschlag:

Du könntest eine Unit uMyIniFiles erstellen und TIniFiles "überschreiben".

Delphi-Quellcode:
  TIniFile = class(IniFiles.TIniFile)
  public
    Blocking: Boolean;
    procedure UpdateFile; override;
  end;

...
procedure TIniFile.UpdateFile;
begin
  if not Blocking then
    inherited;
end;
Wenn Du jetzt in allen uses-Blöcken deines Projektes IniFiles durch uMyIniFiles ersetzt kannst Du nun Blocking verwenden und damit UpdateFiles beeinflussen.

Du kannst so eine bestehende Klasse verändern (bei Beibehaltung des Klassennamens), wenn die betreffende Funktionalität überschreibbar ist.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#18

AW: Ini-Writes global abfangen?

  Alt 10. Apr 2017, 15:57
Bei dieser Umsetzung habe ich jedoch eine Frage.
Wie sieht die konkrete Unit aus, wenn ich TMemIniFile benutzen möchte?
Denn eine Deklaration wie myIniFile: TCustomIniFile; funktioniert mit der Unit ja dann nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#19

AW: Ini-Writes global abfangen?

  Alt 10. Apr 2017, 16:37
PS: UpdateFile hilft nur bei der MemIni.
Die normale INI-API ändert die Datei immer sofort, mit jedem einzelnem WriteXyz-Befehl.
$2B or not $2B
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#20

AW: Ini-Writes global abfangen?

  Alt 10. Apr 2017, 16:39
PS: UpdateFile hilft nur bei der MemIni.
Die normale INI-API ändert die Datei immer sofort, mit jedem einzelnem WriteXyz-Befehl.
Das weiß ich. Deswegen benutze ich ja MemIniFile
Aber ich glaube ich sollte überall TCustomIniFile durch TMemIniFile ersetzen. Weil ich benutze TIniFile ja eh nicht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:02 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