Hallo aus einem mir noch nicht nachvollziehbaren Grund bremst sich meine eigene Klasse nach der Umstellung der Klasse von einem festen Array auf ein TStringList, komplett aus, so dass man das Programm nicht mehr benutzen kann (Cursor ändert sich durch Windows in crHourGlass nicht durch das Programm)- passiert gleich beim Starten.
Hier mal die Klasse:
Delphi-Quellcode:
Type TOszilloskopKanal = class
private
FsLDaten: TStringList; // <-- Hier war vorher ein array of double
FadExtremaWert: array[0..4] of double;
FdMaxWert, FdMinWert: double;
FbAbfragen: boolean;
FiIdent: integer;
FsName: string;
FKanalColor, FBackgroundColor: TColor;
FOnChangeEingang: TOnChangeEingangEvent;
procedure SetYWert(dWert: double);
procedure SetName(sWert: string);
procedure SetKanalFarbe(cWert: TColor);
function GetYWert(Index: integer): double;
function GetName: string;
function GetKanalFarbe: TColor;
function GetIdent: integer;
function GetCountEingangswerte: integer;
function GetMax: double;
function GetMin: double;
protected
procedure doChangeEingang;
published
property OnChangeEingang: TOnChangeEingangEvent read FOnChangeEingang write FOnChangeEingang;
public
constructor create(Number: integer); reintroduce;
destructor destroy; override;
property EingangY: double write SetYWert;
property IdentNumber: integer read GetIdent;
property AusgangY[Index: integer]: double read GetYWert;
property Name: string read GetName write SetName;
property KanalColor: TColor read GetKanalFarbe write SetKanalFarbe;
property CountEingangsWerte: integer read GetCountEingangswerte;
property Max: double read GetMax;
property Min: double read GetMin;
end;
implementation
constructor TOszilloskopKanal.Create(Number: integer);
var i: integer;
begin
inherited create;
FiIdent := Number;
FsName := 'Signal '+ inttostr(Number);
FKanalColor := clblue;
FsLDaten := TStringList.Create;
FsLDaten.Add('0');
FdMaxWert := 0;
FdMinWert := 0;
end;
destructor TOszilloskopKanal.Destroy;
begin
FsLDaten.Free;
inherited destroy;
end;
// Es werden immer nur die letzen Werte gesetzt
procedure TOszilloskopKanal.SetYWert(dWert: double);
begin
FsLDaten.Add(floattostr(dWert));
//Extremas überprüfen und ggf neu setzen
if dWert > FdMaxWert then FdMaxWert := dWert;
if dWert < FdMinWert then FdMinWert := dWert;
doChangeEingang;
end;
// Getter und Setter wurden entfernt, um den Text hier möglichst kurz zu halten
procedure TOszilloskopKanal.doChangeEingang;
begin
if Assigned(FOnChangeEingang) then FOnChangeEingang(Self, FiIdent);
end;
end.
Da ich eventuell noch vermute, dass die übergeordnete Klasse der Verursacher des Problems ist, hier noch mal auszüge, die die Schnittstellen in der höheren Klasse darstellen:
Delphi-Quellcode:
constructor TOszilloskop.create(AOwner: TComponent; CountChannel: Integer);
var i, j: integer;
begin
inherited create(AOwner);
Controlstyle := Controlstyle - [csAcceptsControls]; // Der Componente wird nicht erlaubt
// andere Componenten aufzunehmen,
// als die, die durch den Programmierer
// hier einprogrammiert werden.
//Initialisierung
SetLength(FSignal, CountChannel);
for i := 0 to CountChannel-1 do
begin
FSignal[i] := TOszilloskopKanal.create(i+1);
j := i;
if j >= 5 then repeat j := j-5; until (j < 5);
case j of
0 : FSignal[i].KanalColor := clmaroon;
1 : FSignal[i].KanalColor := clblue;
2 : FSignal[i].KanalColor := clgreen;
3 : FSignal[i].KanalColor := clyellow;
4 : FSignal[i].KanalColor := clred;
else FSignal[i].KanalColor := clwhite;
end;
FSignal[0].OnChangeEingang := FOnSignalEingang;
FDarstellungsBitmap := TBitmap.Create;
FDarstellungsBitmap.Width := FiDisplayWidth;
FDarstellungsBitmap.Height := FiDisplayHeight;
end;
destructor TOszilloskop.Destroy;
var i: integer;
begin
// Freigabe
for i := 0 to Length(FSignal)-1 do FSignal[i].Free;
SetLength(FSignal,0);
inherited destroy;
end;
// Wenn im Eingang ein Signal anliegt, wird die höhere Klasse darüber informiert und (soll) das Bild für den Kanal neu zeichnen!!
procedure TOszilloskop.FOnSignalEingang(Sender: TObject; const IdentNumber: integer);
var i: integer;
TempBitmap: TBitmap;
// zu jedem FSignal gehört ein FBitmap, in welchem der Graph, welcher im FSignal gespeichert sein soll, darstellt wird.
begin
GetRange;
Maske_erstellen;
TempBitmap := TBitmap.Create;
TempBitmap.Height := FiDisplayHeight;
if FSignal[IdentNumber].CountEingangsWerte < FiDisplayWidth then
begin
TempBitmap.Width := FSignal[IdentNumber].CountEingangsWerte;
TempBitmap.Canvas.CopyRect(rect(0,0,FSignal[IdentNumber].CountEingangsWerte-1,FiDisplayHeight),FBitmap[IdentNumber-1].Canvas,rect(0,0,FSignal[IdentNumber].CountEingangsWerte-1,FiDisplayHeight));
//TempBitmap.Assign(FBitmap[IdentNumber-1]);
TempBitmap.Canvas.Pen.Color := FCtransparentColor;
TempBitmap.Canvas.MoveTo(TempBitmap.Width, 0);
TempBitmap.Canvas.LineTo(TempBitmap.Width, FiDisplayHeight);
TempBitmap.Canvas.Pen.Color := FSignal[IdentNumber-1].KanalColor;
TempBitmap.Canvas.MoveTo(TempBitmap.Width-1, FiDisplayHeight-5 - round((FSignal[IdentNumber-1].AusgangY[FSignal[IdentNumber-1].CountEingangswerte-2]- FdDisplayMin)*FdDisplayStrech));
TempBitmap.Canvas.LineTo(TempBitmap.Width, FiDisplayHeight-5 - round((FSignal[IdentNumber-1].AusgangY[FSignal[IdentNumber-1].CountEingangswerte-1]- FdDisplayMin)*FdDisplayStrech));
FBitmap[IdentNumber].Width := FSignal[IdentNumber].CountEingangsWerte;
FBitmap[IdentNumber].Assign(TempBitmap);
end
else
begin
TempBitmap.Width := FiDisplayWidth;
end;
TempBitmap.Free;
for I := 0 to Length(FSignal)-1 do InitBitmap(i+1);
FPB_Display.Refresh;
end;
Sieht jemand eventuell, wo der Fehler liegt?
Habe zum besseren Verständnis mal das Projekt angehängt.
Vielen Dank
BAMatze
2. Account Sero