Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Graphen aus der canvas wieder löschen (https://www.delphipraxis.net/163678-graphen-aus-der-canvas-wieder-loeschen.html)

Blubbel 11. Okt 2011 11:23

Delphi-Version: 5

Graphen aus der canvas wieder löschen
 
Mahlzeit!
Ich bins mal wieder ;).
Ich arbeite immer noch an dem Canvas wie letzte Woche.
Es funktioniert 100%ig nur habe ich jetzt eine Frage:

Ich habe um den Graphen zu löschen, bzw. neue Grpahen zeichnen zu lassen NIL benutzt.
Geht das vielleicht auch anders?? Ich hab nämlich noch nie mit NIL gearbeitet und mein Lehrer würde sich wundern, weshalb ich das benutzt habe, oder wie ich drauf gekommen bin.
Hier mal der QT:
Delphi-Quellcode:
procedure TForm1.btn_neuClick(Sender: TObject);
begin
  Image1.Picture:=nil;
  FormCreate(Sender);
  begin
    edtEingabe.Text:='';
    edt_Bx.Text:='';
    edt_C.Text:='';
    edtFx.Text:='';
    edt_X.Text:='';
    edt_B.Text:='';
    edt_Cx.Text:='';
  end;
end;

DeddyH 11. Okt 2011 11:26

AW: Graphen aus der canvas wieder löschen
 
Du kannst auch mit FillRect die Zeichenfläche komplett übermalen.

EWeiss 11. Okt 2011 11:28

AW: Graphen aus der canvas wieder löschen
 
Zitat:

Zitat von DeddyH (Beitrag 1129731)
Du kannst auch mit FillRect die Zeichenfläche komplett übermalen.

Dann würde sich sein Lehrer aber auch wundern warum er FillRect verwendet und wie er darauf gekommen ist.
Wenn er es vorher noch nie verwendet hat. :-D

PS:
Besser dem Lehrer sagen warum du es verwendest!
Ist doch nicht schlimm wenn man sich in Foren schlau macht. Oder?

gruss

Blubbel 11. Okt 2011 11:30

AW: Graphen aus der canvas wieder löschen
 
Der will Parameter?!

Naja, ist ja aber ein Bestandteil von Canvas oder nicht :)?

Blubbel 11. Okt 2011 11:34

AW: Graphen aus der canvas wieder löschen
 
Zitat:

Zitat von EWeiss (Beitrag 1129732)

PS:
Besser dem Lehrer sagen warum du es verwendest!
Ist doch nicht schlimm wenn man sich in Foren schlau macht. Oder?

gruss

Haste schon recht... ach, wenns ihm nicht gefällt, soll er doch mal mehr erlären ;)

DeddyH 11. Okt 2011 11:34

AW: Graphen aus der canvas wieder löschen
 
@Emil: Wenn doch sowieso ein Graph auf einen Canvas gezeichnet wird, dann ist es doch naheliegend, dass man dann wiederum mit den TCanvas-Methoden übermalt. Ich denke nicht, dass ein Lehrer damit Probleme haben sollte.

@Blubbel: Wer will wo Parameter?

Blubbel 11. Okt 2011 11:36

AW: Graphen aus der canvas wieder löschen
 
Delphi-Quellcode:
procedure TForm1.btn_neuClick(Sender: TObject);
begin
  Image1.Canvas.FillRect;//Dort will der Compiler Parameter...
  FormCreate(Sender);
  begin
    edtEingabe.Text:='';
    edt_Bx.Text:='';
    edt_C.Text:='';
    edtFx.Text:='';
    edt_X.Text:='';
    edt_B.Text:='';
    edt_Cx.Text:='';
  end;
end;
Diese Meldung gibt er mir:

Zitat:

[Pascal Fehler] main.pas(79): E2035 Nicht genügend wirkliche Parameter

DeddyH 11. Okt 2011 11:38

AW: Graphen aus der canvas wieder löschen
 
Ja, Du musst zunächst das zu füllende Rechteck definieren: Delphi-Referenz durchsuchenTCanvas.FillRect. Das dürfte ja dem umgebenden Rechteck der gezeichneten Grafik entsprechen.

Blubbel 11. Okt 2011 11:44

AW: Graphen aus der canvas wieder löschen
 
Aber die sind ja immer unterschiedlich...
Ach, Ich glaub ich bleib beim NIL und werde meinen Lehrer am Donnerstag drauf ansprechen.

Trotzdem danke :thumb:

Aaaaha! Habs das Gefunfen und es Funktioniert auch^^
Delphi-Quellcode:
Image1.Canvas.Rectangle(0,0,width,height);

DeddyH 11. Okt 2011 11:52

AW: Graphen aus der canvas wieder löschen
 
Sicher, das geht auch, wenn Dich ein evtl. Rand nicht stört :)

Blubbel 11. Okt 2011 11:53

AW: Graphen aus der canvas wieder löschen
 
Nee, ist ja keiner.... ich zeig dir ma den ganzen QT... Am Koordinatensystem ist ja eh schon ein Rand...
Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    edtEingabe: TEdit;
    lblFX: TLabel;
    lbl_X: TLabel;
    btn_Zeichne: TButton;
    Image1: TImage;                    
    edt_Bx: TEdit;
    lbl_bx: TLabel;
    edt_C: TEdit;
    lbl_C: TLabel;
    Label2: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    edtFx: TEdit;
    edt_X: TEdit;
    edt_B: TEdit;
    edt_Cx: TEdit;
    btn_Zeichne1: TButton;
    btn_neu: TButton;
    btn_close: TButton;
    Label1: TLabel;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure btn_ZeichneClick(Sender: TObject);
    procedure btn_Zeichne1Click(Sender: TObject);
    procedure btn_closeClick(Sender: TObject);
    procedure btn_neuClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  a,b,c: Real;

implementation

{$R *.dfm}

procedure TForm1.btn_closeClick(Sender: TObject);
begin
 Form1.Close;
end;

procedure TForm1.btn_ZeichneClick(Sender: TObject);
var
  i,j:Integer;
  x,y: Real;
begin
  a:= StrToFloat(edtEingabe.Text);
  b:= StrToFloat(edt_Bx.Text);
  c:= StrToFloat(edt_C.Text);
  i:=20;
  while i<660 do
  begin
    i:=i+1;
    x:=(i-450)/50; //50, da Koordinatensystem in 50er Schritten erstellt ist
    y:=a*sqr(x)+b*x+c;
    j:=round((450-y*50)); //450 Grenze von X-Achse
    Image1.Canvas.Pixels[i,j]:=clblue; //zeichnen
  end;
end;

procedure TForm1.btn_neuClick(Sender: TObject);
begin
  Image1.Canvas.Rectangle(0,0,width,height);
  FormCreate(Sender);
  begin
    edtEingabe.Text:='';
    edt_Bx.Text:='';
    edt_C.Text:='';
    edtFx.Text:='';
    edt_X.Text:='';
    edt_B.Text:='';
    edt_Cx.Text:='';
  end;
end;

procedure TForm1.btn_Zeichne1Click(Sender: TObject);
var
  i,j:Integer;
  x,y: Real;
begin
  a:= StrToFloat(edt_X.Text);
  b:= StrToFloat(edt_B.Text);
  c:= StrToFloat(edt_Cx.Text);
  i:=20;
  while i<660 do
  begin
    i:=i+1;
    x:=(i-450)/50; //50, da Koordinatensystem in 50er Schritten erstellt ist
    y:=a*sqr(x+b)+c;
    j:=round((450-y*50)); //450 Grenze von X-Achse
    Image1.Canvas.Pixels[i,j]:=clred; //zeichnen
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i,j,k:Integer;
begin
  with Image1.Canvas do
  begin  //X-Achse
    MoveTo(1125,450); //Graph
    LineTo(20,450);

    for i:= -8 to 13 do
    begin
      Image1.Canvas.TextOut(450+50*i,455,IntToStr(i)); //Beschriftung
      MoveTo(450+50*i,445);  //Striche von Beschriftung
      LineTo(450+50*i,455);
      begin  //Y-Achse
        MoveTo(450,20); //Graph
        LineTo(450,660);

        for j := -8 to -1 do
        begin
          Image1.Canvas.TextOut(455,450+50*j,IntToStr(-j)); //Beschriftung
          MoveTo(445,450+50*j); //Striche von Beschriftung
          LineTo(455,450+50*j);

          for k := 1 to 4 do
          begin
            Image1.Canvas.TextOut(455,450+50*k,IntToStr(-k)); //Beschriftung
            MoveTo(445,450+50*k); //Striche von Beschriftung
            LineTo(455,450+50*k);
          end;
        end;
      end;
    end;
  end;
end;

end.

DeddyH 11. Okt 2011 11:59

AW: Graphen aus der canvas wieder löschen
 
*Puh* da habe ich gerade keinen Nerv dazu, mich da hineinzudenken. Da gibt es zwar noch einiges Verbesserungspotential, aber das ist für einen Anfänger vollkommen normal, also kein Grund zur Sorge. Wenn es so für Dich in Ordnung ist, kannst Du es IMO ruhig Deinem Lehrer vorstellen.

Bummi 11. Okt 2011 12:07

AW: Graphen aus der canvas wieder löschen
 
Delphi-Quellcode:
procedure TForm1.btn_ZeichneClick(Sender: TObject);
var
  i,j:Integer;
  x,y,a,b,c: Double;
begin
  Initialize;
  a:= StrToFloat(edtEingabe.Text);
  b:= StrToFloat(edt_Bx.Text);
  c:= StrToFloat(edt_C.Text);
  i:=19;
  Image1.Canvas.pen.Color := clBlue;
  while i<660 do
  begin
    i:=i+1;
    x:=(i-450)/50; //50, da Koordinatensystem in 50er Schritten erstellt ist
    y:=a*sqr(x)+b*x+c;
    j:=round((450-y*50)); //450 Grenze von X-Achse
    if i= 20 then Image1.Canvas.MoveTo(i,j) else Image1.Canvas.LineTo(i,j)
  end;
end;


procedure TForm1.Initialize;
var
  i,j,k:Integer;
begin
  with Image1.Canvas do
  begin //X-Achse
    Brush.Color := clWhite;
    Fillrect(ClientRect);
    MoveTo(1125,450); //Graph
    LineTo(20,450);

    for i:= -8 to 13 do
    begin
      Image1.Canvas.TextOut(450+50*i,455,IntToStr(i)); //Beschriftung
      MoveTo(450+50*i,445); //Striche von Beschriftung
      LineTo(450+50*i,455);
      begin //Y-Achse
        MoveTo(450,20); //Graph
        LineTo(450,660);

        for j := -8 to -1 do
        begin
          Image1.Canvas.TextOut(455,450+50*j,IntToStr(-j)); //Beschriftung
          MoveTo(445,450+50*j); //Striche von Beschriftung
          LineTo(455,450+50*j);

          for k := 1 to 4 do
          begin
            Image1.Canvas.TextOut(455,450+50*k,IntToStr(-k)); //Beschriftung
            MoveTo(445,450+50*k); //Striche von Beschriftung
            LineTo(455,450+50*k);
          end;
        end;
      end;
    end;
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Initialize;
end;

EWeiss 11. Okt 2011 12:10

AW: Graphen aus der canvas wieder löschen
 
Dann sage ihm auch wo er "Initialize" einbinden soll bzw. was es ist (procedure/function) ;)
Falls er es nicht weiss.

Und warum er es ändern sollte.

gruss

Union 11. Okt 2011 12:31

AW: Graphen aus der canvas wieder löschen
 
Du kannst auch den Graphen mit Pen.Mode pmNotXor neuzeichnen.

DeddyH 11. Okt 2011 13:18

AW: Graphen aus der canvas wieder löschen
 
Es ist ja alles gut, schön und richtig, was Ihr hier so postet, aber ich hege so meine Zweifel, ob das dem entspricht, was der Lehrer erwartet. Wobei das allerdings natürlich nur eine Vermutung meinerseits ist bzw. sein kann. :)

Blubbel 11. Okt 2011 15:13

AW: Graphen aus der canvas wieder löschen
 
Also für meinen Lehrer werde ich es so lassen...
Ich werd mich mal da reindenken und versuchen die codes zu verstehen... Danke euch:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 Uhr.

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