Hallo @Klaus das mit der TList schaue ich mir gleich mal an, kannte ich einfach noch nicht. Ziel für mich ist es, dass ich vom Start des Programmes bis zur Terminierung alle Daten im Speicher behalte. Die bisherige Lösung über ein Array (dieses Array hatte die Größe der Breite vom Darstellungsbildschirm) führte zum Datenverlust aller Werte außerhalb des Darstellungsbildschirmes.
Bei der Verwendung von Array muss ich mich außerdem immer um die Vergrößerung des Feldes selber kümmern, was nachteilhaft ist, wie ich finde (ständig müssen Arrays erstellt, kopiert und bearbeitet werden) nachteilhaft ist, wenn ich bei einer Liste (wie z.B. TStringList) einfach nur ein Add ausführen muss.
Die Zeitverzögerung ist mir bewusst, die hat sich nur eingeschlichen, weil ich es aus einem großen Projekt zur einfacheren Bearbeitung ausgelagert hab. Aber daran liegt der Fehler nicht, da ich das bei mir über 10sek hab laufen lassen und nichts wirklich passierte. Die Nachrichtenschleife des Projektes arbeitet irgenwie nicht und das Programm läd (anscheinend) nicht fertig.
BAMatze
[Edit1] Der Fehler konnte insofern schon eingegrenzt werden, dass beim auskommentieren folgender Zeile in der Oberklasse:
Delphi-Quellcode:
procedure TOszilloskop.FOnSignalEingang(Sender: TObject; const IdentNumber: integer);
var i: integer;
TempBitmap: TBitmap;
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; // <-- Hier scheint es ein Problem zu geben. Wenn auskommentiert, ist Problem gelöst aber es gibt keine Darstellung (was natürlich logisch ist, weil die Paintbox nicht gezeichnet wird!)
end;
[/Edit]
[Edit2] Fehler steckt in Folgendem Quellcode, was ich aber nicht verstehe, da dieser bisher noch nie Probleme gemacht hat:
Delphi-Quellcode:
//Quellcodeteil aus der NewPaint-procedure in Oberklasse
for i := 0 to Length(FCB_Layer)-1 do
begin
if FCB_Layer[i].Checked then transparentBlt(FDarstellungsBitmap.Canvas.Handle, 0, 0, FDarstellungsBitmap.width, FDarstellungsBitmap.Height,
Fbitmap[i+1].Canvas.Handle, 0, 0, Fbitmap[i+1].Width, Fbitmap[i+1].Height, FCtransparentColor);
end;
[/Edit]
2. Account Sero