Delphi-PRAXiS
Seite 2 von 2     12   

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/)
-   -   Probleme mit Sinus Darstellung (https://www.delphipraxis.net/184076-probleme-mit-sinus-darstellung.html)

DeddyH 3. Mär 2015 09:15

AW: Probleme mit Sinus Darstellung
 
Nützt mir leider nix, da noch Units fehlen. Brauchst Du diese "Q"-Units wirklich, IIRC waren die damals für Kylix gedacht, welches längst in Frieden ruht.
Zitat:

Delphi-Quellcode:
uses
  Windows,SysUtils, Classes,QControls, Controls, Graphics, StdCtrls, Variants, Forms,
  Dialogs, Math, QExtCtrls, ExtCtrls, Types,
  HixBarGraphUnit, HixLedUnit, Scales;


Headbucket 3. Mär 2015 09:32

AW: Probleme mit Sinus Darstellung
 
Zitat:

Zitat von Chris211183 (Beitrag 1292126)
Delphi-Quellcode:
P := CalculatePointView(sin, R, x0, y0, dx, dy);
Hier kommt die Meldung `(` erwartet, aber `,`gefunden)

Schau dir mal die Parameter der Funktion CalculatePointView an:
Delphi-Quellcode:
function CalculatePointView
(AFunc: TFxFunction; const ARect: TRect; x0, y0, dx, dy: Extended): TPointDynArray;
Der Erste Parameter ist vom Typ "TFxFunction"
Delphi-Quellcode:
TFxFunction = function(const x: Extended): Extended;
Dieser ist als Funktion mit einem parameter x (extended) definiert.
Folglich wird hier auch ein extended Wert erwartet:
Delphi-Quellcode:
P := CalculatePointView(sin(x), R, x0, y0, dx, dy);
Grüße
Headbucket

DeddyH 3. Mär 2015 09:40

AW: Probleme mit Sinus Darstellung
 
sin(x) wäre ja das Funktionsergebnis, es soll aber die Funktion selbst sein.

bcvs 3. Mär 2015 10:03

AW: Probleme mit Sinus Darstellung
 
Kann es sein, dass in den Units HixBarGraphUnit, HixLedUnit oder Scales irgendetwas namens sin deklariert ist? Wenn ich diese Units herausnehme (weil ich sie ja eh nicht habe) kompiliert es bei mir einwandfrei.

oder probier mal
Delphi-Quellcode:
P := CalculatePointView(@System.sin, R, x0, y0, dx, dy);

Headbucket 3. Mär 2015 10:04

AW: Probleme mit Sinus Darstellung
 
:wall:
Stimmt natürlich... .
Dann wird es wohl daran liegen, dass die Unit "System" in der Uses-Klausel fehlt. Dort ist nämlich die Funktion "sin" definiert.

Grüße
Headbucket

DeddyH 3. Mär 2015 10:05

AW: Probleme mit Sinus Darstellung
 
System wird automatisch eingebunden.

Sir Rufo 3. Mär 2015 10:10

AW: Probleme mit Sinus Darstellung
 
Zitat:

Zitat von Headbucket (Beitrag 1292157)
:wall:
Stimmt natürlich... .
Dann wird es wohl daran liegen, dass die Unit "System" in der Uses-Klausel fehlt. Dort ist nämlich die Funktion "sin" definiert.

Grüße
Headbucket

Die
Delphi-Quellcode:
System
Unit ist immer eingebunden, das braucht man nicht zusätzlich noch mit rein nehmen. Allerdings muss man dem Compiler schon sagen, welche man haben möchte, wenn es mehrere gibt (wie in diesem Fall).

Headbucket 3. Mär 2015 10:15

AW: Probleme mit Sinus Darstellung
 
Vielen Dank für die Infos. Auch, wenn man es sich hätte denken können, so wusste ich das nicht.

Bleibt eventuell noch die Frage nach welchen Kriterien sich der Compiler dann seine "sin"-Funktion sucht, wenn man es nicht speziell angibt - aber das ist dann wohl ein anderes Thema.

Ich halt für heute wohl lieber erstmal meine Klappe :-).

DeddyH 3. Mär 2015 10:17

AW: Probleme mit Sinus Darstellung
 
Nach meiner Kenntnis nimmt der Compiler immer die, die in der Reihenfolge der uses-Klausel zuletzt gefunden wird.

Chris211183 3. Mär 2015 10:20

AW: Probleme mit Sinus Darstellung
 
Delphi-Quellcode:
uses
   Windows, SysUtils, Classes, Controls, Graphics, StdCtrls, Variants, Forms, Dialogs, Math, ExtCtrls, Types, Scales
Die habe ich drin, ist sin nicht in Math deklariert ?

DeddyH 3. Mär 2015 10:22

AW: Probleme mit Sinus Darstellung
 
Schau doch in die Hilfe, da steht die Unit. Zumindest in neueren Delphi-Versionen ist es System.

Chris211183 3. Mär 2015 10:28

AW: Probleme mit Sinus Darstellung
 
habe ich, wenn ich System mit einbinde in die uses-Klausel, kommt Bezeichner redefiniert....
in der Hilfe steht Sin(Funktion) Unit System....

Ich brenn hier glei die Bude an :wall:

DeddyH 3. Mär 2015 10:34

AW: Probleme mit Sinus Darstellung
 
Nochmal: System wird automatisch eingebunden und hat daher nichts in der uses-Klausel zu suchen. Qualifizieren kann man sie aber trotzdem.

Chris211183 3. Mär 2015 10:38

AW: Probleme mit Sinus Darstellung
 
Sorry, mir steht einer auf der Leitung, was meinst du mit Qualifizieren :pale:

DeddyH 3. Mär 2015 10:42

AW: Probleme mit Sinus Darstellung
 
Statt sin System.sin.

Chris211183 3. Mär 2015 10:43

AW: Probleme mit Sinus Darstellung
 
achso, ja habe ich doch schon !!!

Chris211183 3. Mär 2015 10:45

AW: Probleme mit Sinus Darstellung
 
Delphi-Quellcode:
function THixHistoGraph.CalculatePointView
(AFunc: TFxFunction; const ARect: TRect; x0, y0, dx, dy: Extended): TPointDynArray;
var
  x, y: Extended;
  i : integer;
begin                                                                          // für jede Spalte einen Punkt
   SetLength(Result, ARect.Right - ARect.Left +1);                             // Punkte berechnen
   x := x0;
   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 := ARect.Left +1;
   Result[i].Y := ARect.Top + Round(y);                                        // runden
   x := x + dx;
   end;                                                                        // nächster Punkt
end;

procedure THixHistoGraph.DrawPointView
(ACanvas: TCanvas; const ARect: TRect; const APoints : TPointDynArray);
var
   h : Thandle;
   begin
   h:= SaveDC(ACanvas.Handle);
   try
   IntersectClipRect(ACanvas.Handle, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
   Polyline(ACanvas.Handle, APoints[0], Length(APoints));
   finally
      RestoreDC(ACanvas.Handle, h);
   end;
end;

procedure THixHistoGraph.DrawFunction;
var
  R :TRect;
  x0, y0, dx, dy :Extended;
  P: TPointDynArray;
  begin
   R := Rect (FGapLeft,
              FGapTop,
              Width - FGapRight + 2,
              Height - FGapBottom);

   Canvas.Brush.Color := FHistoBkColor;
   Canvas.Pen.Color  := FHistoBkColor;
   Canvas.Pen.Style  := psSolid;
   Canvas.FillRect(R);
   InflateRect(R, -1, -1);
   x0 := FXScale.ValMin;
   y0 := FYScale.ValMax;
   dx := 0.05;
   dy := 0.05;
   P := CalculatePointView(@System.sin, R, x0, y0, dx, dy);
   Canvas.Pen.Color := cllime;
   DrawPointView(Canvas, R, P);
end;

Trotzdem immer der selbe Scheiß, macht er nicht

DeddyH 3. Mär 2015 10:51

AW: Probleme mit Sinus Darstellung
 
Ich hab zwar kein Delphi 6, kann das aber nach Feierabend mal mit Delphi 5 oder Delphi 7 ausprobieren. Ich glaube allerdings nicht unbedingt, dass es an der Version liegt, unter XE funktioniert es aber.

Chris211183 3. Mär 2015 10:55

AW: Probleme mit Sinus Darstellung
 
ja das wäre nett, ich geh hier gleich krachen...

Ich geh jetzt erstmal zum Sport, bevor ich meine Tastatur durch den Bildschirm schiebe

bcvs 3. Mär 2015 11:16

AW: Probleme mit Sinus Darstellung
 
Kannst du vielleicht mal ein Minimal-Beispiel machen, d.H. aus der Unit alles rauswerfen, was nicht zur Reproduktion des Problems benötigt wird, und das hier posten. Oft findet man bei solchen Aktionen auch den Fehler.

gammatester 3. Mär 2015 11:35

AW: Probleme mit Sinus Darstellung
 
In Delphi 6 braucht sin Compiler-Magic und wäre auch sonst inkomptatibel, die Hilfe nennt die Deklaration
Delphi-Quellcode:
function Sin(X: Extended): Extended;
Die einfachste Möglichkeit, die Sache versionsunabhängig zum Laufen zu bringen, ist eine Wrapper-Funktion
Delphi-Quellcode:
function mysin(const x: Extended): Extended;
begin
  mysin := sin(x);
end;
mit dem Aufruf
Delphi-Quellcode:
CalculatePointView(mysin, R, x0, y0, dx, dy);

Chris211183 3. Mär 2015 12:23

AW: Probleme mit Sinus Darstellung
 
Ja gerne...



Delphi-Quellcode:
unit HixHistograph;

interface

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

type
   TFxFunction = function(const x: Extended): Extended;
   TPointDynArray = array of TPoint;

   THixHistoGraph = class(TCustomPanel)


procedure DrawFunction;
procedure SetColorZeroLine(const Value: TColor);
procedure DrawPointView(ACanvas: TCanvas; const ARect: TRect; const APoints : TPointDynArray);
function CalculatePointView(AFunc: TFxFunction; const ARect: TRect; x0, y0, dx, dy: Extended): TPointDynArray;



procedure THixHistoGraph.Paint;
begin
  inherited;
  FBmp.Width := Width;
  FBmp.Height := Height;

  with FBmp.Canvas do
  begin
  DrawComponent;                                                               // zeichnet Komponente mit Hintergrund
  DrawGrid;                                                                    // zeichnet Hintergrundraster
  //DrawZeroLine;                                                              // Nullliniendurchgang
  DrawFunction;
  end;
end;


function THixHistoGraph.CalculatePointView
(AFunc: TFxFunction; const ARect: TRect; x0, y0, dx, dy: Extended): TPointDynArray;
var
  x, y: Extended;
  i : integer;
begin                                                                          // für jede Spalte einen Punkt
   SetLength(Result, ARect.Right - ARect.Left +1);                             // Punkte berechnen
   x := x0;
   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 := ARect.Left +1;
   Result[i].Y := ARect.Top + Round(y);                                        // runden
   x := x + dx;
   end;                                                                        // nächster Punkt
end;

procedure THixHistoGraph.DrawPointView
(ACanvas: TCanvas; const ARect: TRect; const APoints : TPointDynArray);
var
   h : Thandle;
   begin
   h:= SaveDC(ACanvas.Handle);
   try
   IntersectClipRect(ACanvas.Handle, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
   Polyline(ACanvas.Handle, APoints[0], Length(APoints));
   finally
      RestoreDC(ACanvas.Handle, h);
   end;
end;

procedure THixHistoGraph.DrawFunction;
var
  R :TRect;
  x0, y0, dx, dy :Extended;
  P: TPointDynArray;
  begin
   R := Rect (FGapLeft,
              FGapTop,
              Width - FGapRight + 2,
              Height - FGapBottom);

   Canvas.Brush.Color := FHistoBkColor;
   Canvas.Pen.Color  := FHistoBkColor;
   Canvas.Pen.Style  := psSolid;
   Canvas.FillRect(R);
   InflateRect(R, -1, -1);
   x0 := FXScale.ValMin;
   y0 := FYScale.ValMax;
   dx := 0.05;
   dy := 0.05;
   P := CalculatePointView(@System.sin, R, x0, y0, dx, dy);
   Canvas.Pen.Color := cllime;
   DrawPointView(Canvas, R, P);
end;

end.

Chris211183 3. Mär 2015 12:34

AW: Probleme mit Sinus Darstellung
 
jetzttttttttt...................... es klappt mit der Wrapper Funktion !!!

Das war ne Geburt Jungs !!!

Besten dank an alle !!!
Woher soll man denn sowas auch wisssen ????

DeddyH 3. Mär 2015 12:35

AW: Probleme mit Sinus Darstellung
 
Aus der Online-Hilfe ;)

Chris211183 3. Mär 2015 12:55

AW: Probleme mit Sinus Darstellung
 
Die ich nicht habe :roll:, mein Programmierrechner ist nicht im Netz !

DeddyH 3. Mär 2015 12:57

AW: Probleme mit Sinus Darstellung
 
Ich meinte die, die bei F1 aufgeht.

Chris211183 3. Mär 2015 12:59

AW: Probleme mit Sinus Darstellung
 
benutz ich oft, das muss mir durch die Lappen gegangen sein :oops:

gehe mir jetzt die Hände bügeln !

Bjoerk 3. Mär 2015 13:31

AW: Probleme mit Sinus Darstellung
 
Wegen der Wellen könnte man sich noch überlegen der Komponente einen Timer zu spendieren? Und du möchtest doch sicherlich irgendwann mal was anderes grafisch darstellen als Sin(X). Dazu braucht die Komponente einen Parser. Falls du über keinen Matheparser verfügst, für's erste reicht auch der Parser10 von der Emba Homepage oder auch (in einer älteren Version) frei im Netz. Dann kann der User die f(x) z.B. in einem Edit angeben.

Chris211183 4. Mär 2015 10:21

AW: Probleme mit Sinus Darstellung
 
Zitat:

Zitat von Bjoerk (Beitrag 1292219)
Wegen der Wellen könnte man sich noch überlegen der Komponente einen Timer zu spendieren? Und du möchtest doch sicherlich irgendwann mal was anderes grafisch darstellen als Sin(X). Dazu braucht die Komponente einen Parser. Falls du über keinen Matheparser verfügst, für's erste reicht auch der Parser10 von der Emba Homepage oder auch (in einer älteren Version) frei im Netz. Dann kann der User die f(x) z.B. in einem Edit angeben.

Super Idee Bjoerk, das klingt logisch und das werde ich gleich mal ausprobieren !

Für so einen Parser habe ich http://kilchb.de/parser.html den hier gefunden !

Caps 4. Mär 2015 12:35

AW: Probleme mit Sinus Darstellung
 
Ich weiß nicht, vielleicht ist es auch bei Deinem Projekt von Vorteil, wenn Du erst überlegst was am Ende herauskommen soll, und dann mit der Umsetzung anfängst (?). Ich kann mir das Arbeiten nicht mehr anders vorstellen. Früher hab ich natürlich auch direkt mit Einhacken angefangen ;-).

lg Caps

Bjoerk 4. Mär 2015 13:47

AW: Probleme mit Sinus Darstellung
 
Zitat:

Zitat von Chris211183 (Beitrag 1292278)
[..] Super Idee Bjoerk, das klingt logisch und das werde ich gleich mal ausprobieren ! Für so einen Parser habe ich http://kilchb.de/parser.html den hier gefunden !

Langsam Bud, langsam. :wink: Der Parser von Dr. Joachim Mohr hat es in sich (umgekehrte Rekursion (nahe am Stackoverflow)). Außerdem kann er kein unäres Minus. Das kann man zwar einbauen ist aber eher was für Männer ohne Nerven. Ich hab das vor Jahren mal gemacht und ihm auch geschickt. Er war begeistert und wollte testen. Hab dann aber leider nichts mehr von ihm gehört. Nimm besser einen anderen Parser oder du schreibst satt z.B sin(-X) -> sin(0-X).


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 Uhr.
Seite 2 von 2     12   

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