Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Graph zeichnen (https://www.delphipraxis.net/128885-graph-zeichnen.html)

-Julchen- 8. Feb 2009 15:20


Graph zeichnen
 
Hallo,

wir haben die Aufgabe, ein Programm zu erstellen (delphi 5), in dem man ein Koordinatenstystem hat, daneben 4 verschiedene Funktionen anklicken kann und im unten stehenden Feld Zahlen für die Variablen eingeben kann.

Die ersten zwei Funktionen funktionieren, aber irgendwie wird die dritte Funktion nicht gezeichnet.
Weiß jemand Rat? :roll:
Wir sind leider nicht so gut in Informatik.^^ :(

Vielen Dank im Voraus!

Hier der Quelltext:

Delphi-Quellcode:
implementation

{$R *.dfm}

var a,b,c: real;

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin

  with image1.Canvas do
  begin
  moveto(20,220); lineto(420,220);               //x-Achse
  moveto(220,20); lineto(220,420);               //y-Achse
  moveto(410,215); lineto (422,220);
  lineto (410,225);                              //x-Pfeil
  moveto(215,30); lineto (220,18);
  lineto (225,30);                               //y-Pfeil
  textout(425,225,'x');                          //Beschriftung
    for i:=-3 to 3 do
    begin
    moveto(220+50*i,215);
    lineto (220+50*i,225);                       //x-Einteilung
    moveto(215,220+50*i);
    lineto (225,220+50*i);                       //y-Einteilung
    textout(222+50*i,225,inttostr(i));           //Zahlen x-Achse
    if i <> 0 then
    textout (205,213+50*i,inttostr(-i));         //Zahlen y-Achse
    end;
  end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var i,j: integer;
x,y: real;
  begin

  a:=strtofloat(Edit1.Text);                      //Eingabe
  b:=strtofloat(Edit2.Text);

  i:=20;
  while i < 420 do
  begin
  i:=i+1;
  x:=(i-220)/50;
  y:=a*x+b;
  j:=round((220-y*50));
  image1.Canvas.Pixels[i,j]:=clred;
  image1.Canvas.Pen.Color:=clred;
  image1.Canvas.TextOut(400,42,'y=ax+b');          //Beschriftung
  end;
 
end;



procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer;
x,y:real;
  begin

  a:=strtofloat(Edit1.Text);                        //Eingabe
  b:=strtofloat(Edit2.Text);
  c:=strtofloat(Edit3.Text);

  i:=70;
  while i<420 do
    begin
    i:=i+1;
    x:=(i-220)/50;                                  //x skalieren
    y:=a*sqr(x)+b*x+c;                              //Funktion y=ax²+bx+c
    j:=round((220-y*50));                           //j berechnen
    image1.Canvas.Pixels[i,j]:=clgreen;             //zeichnen

    image1.Canvas.TextOut(400,100,'y=ax²+bx+c');    //Beschriftung
    end;
  end;


procedure TForm1.Button3Click(Sender: TObject);
var i,j:integer;
x,y:real;
begin

  a:=strtofloat(Edit1.Text);                         //Eingabe
  b:=strtofloat(Edit2.Text);
  c:=strtofloat(Edit3.Text);

 
  i:=70;
  while i<420 do
    begin
    i:=i+1;
    x:=(i-220)/50;                                      //x skalieren
    y:=a*sqr(x+b)+c;                                    //Funktion y=a*(x+b)²+c
    j:=round((220-y*50));                               //j berechnen
    image1.Canvas.Pixels[i,j]:=clblue;                  //zeichnen

    image1.Canvas.TextOut(400,100,'y=a*sqr(x+b)+c');    //Beschriftung
    end;
  end;

end;

end.
:hi: :oops:

mr_emre_d 8. Feb 2009 15:24

Re: Graph zeichnen
 
Was für Werte haben a,b,c bei der dritten Funktion ?

-Julchen- 8. Feb 2009 15:39

Re: Graph zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Die Werte kann der Benutzer selbst eingeben.

So siehts aus:

Schnipp


[edit=Matze]Bild angehängt. MfG, Matze[/edit]

Noedel 8. Feb 2009 17:28

Re: Graph zeichnen
 
ich hab das ganze mal selber kompiliert (mit deinem QC) und das ganze geht wunderbar, soweit ich das sehe.
Wüsste also nicht, was da nicht stimmen sollte...
Was passiert überhaupt? Gar nichts?

-Julchen- 8. Feb 2009 18:05

Re: Graph zeichnen
 
Nein, es passiert gar nix.

Mir ist aber schon von Anfang an was komisches aufgefallen:
Wir haben das ja in der Schule programmiert und sollten das zu Hause weiter machen.
Also hab ich den ganzen Ordner auf meinen PC gezogen und als ich das bearbeiten wollte, ist mir aufgefallen, dass ich nicht mehr auf den grünen Pfeil klicken kann (um es abzuspielen), da dann gleich eine Fehlermeldung kommt, obwohl ich da noch NICHTS geändert hatte.

Die Fehlermeldung lautet:
[Fatal Error] Unit1.pas(6): File not found: 'Variants.dcu'

Also hab ich dann einfach immer was dazugeschrieben, es abgespeichert und "project1.exe" aufgerufen, um es mir anzugucken. Jedoch ist wie gesagt bei der dritten Funktion, bei der ich neuen Code hinzugefügt hatte, nix passiert.

Oder kann man das so nicht machen? :gruebel:

Noedel 8. Feb 2009 18:43

Re: Graph zeichnen
 
Am besten wäre es wohl in dem Fall, ein neues Projekt anzufangen, und den Code zu übernehmen.
So viel ist auf deinem Projekt ja nicht drauf. Aber ne Erklärung habe ich dafür auch nicht... ;)

taaktaak 8. Feb 2009 19:13

Re: Graph zeichnen
 
Moin, Moin.
Ich denke, das ist kein großes Problem. Immer wenn du ein neues Formular erzeugst, werden in uses automatisch eine Reihe von Units aufgenommen, auch "Variants" - obwohl man die meist gar nicht benötigt. Und diese Units findet der Compiler auf deinem System nicht. Komisch, aber nicht weiter tragisch.
Für deinen Source benötigst du sie ebenfalls nicht. Also ist die Lösung ganz einfach: Einfach "Variants" aus der uses-Liste löschen.

Noedel 8. Feb 2009 19:21

Re: Graph zeichnen
 
erklärt das das eigentliche Problem / Fehler / Bug ... vom TE?
Wie gesagt, ich habe mir alles aus dem QC von Julchen übernommen und einfach einen Button3, 3 Editfelder und ein Image1 auf eine sonst leere Form geklatscht und den Code eingesetzt. Alles lief problemlos. (Das KOS habe ich nicht gezeichnet :P )
Da kann doch nur ein Bug oÄ vorliegen?!
Oder gibts dafür eine Erklärung?

taaktaak 8. Feb 2009 19:24

Re: Graph zeichnen
 
Meine Antwort bezieht sich (natürlich) nur auf die in #5 beklagte Fehlermeldung

Forlan 8. Feb 2009 19:26

Re: Graph zeichnen
 
Zitat:

Zitat von taaktaak
Meine Antwort bezieht sich (natürlich) nur auf die in #5 beklagte Fehlermeldung

Ist doch klar... Die Unit "Variants" gab es in Delphi 5 doch noch garnicht^^
Von daher einfach aus der Uses Klausel entfernen, und schon sollte es kein Problem beim Kompilieren geben :stupid:

Jakob Ullmann 8. Feb 2009 21:06

Re: Graph zeichnen
 
Und eventuell auch noch ein paar andere Units. Ist ganz normal. :)

-Julchen- 9. Feb 2009 09:05

Re: Graph zeichnen
 
Ahhhhhhhhhhhhhhhhh, okay.
Vielen Dank für eure Antworten - es klappt jetzt alles (keine Fehlermeldungen mehr und Graphen werden gezeichnet). :lol:

DANKE!!! :mrgreen:

:cheers:

-Julchen- 9. Feb 2009 09:19

Re: Graph zeichnen
 
Wir haben noch eine kleine Frage... :oops:
Wie kann man die Beschriftung des Graphen farbig gestalten?


Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var i,j:integer;
x,y:real;
begin

  a:=strtofloat(Edit1.Text);                         //Eingabe
  b:=strtofloat(Edit2.Text);
  c:=strtofloat(Edit3.Text);

 
  i:=70;
  while i<420 do
    begin
    i:=i+1;
    x:=(i-220)/50;                                      //x skalieren
    y:=a*sqr(x+b)+c;                                    //Funktion y=a*(x+b)²+c
    j:=round((220-y*50));                               //j berechnen
    image1.Canvas.Pixels[i,j]:=clblue;                  //zeichnen

    image1.Canvas.TextOut(400,100,'y=a*sqr(x+b)+c');    //Beschriftung
    end;
  end;
Wir haben es versucht mit:

Delphi-Quellcode:
  image1.Canvas.TextOut(400,42,'y=ax+b');        //Beschriftung
  image1.Canvas.Pen.Color:=clred;               // Schrift-Farbe rot
Jedoch ging das nicht.
Kann uns bitte jemand erneut helfen? :angel2:

jfheins 9. Feb 2009 09:26

Re: Graph zeichnen
 
Du schreibst etwas und legst danach den Stift weg und nimmst stattdessen den roten Stift. Warum ist das, was du geschrieben hast nicht rot?

==> Farbe setzen bevor du den Text ausgibst ;)

-Julchen- 9. Feb 2009 09:34

Re: Graph zeichnen
 
:wiejetzt: ^^


Wir haben das jetzt so und es geht noch immer nicht:

Delphi-Quellcode:
  image1.Canvas.Pixels[i,j]:=clred;
  image1.Canvas.Pen.Color:=clred;
  image1.Canvas.TextOut(400,42,'y=ax+b');        //Beschriftung
  end;

end;

himitsu 9. Feb 2009 09:40

Re: Graph zeichnen
 
Delphi-Quellcode:
Canvas.Font.Color := clRed;
TextOut nimmt die Eigenschaften aus Font :zwinker:

jfheins 9. Feb 2009 09:42

Re: Graph zeichnen
 
Ups ... *unaufällig pfeift*

Aber trotzdem muss man es vorher setzen :mrgreen:

-Julchen- 9. Feb 2009 09:54

Re: Graph zeichnen
 
Es klappt, danke ihr beiden! :thumb:

Da ihr ja grad so aktiv seid, hätten wir noch eine Frage.. looool :lol: :wall:

Wie sorgt man dafür, dass die Beschriftung immer am jeweiligen Graphen bleibt, auch, wenn man die Variablen so verändert, dass sich der Graph verschiebt?
Oder ist dies nicht möglich? :gruebel:

:angel:








:stupid:

mquadrat 9. Feb 2009 10:25

Re: Graph zeichnen
 
Naja einfach die Koordinaten, an denen der Text ausgegeben wird auch berechnen. Da müsste dann halt auch drauf geachtet werden, dass der Text nicht die Kurve überschreibt. Die Größe des Textes kann man ausrechnen lassen. Wenn mir jetzt noch einfallen würde, wie die entsprechenden Methoden heißen :oops: Ich würd's mal mit TextWidth und TextHeight probieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 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