AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TComport - Access Violation beim wieder-öffnen
Thema durchsuchen
Ansicht
Themen-Optionen

TComport - Access Violation beim wieder-öffnen

Ein Thema von SearchBot · begonnen am 16. Nov 2016 · letzter Beitrag vom 3. Dez 2016
 
SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
328 Beiträge
 
Delphi 12 Athens
 
#1

TComport - Access Violation beim wieder-öffnen

  Alt 16. Nov 2016, 14:06
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.

Geändert von SearchBot (16. Nov 2016 um 14:09 Uhr)
  Mit Zitat antworten Zitat
 

 

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 01:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz