AGB  ·  Datenschutz  ·  Impressum  







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

Fehlermeldung bei Schreiben nach CSIDL_APPDATA

Ein Thema von Bjoerk · begonnen am 15. Apr 2011 · letzter Beitrag vom 16. Apr 2011
Antwort Antwort
Seite 2 von 2     12   
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.757 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 20:51
Klaus, funktioniert das auch noch bei Komponenten, die werden u.U. zur Laufzeit schon free und benutzen das selbe initialization/finalization wie die Formulare.
.. ich verstehe nicht genau was Du damit sagen willst.
initialization wird genau einmal ausgeführt.
Wenn mehrere Units einen initialization Abschnitt haben entscheidet die Reihenfolge
in der uses-Klausel darüber wann welcher initialization Abschnitt ausgeführt wird.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 21:28
vorübergehend habe ich es jetzt erst mal so geändert:

Delphi-Quellcode:
implementation

var
  inUseReadFileName: string='';
  inUseWriteFileName: string='';

function TStrIniFile.isFileReadyForRW: boolean;
var
  r,w: boolean;
begin
  RESULT:=true;
  r:=UpperCase(FileName)=UpperCase(inUseReadFileName);
  w:=UpperCase(FileName)=UpperCase(inUseWriteFileName);
  if (r or w) then
  begin
    repeat
      RESULT:=false;
    until ((inUseReadFileName='') and (inUseWriteFileName=''));
    RESULT:=true;
  end;
end;

function TStrIniFile.LoadFile : boolean;
var
  f: TextFile;
  u: string;
  errorCode: Integer;
begin
  RESULT:=false;
  if IniFileExists then
  begin
    if isFileReadyForRW then <--
    begin
      AssignFile(f,FileName);
      {$I-} Reset(f); {$I+}
      errorCode:= IOResult;
      if errorCode=0 then
      begin
        RESULT:=true;
        inUseReadFileName:=FileName; <--
        while not eof(f) do
        begin
          readln(f,u);
          if isIniRow(u) then addItem(u);
        end;
        closeFile(f);
      end;
      if not RESULT then
        MessageDlg(application.ExeName+': '+FileName+' ['+sysErrorMessage(errorCode)+'].',mtWarning,[mbOk],0);
    end;
  end;
  inUseReadFileName:=''; <--
end;

function TStrIniFile.SaveFile : boolean;
var
  f: TextFile;
  i, errorCode: Integer;
begin
  RESULT:=false;
  if FileName<>'then
  begin
    if isFileReadyForRW then <--
    begin
      AssignFile(f,FileName);
      {$I-} Rewrite(f); {$I+}
      errorCode:= IOResult;
      if errorCode=0 then
      begin
        RESULT:=true;
        inUseWriteFileName:=FileName; <--
        for i:=0 to Count-1 do
        begin
          if i>0 then
            if posIS[i]<0 then writeln(f);
          writeln(f,item[i]);
        end;
        closeFile(f);
      end;
      if not RESULT then
        MessageDlg(application.ExeName+': '+FileName+' ['+sysErrorMessage(errorCode)+'].',mtWarning,[mbOk],0);
    end;
  end;
  inUseWriteFileName:=''; <--
end;
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 21:42
besser ist das:
Delphi-Quellcode:
function TStrIniFile.isFileReadyForRW: boolean;
begin
  if UpperCase(FileName)=UpperCase(inUseReadFileName) then
  begin
    repeat until inUseReadFileName='';
  end;
  if UpperCase(FileName)=UpperCase(inUseWriteFileName) then
  begin
    repeat until inUseWriteFileName='';
  end;
  RESULT:=true;
end;
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 16. Apr 2011, 13:07
Zitat:
.. ich verstehe nicht genau was Du damit sagen willst.
initialization wird genau einmal ausgeführt.
Wenn mehrere Units einen initialization Abschnitt haben entscheidet die Reihenfolge
in der uses-Klausel darüber wann welcher initialization Abschnitt ausgeführt wird.
Klaus, ich meinte, ob das Applicationsweit gilt, auch z.B. dann, wenn Komponenten, die modale Ereignisse sind und den gleichen initialization Abschnitt benutzen. Wird der dann bei Komp.Execute nocheinmal ausgeführt? Kann ich aber auch durch ein einfaches Showmessage im initialization Abschnitt selbst testen.

Auf alle Fälle erst mal ein kräftiges Dankeschön für deinen Support, auch an Philip.

Jetzt habe ich gesehen, daß mache Programme gleichzeitig gestartet werden und im OnShow Ereignis erst mal kräftig iniDateien lesen, und zwar die selben. Da bleibt wohl nur diese Variante.

Delphi-Quellcode:
procedure Wait (var N: integer);
var
  fTime: Cardinal;
begin
  fTime:=GetTickCount;
  repeat until (GetTickCount-fTime) > 500;
  N:=N+1;
end;

function TStrIniFile.TryOpenFile (var f: TextFile; const fWrite: boolean): boolean;
var
  N,IO: integer;
begin
  N:=0;
  AssignFile(f,FileName);
  if not fWrite then
  begin
    Repeat
      {$I-} Reset(f); {$I+}
      IO:=IOResult;
      if IO<>0 then Wait(N);
    Until ((IO=0) or (N=10));
  end
  else
  begin
    Repeat
      {$I-} Rewrite(f); {$I+}
      IO:=IOResult;
      if IO<>0 then Wait(N);
    Until ((IO=0) or (N=10));
  end;
  RESULT:=(IO=0);
  if not RESULT then
    MessageDlg(Application.ExeName+': '+FileName+' ['+SysErrorMessage(IO)+'].',mtWarning,[mbOk],0);
end;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.544 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 16. Apr 2011, 14:29
Vielleicht wäre die Verwendung von z.B. FileStreams eine Alternative, da kann man einen Mode (fmShareXXX) mit angeben.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 16. Apr 2011, 15:03
Könnte man beim AssignFile und Co. auch ... Delphi-Referenz durchsuchenFileMode, wenn man weiß wie ,
aber mal was Aktuelleres/OOPmäßigeres kann ja nicht schaden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (16. Apr 2011 um 15:08 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 02:23 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