title image


Smiley endlosschleife , ?? 1000 Rätsel warum
hi Leute ,

Ich habe eine procedure "Laden", welche mir einen Stream aus entweder einer Datei, oder aus der Registry laden kann. (wo entscheidet sich dann innerhalb des Programms). Dieser Stream ist mit einer Kennung versehen, welche auch eine Versions-Nummer enthält. Wenn ich nun einen "alten" Stream einlesen, wird dies erkannt. Nach der Abfrage auf ein Update des alten Streams in das neue Format, hängt sich das Programm auf, und zeigt nur noch diesen Abfragedialog an. nehme ich den unten rot markierten Teil aus dem Programm raus, läuft es anstandslos. Selbst ein Haltepunkt nach der Abfrage (im roten Teil) lässt das Programm nicht stoppen.

Aber so ganz ohne Abfragedialog wollt ich dann nun doch nicht schreiben. Ausserdem stört mich einfach auch, das es doch gehen müsste !!!





procedure Laden;

begin

try

{...} //s wird aus Ini-Datei gelesen

if length(s) > 0 then ms.LoadFromFile( s ) else LoadFromReg( ms );

if not SetStreamToPropertys( s, ms ) then

raise E_ndoKennungError.CreateFmt( 'Datei ''%s'' ist fehlerhaft' + #13#10 +

'Standardwerte werden geladen.',[ s ]);

{...}

except

on E:Exception do begin

MessageDlg( E.Message, mtInformation, [mbOK], 0);

ResetKonfig;

end;

end;

end;

 



function TSLWKonfig.SetStreamToPropertys( confFilename : string; st : TMemoryStream ): boolean;

var b64 : Int64;

v : variant;

ParaSt : TMemoryStream;

begin

result := false;

if st = nil then exit;

try

{ *** Kennung auslesen *** }

with st do begin

Position := 0;

Read( FKennung.KennRec, SizeOf( FKennung.KennRec ));

if ( Comparetext( FKennung.KennRec.Kennung, _confKennung ) 0 )then

raise E_ndoKennungError.Create('Ungültige Kennung gefunden.');

if ( FKennung.KennRec.Version < _confVersion ) then begin

if MessageDlg( ' Es wurde ein altes unkompatibles Speicherformat gefunden.'+#13+#10+

'Sollen die Daten jetzt in das neue Format konvertiert werden ?',

mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin

confVersionUpdate( st, FKennung.KennRec );

if Length( confFilename ) > 0 then

st.SaveToFile( confFilename) else SaveToReg( st );

SetStreamToPropertys( confFilename, st ); // Rekursion mit neuem Stream

end; // else raise EStreamError.Create('Datenformat kann nicht verarbeitet werden.');

end;

read( FAktiv, sizeof( FAktiv ));

{..usw..}

end;

except

on E:Exception do begin

MessageDlg( E.Message, mtError, [mbOK], 0);

result := false;

end;

end;

end;

 

procedure TSLWKonfig.confVersionUpdate( var FromSt:TMemoryStream; OldKennung : TNDOKennung );

begin

// hier wird einfach nur der stream in einen anderen kopiert

// und erweitert, und als FromSt zurückgegeben

end;





Dank schon im voraus für Eure Mühe

Uwe







Achte auf deine Gedanken - Sie sind der Anfang deiner Taten.   (Chinesisches Sprichwort )



geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: