Registriert seit: 19. Sep 2013
Ort: Braunschweig
204 Beiträge
Delphi 6 Professional
|
Array Probleme
8. Apr 2015, 11:09
Hallo Ihr Lieben,
ich habe ein Frage bezüglich Array deklarationen und deren Umsetzung.
Wie Ihr ja wisst, programmiere ich an meiner Oszillator-Komponente rum.
Nun komme ich nicht weiter, ich möchte Werte in ein Array einlesen und diese dann zeichnen lassen.
Das passiert auch und sieht ganz gut aus....
Wie kann ich diese Routine so verallgemeinern, dass wenn externe Werte kommen, diese halt dargestellt werden, benötige ich da noch einen extra Array (Array of ?) oder kann ich das so mit implementieren.....
Hier ein Ausschnitt meines Prog.
Delphi-Quellcode:
type
TFxFunction = function(const x: Extended): Extended;
TPointDynArray = array of TPoint;
THixHistoGraphGridVisible = (grdNone, // kein Rastergitter
grdHor, // horizontales Rastergitter
grdVer, // vertikales Rastergitter
grdBoth); // horizontales und vertikales Rastergitter
THixHistoGraph = class(TCustomPanel)
procedure DrawPointView(ACanvas: TCanvas; const HistoBackround: TRect; const APoints : TPointDynArray);
procedure DrawMeasureValue;
function CalculatePointView(AFunc: TFxFunction; const HistoBackround: TRect; x0, y0, dx, dy: Extended): TPointDynArray;
function mysin(const X: Extended):Extended; // Wrapper-Funktion, benötigt für Delphi 6 um Sinus-Funktion implementieren zu können
begin
Result := sin(x);
end;
function THixHistoGraph.CalculatePointView // Berechnung der Punkte für die Funktionsdarstellung
(AFunc: TFxFunction; const HistoBackround: TRect; x0, y0, dx, dy: Extended): TPointDynArray;
var
x, y: Extended;
i : integer;
begin // für jede Spalte einen Punkt
SetLength(Result, HistoBackround.Right - HistoBackround.Left + 1); // Punkte berechnen
x := 0;
for i := Low(Result) to High(Result) do
begin
y := AFunc(x);
y := -y; // Canvas Nullpunkt obere linke Ecke mit Y- Achse nach unten !!!
y := y0 + y; // oberen Rand Addieren
y := y / dy; // Skalieren
Result[i].x := HistoBackround.Left + i;
Result[i].Y := HistoBackround.Top + Round(y); // runden
x := x + dx;
end; // nächster Punkt
end;
////////////////////////////////////////////////////////////////////////////////
// //
// Zeichnen //
// //
////////////////////////////////////////////////////////////////////////////////
procedure THixHistoGraph.DrawComponent;
var
ComponentBackround : TRect; // zeichnet Komponente
HistoBackround : TRect; // zeichnet die Darstellungsfläche der Komponente
begin
if FBorderstyle = bsSingle then // mit 3D-Rahmen
begin
inherited;
if (Parent = NIL) or not visible
then Exit;
begin
ComponentBackround := Rect(0, 0, Width, Height); // Koponentenhintergrund
Canvas.Brush.Color := FColor;
Canvas.Pen.Color := FColor;
Canvas.Pen.Style := psSolid;
Canvas.FillRect(ComponentBackround);
Frame3D(Canvas, ComponentBackround, clBtnHighlight, clBtnShadow, 1); // 3D Rahmen mit der Breite von 1 für Komponentenhintergrund
end;
begin
HistoBackround := Rect(FGapLeft, // Hintergrund der Darstellungsfläche
FGapTop,
Width - FGapRight,
Height - FGapBottom + 2);
Canvas.Brush.Color := FHistoBkColor;
Canvas.Pen.Color := FHistoBkColor;
Canvas.FillRect(HistoBackround);
Frame3D(Canvas, HistoBackround, clBtnShadow, clBtnHighlight, 1);
DrawGrid;
end;
end;
end;
procedure THixHistoGraph.DrawMeasureValue;
var
x0, y0, dy, dx : Real;
i : Integer;
P : TPointDynArray;
HistoBackround : TRect;
begin
HistoBackround := Rect(FGapLeft, // Hintergrund der Darstellungsfläche
FGapTop,
Width - FGapRight,
Height - FGapBottom + 2);
P:= Nil;
InflateRect(HistoBackround, -1, -1);
for i:= round(FViewXNominalMin) to round(FViewXNominalMax - 1) do
begin
x0 := FViewxNominalMin;
y0 := (Height - FGapBottom - FGapTop) / FYScale.ValMax;
dx := 0.5;
dy := 0.02;
P := CalculatePointView(mySin, HistoBackround, x0, y0, dx, dy);
Canvas.Pen.Style := FSeriesLineStyle;
Canvas.Brush.Color := FColor;
Canvas.Pen.Color := FSeriesColor;
DrawPointView(Canvas, HistoBackround, P);
end;
end;
procedure THixHistoGraph.DrawPointView
(ACanvas: TCanvas; const HistoBackround: TRect; const APoints : TPointDynArray);
var
h : Thandle;
begin
h:= SaveDC(ACanvas.Handle);
try
IntersectClipRect(ACanvas.Handle, HistoBackround.Left, HistoBackround.Top, HistoBackround.Right, HistoBackround.Bottom); // Zeichenfläche einschränken
Polyline(ACanvas.Handle, APoints[0], Length(APoints));
finally
RestoreDC(ACanvas.Handle, h);
end;
end;
Christian
|