Hallo
ich verwende die TComport-Komponente 4.11
Ich habe das Problem, daß es spätestens bei Programmende zu dieser Meldung kommt und abschließend mit dem Fensterchen "Runtime Error 216":
Benachrichtigung über Debugger-
Exception
---------------------------
Im Projekt ***.exe ist eine
Exception der Klasse $C0000005 mit der Meldung '
access violation at 0x0040a3bc: read of address 0x00000058' aufgetreten.
---------------------------
"Anhalten" bringt mich in ein für mich nichts sagendes CPU-Fenster, der Stack-Verlauf führt mich nicht in den Quelltext.
Dieses Verhalten habe ich immer dann, wenn ich Daten gelesen habe (RxBuf, siehe unten), den Comport schließe und danach wieder öffne - oder spätestens eben bei Programmende.
Es scheint auch keine
Exception zu sein, die in der Komponente abgefangen werden kann (onException wird nicht angesprungen).
Vielleicht habe ich auch was in meinem Object (hier ein Auszug) falsch gemacht?!
Delphi-Quellcode:
type TData = object
Bytes: array[1..50] of byte;
Len:byte;
procedure Clear;
end;
type ... // in einem Object
private
fReceived:AnsiString;
procedure CleanReceived(const Value:Ansistring);
public
Data:TData;
property received:AnsiString read fReceived write CleanReceived;
end;
procedure TData.Clear;
var I: Integer;
begin
for I := 1 to 50 do begin
Bytes[i]:=0;
len:=0;
end;
end;
procedure .. .CleanReceived(const Value:AnsiString);
begin
setlength(fReceived,Length(Value));
fReceived:=Value;
end;
procedure TForm1.ComPort1RxBuf(Sender: TObject; const Buffer; Count: Integer);
var
I: Integer; Buf:Array[1..100] of AnsiChar; s:AnsiString; P:PansiChar;
begin
setLength(s,count);
p:=pAnsichar(@Buffer);
for I := 1 to Count do begin
if i<=100 then begin
Buf[i]:=p^;
Data.Bytes[i]:=ord(Buf[i]);
end;
inc(p);
end;
if count<=100 then
s:=copy(Buf,1,count)
else
s:=copy(Buf,1,100);
received:=s; //pur wie es kommt ins property
s:=AsciiToHex(S); //verschönern als lesefreundliche Hex-Ausgabe; aus JvCsvParse
for I := 1 to length(s)*2 do
if I mod 3=0 then insert(#32,s,i);
if count>100 then s:=s+'...';
lb_Answer.Caption:=s;
end;
Theoretisch könnte dieser Quelltext ursächlich sein, ich meine, es habe mal in TData.Clear geknallt, aber ich sehe darin keinen Fehler!?
Wo stimmt da was nicht?
Danke im Voraus fürs mitdenken.