Einzelnen Beitrag anzeigen

BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

Probleme beim Umstellen von Array zu Stringlist

  Alt 14. Sep 2009, 09:28
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
Angehängte Dateien
Dateityp: zip teilprojekt_oszi_983.zip (1.014,1 KB, 2x aufgerufen)
2. Account Sero
  Mit Zitat antworten Zitat