Einzelnen Beitrag anzeigen

BAMatze

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

Re: Probleme beim Umstellen von Array zu Stringlist

  Alt 14. Sep 2009, 10:14
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
  Mit Zitat antworten Zitat