beste specialisten
Uit een extern programma krijg ik real time data(zeer onregelmatig en steeds 1 regeltje welke steeds ververst wordt: xxxx;yyyy; ) in een kladblok (prn-file)aangeleverd.
Dit extern programma(een scripttaal ,met weinig meer mogelijkheden dan deletefile en appendfile) moet de gegevens wel kwijt kunnen anders geeft het daar een exception en stokt de toevoer van gegevens.
Dat is helaas een gegeven ;daar kan ik niets aan veranderen.
Nu wil ik die data uit de prn-file lezen en in een eigen programma verwerken.
Tot nu toe heb ik gegevens beperkt tot een enkel getal welk via een timer elke seconde uitlees.via een stringlistcreate\load \savefile constructie
Maar wanneer veel data aangeleverd worden , dan komt het voor dat het aanleverende progrmma in de fout gaat.
Ik wilde daarom tfilestream gebruiken omdat het daar mogelijk is via een buffer een file gelezen kan worden terwijl een een extern programma wel in deze file kan schrijven .Toch gaat nog steeds het aanleverde programma in de fout.
ik doe dit nu als volgt
Code:
function Tophaler.ReadStringFromFile(AFileName: string): string;
var
FileStream: TFileStream;
Size: Integer;
begin
Result := '';
if not FileExists(AFileName) then
Exit;
FileStream := TFileStream.Create(AFileName, fmShareDenyread);
Size := FileStream.Size;
if Size > 0 then
begin
SetLength(Result, Size);
FileStream.ReadBuffer(Result[1], Size);
end;
FreeAndNil(FileStream);
end;
de funktie is opgenomen in de procedure streamdataophaler welke wordt angeroepen in een timer met interval va 1 sec:
Code:
procedure Tophaler.streamdataophaler;
var totaalstring :ansistring;
datAstring,datBstring:ansistring;
SL: TStringList;
begin
totaalstring:= ReadStringFromFile( datafileregel);
SL := TStringList.Create;
try
SL.Delimiter := ';';
SL.StrictDelimiter := True;
SL.DelimitedText := totaalstring;
datAstring := SL.Strings[0];
datBstring:=SL.Strings[1];
fgegevenA:=strtofloat(datAstring);
FgegevenB:= strtoint( datBstring);
finally
SL.Free;
end;
.
.
.
.etc
end;
wat gaat hier fout
Bookmarks