Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Array Probleme (https://www.delphipraxis.net/184586-array-probleme.html)

Chris211183 8. Apr 2015 10:09

Array Probleme
 
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;

Mavarik 8. Apr 2015 11:14

AW: Array Probleme
 
Zitat:

Zitat von Chris211183 (Beitrag 1296621)
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.....

Hi!

Bitte am besten vor einem Code-Posting mal den Source formatieren lassen... 8-)

Zu Deiner Frage...

Wo kommen die Werte her und kommen die als Block oder immer einer nach dem anderen?

Kommen die aus einem Thread?

Mavarik

Chris211183 8. Apr 2015 11:15

AW: Array Probleme
 
ist es machbar, dass ich in der DrawMeasurreValue -Routine eine variabel z.B.

Delphi-Quellcode:
Data: Array[1..1024] of Real;
deklariere und den mit Werten fülle und diese dann darstellen lasse ?

Wie kann dieser denn mit externen Werten gefüllt werden ?

Sorry, bin komplett neu in der Welt der Array´s

Habt Gnade:duck:

Chris211183 8. Apr 2015 11:18

AW: Array Probleme
 
die kommen von einer Ultraschallkarte und das Signal soll dann angezeigt werden, zur Zeit ist das aber erstmal nebenläufig, im Prinzip geht es erstmal darum, dass ich die Möglichkeit habe, externe Werte einlesen zu können...in ein Array und diese dann gezeichnet werden

Mavarik 8. Apr 2015 11:20

AW: Array Probleme
 
Zitat:

Zitat von Chris211183 (Beitrag 1296646)
ist es machbar, dass ich in der DrawMeasurreValue -Routine eine variabel z.B.

Delphi-Quellcode:
Data: Array[1..1024] of Real;
deklariere und den mit Werten fülle und diese dann darstellen lasse ?

Wie kann dieser denn mit externen Werten gefüllt werden ?

Sorry, bin komplett neu in der Welt der Array´s

Habt Gnade:duck:

Auch wenn Du meine Frage überhaupt nicht beantwortet hast... :twisted:

Wo Du das Array definierst ist doch egal... Von mir aus Global... Darum geht es doch nicht...

Aber ich gehe mal davon aus, dass Die Werte doch ggf. sehr schnell rein kommen und dann doch - am besten - in Echtzeit dargestellt werden sollen...

Klingt mir nach einem Ringpuffer mit Schreibe- Lesezeiger.

Mavarik

mkinzler 8. Apr 2015 11:23

AW: Array Probleme
 
In eine lokale Variable der Methode kannst Du gar nicht schreiben. Du müsstest die Werte woanderst abspeichern, z.B. direkt in der Klasse.

Chris211183 8. Apr 2015 11:26

AW: Array Probleme
 
Sorry, ja die kommen sehr schnell, einer nach dem anderen.....
und die Echtzeitdarstellung ist auf jeden Fall von Nöten....

Wie kann ich das realisieren ? :gruebel:

Das übersteigt meine programmierkünste bei weitem, befürchte ich

Mavarik 8. Apr 2015 11:28

AW: Array Probleme
 
Zitat:

Zitat von Chris211183 (Beitrag 1296657)
Sorry, ja die kommen sehr schnell, einer nach dem anderen.....
und die Echtzeitdarstellung ist auf jeden Fall von Nöten....

Wie kann ich das realisieren ? :gruebel:

Das übersteigt meine programmierkünste bei weitem, befürchte ich

Du hast doch die X-Zeitachse und die Y-Werteachse...

Wie synchronisierst Du die beiden Werte?

Chris211183 8. Apr 2015 11:29

AW: Array Probleme
 
Zitat:

Zitat von mkinzler (Beitrag 1296655)
In eine lokale Variable der Methode kannst Du gar nicht schreiben. Du müsstest die Werte woanderst abspeichern, z.B. direkt in der Klasse.

ja das stimmt, also lagere ih das im Private bereich und somit Global..., verstehe ich das richtig ?

Mavarik 8. Apr 2015 11:31

AW: Array Probleme
 
Zitat:

Zitat von Chris211183 (Beitrag 1296659)
Zitat:

Zitat von mkinzler (Beitrag 1296655)
In eine lokale Variable der Methode kannst Du gar nicht schreiben. Du müsstest die Werte woanderst abspeichern, z.B. direkt in der Klasse.

ja das stimmt, also lagere ih das im Private bereich und somit Global..., verstehe ich das richtig ?

Der private Bereich ist Private und gerade nicht global!

Chris211183 8. Apr 2015 11:31

AW: Array Probleme
 
Zitat:

Zitat von Mavarik (Beitrag 1296658)
Zitat:

Zitat von Chris211183 (Beitrag 1296657)
Sorry, ja die kommen sehr schnell, einer nach dem anderen.....
und die Echtzeitdarstellung ist auf jeden Fall von Nöten....

Wie kann ich das realisieren ? :gruebel:

Das übersteigt meine programmierkünste bei weitem, befürchte ich

Du hast doch die X-Zeitachse und die Y-Werteachse...

Wie synchronisierst Du die beiden Werte?

Mache ich das nicht in THixHistograph.CalculatePoint View ?

Mavarik 8. Apr 2015 11:40

AW: Array Probleme
 
Zitat:

Zitat von Chris211183 (Beitrag 1296661)
Zitat:

Zitat von Mavarik (Beitrag 1296658)
Zitat:

Zitat von Chris211183 (Beitrag 1296657)
Sorry, ja die kommen sehr schnell, einer nach dem anderen.....
und die Echtzeitdarstellung ist auf jeden Fall von Nöten....

Wie kann ich das realisieren ? :gruebel:

Das übersteigt meine programmierkünste bei weitem, befürchte ich

Du hast doch die X-Zeitachse und die Y-Werteachse...

Wie synchronisierst Du die beiden Werte?

Mache ich das nicht in THixHistograph.CalculatePoint View ?

Nein eigentlich nicht... Hier nimmst Du ja feste Werte Deiner Anzeigenbreite...

Wenn Du Werte von Außen bekommst, brauchst Du ja die Zeiteinheit...

Beispiel: Du hast eine Abtastrate von 40 KHz... Also bekommst Du 40000 werte pro Sekunde... Diese Werte musst Du ja umrechnen auf Bildschirmbreite, damit Du eine stehende Welle hast... (Oder was auch immer da rein kommt)...

Wenn Deine Abtastrate aber variable ist, musst Du wissen wann oder wie schnell die Werte reingekommen sind...
Sonst kommt ja hinten nur Müll raus..

Wenn Du also 40000 Werte pro Sekunde hast, musst Du sicherlich erst mal eine sinnvolle Datenreduktion/Interpolation machen... Oder?

Mavarik

Chris211183 8. Apr 2015 11:49

AW: Array Probleme
 
mhhhhhhhhhh :roll:

Mavarik 8. Apr 2015 13:08

AW: Array Probleme
 
Zitat:

Zitat von Chris211183 (Beitrag 1296675)
mhhhhhhhhhh :roll:

Das habe ich mir gedacht... :-D

Chris211183 9. Apr 2015 09:11

AW: Array Probleme
 
Zitat:

Zitat von Mavarik (Beitrag 1296703)
Zitat:

Zitat von Chris211183 (Beitrag 1296675)
mhhhhhhhhhh :roll:

Das habe ich mir gedacht... :-D

:stupid: nicht lustig, ich kotz hier voll ab :wall:

Der schöne Günther 9. Apr 2015 09:39

AW: Array Probleme
 
Ich glaube bin mir sicher du würdest mehr Hilfe erhalten wenn du dein Problem klar und prägnant beschreiben kannst. Du erzählst irgendetwas von Malen und "externen Werten", im Titel geht es um "Array Probleme" und das einzig konkrete sind zwei Seiten Code die man noch nicht einmal bei sich ausführen kann.

Kannst du einmal in maximal drei Sätzen beschreiben welches konkrete Problem du lösen möchtest?

Vielleicht bin ich auch einfach nicht sonderlich schlau, Mavarik scheint ja verstanden zu haben worum es geht...

Chris211183 9. Apr 2015 09:47

AW: Array Probleme
 
okay, ich versuche das mal...

Ich möchte erst einmal einen Array haben, der mit beliebig vielen "Daten" gefüllt werden kann.
Da ich ja nicht weiß, wieviele "Signale" kommen...
Diese Daten sollen dann visuell in meiner Komponente dargestellt werden. (Funktionsprinzip Oszilloskop)

Dabei ist meine X-Achse die Zeit und meine Y-Achse die Intensität(Amplitude).

in erster Linie habe ich keine Ahnung, wie man soetwas macht, würde es aber gern lernen...
Google und die Hilfe bringen mich nicht weiter....

Klaus01 9. Apr 2015 10:07

AW: Array Probleme
 
.. wie bekommst Du denn die Daten?

a) seriell, allso eine Zeiteinheit nach der anderen
- dann kannst Du den Array (Queue, Schieberegister) von hinten füllen
- ein 1. Zeiteinheit
- dann zweite Zeiteinheit dahinter
- usw.
Dann kannst Du das Bild "langsam" aufbauen
Es verschiebt sich dann von rechts kommend nach links.
Oder du wartest bis Dein Array vollständig gefüllt ist und zeichnest es dann.
Gefüllt ist es dann, wenn alle Daten 40000 bei 40Khz Abtastrate in Deinem Array angekommen sind.

b) einen Buffer mit allen Daten aus mehreren Zeiteiheiten
- mit dem Buffer befüllst Du dann Dein Array
- zeichnest das Array.

Grüße
Klaus

Der schöne Günther 9. Apr 2015 10:10

AW: Array Probleme
 
Ich ignoriere Klaus, der relativ komplexe Sachen wie "wartest bist dein Array gefüllt ist" mit einem Halbsatz abfrühstückt, einfach mal und sage nur was über Array Grundlagen:

Zitat:

Zitat von Chris211183 (Beitrag 1296869)
Ich möchte erst einmal einen Array haben, der mit beliebig vielen "Daten" gefüllt werden kann.

Es gibt zwei verschiedene Arten von Arrays: Statische und dynamische. Bei statischen gibst du an, von wo bis wo:
Delphi-Quellcode:
var
   meinZwölferArray: array[0..11] of Integer;
In das Array passen genau 12 Integer rein. Mavarik ist glaub ich ein Fan von den Dingern, ich habe die in meinem Leben noch nie benutzt.

Die zweite Möglichkeit sind dynamische Arrays: Die sind gut für dich, denn die können so groß werden bis dein Speicher voll ist. Da lässt man die expliziten Größenangaben einfach weg:
Delphi-Quellcode:
var
   meinIntegerArray: array of Integer;
Nach der Deklaration hat das dynamische Array erst einmal die Größe Null. Es passen keine Elemente hinein. Wenn nun 500 Integer hineinpassen sollen musst du sagen
Delphi-Quellcode:
SetLength(meinIntegerArray, 500);
Sagen wir die Integer-Werte stellen einen Absolutwert da (Y-Achse). Der Index (die wievielte Stelle im Array) ist der Wert auf der X-Achse. Um jetzt alle Werte zu nehmen und auszugeben, gehst du so drüber:
Delphi-Quellcode:
var
   meinIntegerArray: array of Integer;
   arrayIndex:   Integer;
begin
   SetLength(meinIntegerArray, 10);
   for arrayIndex := Low(meinIntegerArray) to High(meinIntegerArray) do
      ShowMessage( IntToStr(meinIntegerArray[arrayIndex]) );


Erstmal: Alles klar soweit in Sachen Arrays?

DeddyH 9. Apr 2015 10:14

AW: Array Probleme
 
Etwas ausführlicher (Englisch): http://delphibasics.co.uk/Article.asp?Name=Arrays

Chris211183 9. Apr 2015 10:15

AW: Array Probleme
 
Ahhhhhhh :thumb:

Ich wurde erleuchtet, ja das beantwortet meine Frage fürs erste, werde mich mal dran versuchen !

Besten Dank an Alle !

Bjoerk 9. Apr 2015 10:29

AW: Array Probleme
 
Aber nur fürs Erste.:wink: Wenn du das Bild aufbauen möchtest muß man schon noch bissl mehr wissen: Bildgröße und die Max/Min-Werte von X und Y.

Chris211183 9. Apr 2015 10:48

AW: Array Probleme
 
Zitat:

Zitat von Bjoerk (Beitrag 1296881)
Aber nur fürs Erste.:wink: Wenn du das Bild aufbauen möchtest muß man schon noch bissl mehr wissen: Bildgröße und die Max/Min-Werte von X und Y.

Die Bildgröße ermittle ich ja in der CalculatePointView Routine, die Max und Min Werte sind doch meine Maximalen und Minimalen Skalen-Werte, also YMax, YMin, XMax und XMin

Meine "Daten" die dargestellt werden, sollen den Rückgabewert Real haben...
Meine Skalenwerte sind Double...

wie würdet ihr dann weiter vorgehen ?

Klaus01 9. Apr 2015 10:59

AW: Array Probleme
 
.. Du hast 40000 Messwerte pro Sekunde bei einer 40Khz Abtastrate.
Diese Werte kannst Du wahrscheinlich nicht einzeln auf einem Bildschirm darstellen.
Daher musst Du diese, wie schon einmal gesagt, interpolieren.

Wenn Du eine Sekunde mit einer Fenstergröße/breite von 1000 Punkten darstellen willst:
Dann musst Du aus 40 Messwerten einen errechnen.
40000 / 40 = 1000

In Y Richtung musst Du ähnlich vorgehen.

Grüße
Klaus

p80286 9. Apr 2015 11:13

AW: Array Probleme
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1296875)
In das Array passen genau 12 Integer rein. Mavarik ist glaub ich ein Fan von den Dingern, ich habe die in meinem Leben noch nie benutzt.

Ich denke, es kommt darauf an was man machen will.
In diesem Fall scheint mir etwas derartiges sinnvoll zu sein:

Code:
inputbuffer : array of MyInputValues;
displaybuffer : array [1..maxDisplayvalue];

readerthread:
  fill_inputbuffer
mainthread:
  transferdatafrominputbuffer_to_displaybuffer;
  displaydatafromdisplaybuffer;
Ich gehe mal davon aus, das für die Anzeige immer maxDisplayvalue Werte benötigt werden. Also wird beim Display-Aufrum immer der vollständige Displaybuffer ausgegeben.

Beim Transfer werden die Daten aus dem Inputbuffer so aufbereitet, das sie sinnvoll in den Displaybuffer passen und natürlich auch ein aussagekräftiges Bild ergeben.
Und die "Verwaltung" der Werte findet hier statt, z.B. Löschen der bereits angezeigten Werte, speichern in einem Historyfile usw.

Fillinputbuffer ist nur dafür zuständig Werte entgegen zu nehmen und sie in den Inputbuffer zu schreiben.


Gruß
K-H

Der schöne Günther 9. Apr 2015 11:19

AW: Array Probleme
 
Aber ich sehe nicht, was ich dadurch gewinne, außer mir eine
Delphi-Quellcode:
SetLength(..)
-Zeile zu sparen indem ich in quasi in die Deklaration integriere.

Mehr noch, ich würde über das komische Array das für den Index 0 einen Fehler werfen wird stolpern. Und mich ärgern, dass die Anzahl der Display-Werte auf alle Zeit fest ist. Der Benutzer kann, mit einem schnelleren Rechner, die Grafik nicht einfach selbst über einen Dialog "feiner aufgelöst" stellen.

Mavarik 9. Apr 2015 11:20

AW: Array Probleme
 
Mit Sicherheit noch "schlimmer"...

Thread 1 holt die Werte extern ab...
Thread 2 berechnet die Interpolationen und den Zeit/Shift Faktor...

Mainthread stellt die Werte da..

Jeder ossi hat doch einen Tilt und Shift Regler der das dargestellte Zeitintervall und die Amplitude anpassen kann...

Mavarik 9. Apr 2015 11:24

AW: Array Probleme
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1296895)
einfach selbst über einen Dialog "feiner aufgelöst" stellen.

Klar... aber der User kann im seltensten Fall mehr Pixel an den Bildschirm kleben...
Ob ab 0 oder 1 ist Geschmacksache... Seit es dynamische Arrays gibt habe ich mir angewöhnt alles ab 0 zu definieren...

Wenn ich etwas spezielles brauche, mache ich daraus ein Record und eine Property Werte[Index.Integer]!

Chris211183 9. Apr 2015 12:13

AW: Array Probleme
 
Okay, jetzt hab ich nur noch Matsch im Schädel :pale:

Chris211183 9. Apr 2015 12:20

AW: Array Probleme
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal der komplette Source und im Anhang, wie es aussieht....





Delphi-Quellcode:
unit HixHistograph;

interface

uses
  Windows,SysUtils, Classes,Controls, Graphics, StdCtrls, Variants, Forms,
  Dialogs, Math, ExtCtrls, Types, Mathe, Scales;

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)


private
   FValue                  : Real;
   FVisible                : Boolean;
   FTabOrder               : Integer;
   FBorderstyle            : TBorderstyle;
   FGapLeft                : Integer;                                         // Abstand vom linken Rand
   FGapRight               : Integer;                                         // Abstand vom rechten Rand
   FGapTop                 : Integer;                                         // Abstand von Oberkante
   FGapBottom              : Integer;                                         // Abstand von Unterkante
   FHistoBkColor           : TColor;                                          // Farbe der Darstellungsfläche
   FColor                  : TColor;                                          // Farbe des Hintergrunds
   FVersion                : String;
   FFont                   : TFont;
   FGridLineStyle          : TPenStyle;
   FViewXNominalMin        : Real;
   FViewXNominalMax        : Real;
   FXScale                 : THorScale;
   FYScale                 : TVertScale;
   FGridVisible            : THixHistoGraphGridVisible;                       // stellt Rastergitter in der Darstellungsfläche zur Verfügung
   FBKGridColor            : TColor;                                          // Farbe des Rastergitters
   FSeriesColor            : TColor;                                          // Farbe der Messkurven
   FSeriesNumber           : Integer;                                         // Anzahl der Messkurven
   FSeriesCurrent          : Integer;                                         // Wahl der Messkurve, die eingestellt werden soll
   FSeriesLineStyle        : TPenStyle;

   Procedure SetTabOrder(const Value: Integer);
   procedure SetVisible(const Value: Boolean);
   procedure SetBorderstyle(const Value: TBorderstyle);
   procedure SetGapLeft(const Value: Integer);
   procedure SetGapRight(const Value: Integer);
   procedure SetGapTop(const Value: Integer);
   procedure SetGapBottom(const Value: Integer);
   procedure SetColor(const Value: TColor);
   procedure SetVersion(const Value: String);
   procedure SetFont(const Value: TFont);
   procedure SetValue(const Value: Real);
   procedure DrawComponent;                                                    // zeichnet Hintergrund und Darstellungsfläche
   procedure SetGridLineStyle(const Value: TPenStyle);
   procedure SetViewXNominalMin(const Value: Real);
   procedure SetViewXNominalMax(const Value: Real);
   procedure SetXScale(const Value: THorScale);
   procedure SetYScale(const Value: TVertScale);
   procedure SetGridVisible(const Value: THixHistoGraphGridVisible);
   procedure SetBKGridColor(const Value: TColor);
   procedure SetHistoBkColor(const Value: TColor);
   procedure SetSeriesColor(const Value: TColor);
   procedure SetSeriesNumber(const Value: Integer);
   procedure SetSeriesCurrent(const Value: Integer);
   procedure SetSeriesLineStyle(const Value: TPenStyle);
   procedure DrawGrid;                                                         // zeichnet Rastergitter
   procedure DrawPointView(ACanvas: TCanvas; const HistoBackround: TRect; const APoints : TPointDynArray);
   procedure DrawMeasureValue;
   procedure DrawValue; // Test
   function CalculatePointView(AFunc: TFxFunction; const HistoBackround: TRect; x0, y0, dx, dy: Extended): TPointDynArray;
   { Private-Deklarationen }


protected
   procedure Paint; override;
   { Protected-Deklarationen }

public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure SetBounds (Left, Top, Width, Height: Integer); override;
    procedure Resize; override;                                                // damit lassen sich die geerbten Abmessungen neu setzen
    { Public-Deklarationen }

published
   Property Version           : String                   read FVersion
                                                           write SetVersion;
   Property Color             : TColor                   read FColor
                                                           write SetColor;
   Property HistoBkColor      : TColor                   read FHistoBkColor
                                                           write SetHistoBkColor;
   Property GapLeft           : Integer                  read FGapLeft
                                                           write SetGapLeft;
   Property GapRight          : Integer                  read FGapRight
                                                           write SetGapRight;
   Property GapTop            : Integer                  read FGapTop
                                                           write SetGapTop;
   Property GapBottom         : Integer                  read FGapBottom
                                                           write SetGapBottom;
   Property Borderstyle       : TBorderstyle             read FBorderstyle
                                                           write SetBorderstyle;
   Property Visible           : Boolean                  read FVisible
                                                           write SetVisible;
   Property TabOrder          : Integer                  read FTabOrder
                                                           write SetTabOrder;
   Property Font              : TFont                    read FFont
                                                           write SetFont;
   Property GridLineStyle     : TPenStyle                read FGridLineStyle
                                                           write SetGridLineStyle;
   Property ViewXNominalMin   : Real                     read FViewXNominalMin
                                                           write SetViewXNominalMin;
   Property ViewXNominalMax   : Real                     read FViewXNominalMax
                                                           write SetViewXNominalMax;
   Property Value             : Real                     read FValue
                                                           write SetValue;
   Property XScale            : THorScale                read FXScale
                                                           write SetXScale;
   Property YScale            : TVertScale               read FYScale
                                                           write SetYScale;
   Property GridVisible       : THixHistoGraphGridVisible read FGridVisible
                                                           write SetGridVisible;
   Property BKGridColor       : TColor                   read FBKGridColor
                                                           write SetBKGridColor;
   Property SeriesColor       : TColor                   read FSeriesColor
                                                           write SetSeriesColor;
   Property SeriesNumber      : Integer                  read FSeriesNumber
                                                           write SetSeriesNumber;
   Property SeriesLineStyle   : TPenStyle                read FSeriesLineStyle
                                                           write SetSeriesLineStyle;
   Property SeriesCurrent     : Integer                  read FSeriesCurrent
                                                           write SetSeriesCurrent;

   Property Anchors;
   Property Cursor;
   Property Constraints;
   Property Align;
   Property OnClick;
   Property OnDblClick;
   Property Enabled;
   Property OnDragDrop;
   Property OnDragOver;
   Property OnEndDock;
   Property OnEndDrag;
   Property ShowHint;
   Property Caption;
   Property Name;
   Property DockOrientation;
  { published-Deklarationen }
end;


procedure Register;

implementation

{$R HixHistoGraph.dcr}                                                          // CH-- 140401

procedure Register;
begin
   RegisterComponents('Histo',[THixHistoGraph]);                               // CH-- 140401, ToDO noch ändern, bei HixKomponenteneintrag ändern
end;

constructor THixHistoGraph.Create(AOwner: TComponent);
begin
  inherited;
  FVersion             := '2014.4';
  FColor               := clBtnFace;
  FHistoBkColor        := cl3DDkShadow;
  Width                := 1100;
  Height               := 400;
  FGapTop              := 40;
  FGapBottom           := 60;
  FGapLeft             := 70;
  FGapRight            := 40;
  FBorderstyle         := bsSingle;
  FVisible             := true;
  FFont                := TFont.Create;
  FGridLineStyle       := psSolid;
  FXScale              := THorScale.Create(Self);
  FXScale.Parent       := Self;
  FYScale              := TVertScale.Create(Self);
  FYScale.Parent       := Self;
  FBorderstyle         := bsSingle;
  FGridVisible         := grdNone;
  FBKGridColor         := clgray;
  FGridVisible         := grdBoth;
  FViewXNominalMin     := 0;
  FViewXNominalMax     := 100;
  FSeriesLineStyle     := psSolid;
  FSeriesCurrent       := 1;
  FSeriesNumber        := 1;
  FSeriesColor         := clLime;
end;

destructor THixHistoGraph.Destroy;
begin
   FFont.Free;
   inherited Destroy;
end;


////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//                          BERECHNUNG DER KOORDINATEN                       //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////



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.Resize;                                               // überschreibt die gesetzten Werte aus SubKomponenten, um die Skalen positionieren zu können
begin
  inherited;

   //FXScale.BkColor     := clyellow;                                           // zum Testen
   FXScale.Left        := 1;
   FXScale.Width       := Width - 2;
   FXScale.XGapLeft    := FGapLeft;
   FXScale.XGapRight   := FGapRight;
   FXScale.Top         := Height - FGapBottom + 2;

   //FYScale.BkColor     := clSkyBlue;                                          // zum Testen
   FYScale.Top         := 1;
   FYScale.YGapTop     := FGapTop;
   FYScale.YGapBottom  := FXScale.GridHeight;
   FYScale.Left        := 1;
   FYScale.Height      := Height - FGapBottom + FXScale.GridHeight;
   FYScale.Width       := FGapLeft - 1;
   paint;
end;

procedure THixHistoGraph.DrawGrid;                                             // zeichnet Hintergrundraster

var
   Value : Real;

begin
inherited;
   Canvas.Pen.Color     := FBKGridColor;
   Canvas.Brush.Color   := FColor;
   Canvas.Pen.Style     := FGridLineStyle;

  begin
   if FGridVisible = grdVer then                                               // Hintergrundraster in Y-Richtung
   begin
   inherited;
      Value := (FXScale.ValMin);
                  while (Value <= FXScale.ValMax) do
                  begin
                  inherited;
                  Canvas.MoveTo((FGapLeft + 1) +
                  round((Width - 2 - (FGapLeft + FGapRight))
                  * ((Value - FXScale.ValMin) / (FXScale.ValMax - FXScale.ValMin))),
                  (Height - FGapBottom));

                  Canvas.LineTo((FGapLeft + 1) +
                  round((ClientWidth - 2 - (FGapRight + FGapLeft))
                  * ((Value - FXScale.ValMin) / (FXScale.ValMax - FXScale.ValMin))),
                   FGapTop);
                  Value := (Value + FXScale.ValGap);
                  end;
   end;

   if FGridVisible = grdHor then                                               // Hintergrundraster in X-Richtung
   begin
   inherited;
     Value := (FYScale.ValMin);
                  while (Value <= FYScale.ValMax) do
                  begin
                  inherited;
                  Canvas.MoveTo(FGapLeft,
                  FGapTop + 1 +
                  round((ClientHeight - (FGapBottom + FGapTop))
                  * ((Value - FYScale.ValMin) / (FYScale.ValMax - FYScale.ValMin))));


                  Canvas.LineTo(Width - FGapRight,
                  FGapTop + 1 +
                  round((ClientHeight - (FGapBottom + FGapTop))
                  * ((Value - FYScale.ValMin) / (FYScale.ValMax - FYScale.ValMin))));

                  Value := (Value + abs(FYScale.ValGap)) ;
                  end;
   end;

   if FGridVisible = grdBoth then                                              // Hintergrundraster in X und Y-Richtung
   begin
   inherited;
      Value := (FXScale.ValMin);
                  while (Value <= FXScale.ValMax) do
                  begin
                  inherited;
                  Canvas.MoveTo((FGapLeft + 1) +
                  round((Width - 2 - (FGapLeft + FGapRight))
                  * ((Value - FXScale.ValMin) / (FXScale.ValMax - FXScale.ValMin))),
                  (Height - FGapBottom));

                  Canvas.LineTo((FGapLeft + 1) +
                  round((ClientWidth - 2 - (FGapRight + FGapLeft))
                  * ((Value - FXScale.ValMin) / (FXScale.ValMax - FXScale.ValMin))),
                   FGapTop);
                  Value := (Value + FXScale.ValGap);
                  end;

       Value := (FYScale.ValMin);
                  while (Value <= FYScale.ValMax) do
                  begin
                  inherited;
                  Canvas.MoveTo(FGapLeft,
                  FGapTop + 1 +
                  round((ClientHeight - (FGapBottom + FGapTop))
                  * ((Value - FYScale.ValMin) / (FYScale.ValMax - FYScale.ValMin))));


                  Canvas.LineTo(Width - FGapRight,
                  FGapTop + 1 +
                  round((ClientHeight - (FGapBottom + FGapTop))
                  * ((Value - FYScale.ValMin) / (FYScale.ValMax - FYScale.ValMin))));

                  Value := (Value + abs(FYScale.ValGap)) ;
                  end;

      end;
  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;

procedure THixHistoGraph.Paint;
begin
  inherited;
  DrawComponent;
  DrawMeasureValue;
  DrawValue;
end;

procedure THixHistoGraph.SetHistoBkColor(const Value: TColor);                 // Farbe des Anzeigebereichs
begin
   inherited;
   FHistoBkColor := Value;
   invalidate;
end;

procedure THixHistoGraph.SetBorderstyle(const Value: TBorderstyle);
begin
   inherited;
   FBorderstyle := Value;
   invalidate;
end;

procedure THixHistoGraph.SetColor(const Value: TColor);
begin
   inherited;
   FColor := Value;
   invalidate;
end;

procedure THixHistoGraph.SetFont(const Value: TFont);
begin
   FFont.Assign(Value);
   invalidate;
end;


procedure THixHistoGraph.SetGapBottom(const Value: Integer);
begin
   if FGapBottom <> Value
   then
     begin
       FGapBottom := Value;
       invalidate;
     end;
end;

procedure THixHistoGraph.SetGapLeft(const Value: Integer);
begin
   if FGapLeft <> Value
   then
     begin
       FGapLeft := Value;
       invalidate;
     end;
end;

procedure THixHistoGraph.SetGapRight(const Value: Integer);
begin
   if FGapRight <> Value
   then
     begin
       FGapRight := Value;
       invalidate;
     end;
end;

procedure THixHistoGraph.SetGapTop(const Value: Integer);
begin
   if FGapTop <> Value
   then
     begin
       FGapTop := Value;
       invalidate;
     end;
end;


procedure THixHistoGraph.SetTabOrder(const Value: Integer);
begin
   FTabOrder := Value;
end;

procedure THixHistoGraph.SetVersion(const Value: String);
begin
   FVersion := '2014.4';
end;


procedure THixHistoGraph.SetVisible(const Value: Boolean);
begin
   FVisible := Value;
end;


procedure THixHistoGraph.SetViewXNominalMin(const Value: Real);
begin
   begin
   if (FViewXNominalMin) >= (FViewXNominalMax)
   then FViewXNominalMin := 0
   else FViewXNominalMin := Value;

   if (FViewXNominalMin) < (FXScale.ValMin)
   then FViewXNominalMin := 0
   else FViewXNominalMin := Value;
   invalidate;
   end;
end;

procedure THixHistoGraph.SetViewXNominalMax(const Value: Real);
begin
   if (FViewXNominalMax) <= (FViewXNominalMin)
   then FViewXNominalMax := 100
   else FViewXNominalMax := Value;

   if (FViewXNominalMax) > (FXScale.ValMax)
   then FViewXNominalMax := 100
   else FViewXNominalMax := Value;
   invalidate;
end;

procedure THixHistoGraph.SetBounds(Left, Top, Width, Height: Integer);
begin
  inherited;
  refresh;
end;

procedure THixHistoGraph.SetValue(const Value: Real);
begin
   FValue := Value;
   invalidate;
end;

procedure THixHistoGraph.SetXScale(const Value: THorScale);
begin
   inherited;
   FXScale.Assign(Value);
   refresh;

end;

procedure THixHistoGraph.SetYScale(const Value: TVertScale);
begin
   inherited;
   FYScale.Assign(Value);
   refresh;
end;

procedure THixHistoGraph.SetGridVisible(const Value: THixHistoGraphGridVisible);
begin
   FGridVisible := Value;
   invalidate;
end;

procedure THixHistoGraph.SetBKGridColor(const Value: TColor);
begin
    FBKGridColor := Value;
    invalidate;
end;

procedure THixHistoGraph.SetGridLineStyle(const Value: TPenStyle);
begin
   FGridLineStyle := Value;
   invalidate;
end;

procedure THixHistoGraph.SetSeriesColor(const Value: TColor);
begin
inherited;
   FSeriesColor := Value;
   refresh;
end;

procedure THixHistoGraph.SetSeriesNumber(const Value: Integer);
begin
   FSeriesNumber := Value;
end;

procedure THixHistoGraph.SetSeriesCurrent(const Value: Integer);               // legt fest, welcher Kurve bzw Kanal eingestellt werden soll (SeriesNumber)
begin
    FSeriesCurrent := Value;
end;

procedure THixHistoGraph.SetSeriesLineStyle(const Value: TPenStyle);
begin
   FSeriesLineStyle := Value;
   refresh;
end;

Mavarik 9. Apr 2015 12:25

AW: Array Probleme
 
Fein...

Dann Versuch doch erst mal Deinen Sinus so aussehen zu lassen wie man es erwartet...

Alles was Du dafür machen muss, musst Du sowieso programmieren...

[EDIT] Ohne die Darstellungsroutine zu verändern... Sondern die Daten im Array [/EDIT]

Mavarik

Chris211183 9. Apr 2015 12:35

AW: Array Probleme
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Mavarik (Beitrag 1296908)
Fein...

Dann Versuch doch erst mal Deinen Sinus so aussehen zu lassen wie man es erwartet...

Alles was Du dafür machen muss, musst Du sowieso programmieren...

[EDIT] Ohne die Darstellungsroutine zu verändern... Sondern die Daten im Array [/EDIT]

Mavarik

Ja das mache ich ja hier
Delphi-Quellcode:
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;
wenn ich dx := auf 0.05 setzt, dann sieht der Sinus gut aus, oder was meinst Du Mavarik ?

Mavarik 9. Apr 2015 12:59

AW: Array Probleme
 
Zitat:

Zitat von Chris211183 (Beitrag 1296909)
wenn ich dx := auf 0.05 setzt, dann sieht der Sinus gut aus, oder was meinst Du Mavarik ?

Logisch... weil Du dir dann andere Werte berechnest... Indem Du Dir zu einer bestimmten Zeit(t) Dir den entsprechenden Sinuswert holst... Das kannst Du aber nicht wenn die Werte gemessen sind...

Da kannst Du nicht einfach sagen... Zurück ich brauche den Wert für ein anderes dx...

Daher musst Du dann die Werte auf das richtige Zeitintervall umrechnen...

Chris211183 9. Apr 2015 13:13

AW: Array Probleme
 
ohhhh man ey, ich sollte lieber das Programmieren lassen...

bezugnehmend auf meinen Source, was muss ich denn jetzt eigentlich noch machen, damit das Ding mal fertig wird, steige bei der Vielzahl nicht mehr durch...

im Prinzip ist es ja eh so, dass er mir nichts anzeigen dürfte, wenn ich ihn mit F9 übersetzen lasse, da er ja gar keine Messwerte hat..., oder bin ich da jetzt ganz ab von jeglicher Intelligenz...

Mavarik 9. Apr 2015 13:48

AW: Array Probleme
 
Zitat:

Zitat von Chris211183 (Beitrag 1296917)
ohhhh man ey, ich sollte lieber das Programmieren lassen...

Jeder fängt mal kein an... Andere wie Du, wollen direkt ganz groß anfangen... :stupid:

Zitat:

Zitat von Chris211183 (Beitrag 1296917)
im Prinzip ist es ja eh so, dass er mir nichts anzeigen dürfte, wenn ich ihn mit F9 übersetzen lasse, da er ja gar keine Messwerte hat..., oder bin ich da jetzt ganz ab von jeglicher Intelligenz...

Das Problem ist, dass Du Dir die Daten Fakest...

Erzeugst Dir in der Routine das Array, welches eigentlich von außen kommen müsste...

Nimm doch einfach mal ein globales Array...

Delphi-Quellcode:
var
  MeineWerte : Array of real; // order was auch immer...

Procedure Erzeuge_Werte;
var
  i : Integer;
begin
  Setlength(MeineWerte,5000);

  for i:=0 to 1000 do
    MeineWerte[i] := 15.0;
  for i:=1001 to 2000 do
    MeineWerte[i] := 0.0;
  for i:=2001 to 3000 do
    MeineWerte[i] := -22.0;
  for i:=3001 to 4000 do
    MeineWerte[i] := 0.0;
  for i:=4001 to 4999 do
    MeineWerte[i] := 4.0;
end;
So und dann Stelle diese Werte 0..4999 mal in Deinem Fenster dar..
und zwar so, dass du den Startpunkt verschieben kannst und auch den Ausschnitt den Du darstellen willst...

Mavarik

Chris211183 10. Apr 2015 10:13

AW: Array Probleme
 
Zitat:

Zitat von Mavarik (Beitrag 1296922)
Zitat:

Zitat von Chris211183 (Beitrag 1296917)
ohhhh man ey, ich sollte lieber das Programmieren lassen...

Jeder fängt mal kein an... Andere wie Du, wollen direkt ganz groß anfangen... :stupid:

Zitat:

Zitat von Chris211183 (Beitrag 1296917)
im Prinzip ist es ja eh so, dass er mir nichts anzeigen dürfte, wenn ich ihn mit F9 übersetzen lasse, da er ja gar keine Messwerte hat..., oder bin ich da jetzt ganz ab von jeglicher Intelligenz...

Das Problem ist, dass Du Dir die Daten Fakest...

Erzeugst Dir in der Routine das Array, welches eigentlich von außen kommen müsste...

Nimm doch einfach mal ein globales Array...

Delphi-Quellcode:
var
  MeineWerte : Array of real; // order was auch immer...

Procedure Erzeuge_Werte;
var
  i : Integer;
begin
  Setlength(MeineWerte,5000);

  for i:=0 to 1000 do
    MeineWerte[i] := 15.0;
  for i:=1001 to 2000 do
    MeineWerte[i] := 0.0;
  for i:=2001 to 3000 do
    MeineWerte[i] := -22.0;
  for i:=3001 to 4000 do
    MeineWerte[i] := 0.0;
  for i:=4001 to 4999 do
    MeineWerte[i] := 4.0;
end;
So und dann Stelle diese Werte 0..4999 mal in Deinem Fenster dar..
und zwar so, dass du den Startpunkt verschieben kannst und auch den Ausschnitt den Du darstellen willst...

Mavarik

Ok, die erzeugten Werte, muss ich ja wieder in eine Zeichenroutine packen...,

das habe ich gerade mal versucht, jedoch weiß ich jetzt nicht, ob ich die in meine bereits bestehende Zeichenroutine implementieren soll, oder neu mache.

CalculatePointView und DrawMeasureValue hängen ja zusammen....

oder können die ganz weg

Bjoerk 10. Apr 2015 11:08

AW: Array Probleme
 
Keine Ahnung, deine Komponente sieht doch seeehr kompliziert aus? Schau ggf. mal z.B. hier, da hab ich mal solch eine Skalierung gepostet.

Chris211183 10. Apr 2015 11:16

AW: Array Probleme
 
Zitat:

Zitat von Bjoerk (Beitrag 1297024)
Keine Ahnung, deine Komponente sieht doch seeehr kompliziert aus? Schau ggf. mal z.B. hier, da hab ich mal solch eine Skalierung gepostet.

:?: Skalierung ist doch garnicht das Thema Bjoerk...

Bjoerk 10. Apr 2015 11:23

AW: Array Probleme
 
Na dann.. Du fragst doch wie man eine Punktemenge, Figur, f(x) ect. darstellt?

Chris211183 10. Apr 2015 11:32

AW: Array Probleme
 
:glaskugel: ich glaub ich mach jetzt Wochenende und trink ein kaltes Bier...., werd mich später nochmal ransetzen :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz