Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Canvas/TBitmap + Geometrische Figuren (https://www.delphipraxis.net/60583-canvas-tbitmap-geometrische-figuren.html)

He4db4nger 9. Jan 2006 16:29


Canvas/TBitmap + Geometrische Figuren
 
hi,
also erstmal meine Situation:
Ich "durfte" 2 Jahre Java lernen unter absolut unfähigen Lehrkräften. Dies war 2x in der 11. Klassen. Mittlerweile habe ich jedoch die Schule gewechselt und auch dort wieder Informatik belegt - nur wird dort jetzt Delphi unterrichtet. Der Lehrer, wieder mit sehr wenig Ahnung fand es auch nach mehrmaligen Nachfragen nicht wichtig, den Neuankömmlingen (es waren insg. 4 von 11) mal wenigstens etwas über die Basics und so zu vermitteln. Jetzt werden einige sagen: wenn man das selbst aneignet, kann man es am besten. Viel anderes blieb uns auch nicht übrig, aber wirklich beeindruckend ist das nun wirklich nicht. Da wir auch noch andere Fächer haben, hatten wir nun grade mal die Zeit, so ein paar Grundlagen (ein Taschenrechner wars am Ende.. in 8 Wochen) anzueignen und das wars. Da dem Lehrer allerdings dadurch die Zeit weggerannt ist und er kaum da war, haben wir nun eine Hausarbeit bekommen, die jeder selbstständig lösen muss. (Jeder Schüler muss eine andere Version abgeben) Das Problem ist nur: Wir könnens nicht!

Die Aufgabe besteht darin, ein Programm zu kreieren, dass bei Angabe von Maßeinheiten, Radius, Seitenlängen etc. die entsprechende Figur ausgibt/zeichnet. Dies soll in Anlehnung an das gute alte Paint geschehen.

Jetzt sind wir natürlich ordentlich vor den Kopf gestoßen, da keiner so Recht weiß, wo er ansetzen soll. Erschwerend kommt hinzu, dass dies in OOP (objektorientierter Programmierweise) stattfinden soll, was bisher überhaupt noch keiner verstanden, selbst die, die in 11 auch schon Delphi hatten. Die große Hilfe des Lehrers war: Verwendet mehrere Units.

Toll! Das hat uns echt geholfen. Deprimierend wurde es für uns, als es hieß: Wenn die obigen Anforderungen erfüllt sind, gibt es die Note ausreichend - ganz klar zu wenig! Nichtsdestotrotz muss ich nun irgendwie dieses Programm hinzaubern. Ein fertiges aus dem Netz zu ziehen scheidet aus, da es nur viel zu komplizierte Programme gibt, die mit 10 Units aufwarten, bisschen zu hoch gegriffen.
Nach Codeschnipseln zu suchen ist für mich sehr schwer, da ich gar nicht genau weiß, was ich suchen muss. Das einzige was ich Delphi kann ist diese "Form" zu erstellen.

Als Zusatzpunkte kann man sich übrigens Punkte verdienen, umso mehr "Schnickschnack" man einbaut. Z.B. die Farbe wechseln der gezeichneten Formen, Hintergrundmusik, Ladebalken, Icons etc.

Ich bin für jeden Tipp dankbar! Seien es Codeschnipsel, Ansätze, Hilfestellungen etc. Vielen Dank schonmal im Vorraus!

Ich will damit nicht die Hausaufgaben erbetteln oder sonst irgendwas tun. Ich bin einfach nur in einer blöden Situation und erhoffe mir hier Hilfe. Da ich zu meinem "Schnipsel" mehrere Fragen habe, werde ich diesen Thread hier benutzen für die ganzen Probleme und nicht immer ein extra Thread auf machen.

Hier seht ihr einen Screenshot von dem Programm.
Hier könnt ihr das Programm incl. Source runterladen!


Problem 1 wäre:
Ich habe eine PaintBox eingebaut, dessen Inhalt ausgedruckt und exportiert werden soll. Aber ausser der SaveFileDialog und Printdialog Box komm ich nicht weiter. Habe was gelesen von TImage und TBitmap, komm damit aber irgendwie nicht zurecht.

Problem 2 wäre:
Auf dem Screenshot sieht man ja die Eingabefelder. Abhängig von der Auswahl der oberen Checkbox verschwinden bestimmte Edit-Felder. (Das klappt sogar) Jetzt wollte ich anhand dieser Eingaben in der PaintBox unten diese Sachen zeichnen lassen, doch dass tut er nicht. Wenn man jedoch oben von der CheckBox auswählt, zeichnet er mir die Linien/Karos. Derzeit steht das so im Quelltext:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var rad,hoehex,hoehey:integer;
begin
  with PaintBox1.Canvas do begin
  hoehex:=round(form1.Paintbox1.width/2);
  hoehey:=round(form1.Paintbox1.height/2);
  rad:=round(strtoint(Radius.Text));
  Form1.Paintbox1.Canvas.Pen.Color:=clgreen;
  Form1.Paintbox1.Canvas.Pen.Width:=10;
  Form1.Paintbox1.Canvas.Ellipse(hoehex-rad,hoehey-rad,hoehex+rad,hoehey+rad);
  end;
 Radius.Text:=(FloattoStr(StrtoFloat(Umfang.Text) / 2));
end;
Die Zeile Radius.Text.. funktioniert auch irgendwie nicht. Egal,was ich in diesem Editfeld eingebe, erscheint ein EConvertError (Bsp. 2, 2.0, 2,0). Mit InttoStr funzt es ebenfalls nicht.

So und jetzt bin ich erstmal ruhig, is schon viel zu viel Text ^^ Bin wirklich für alles dankbar :-)

arbu man 9. Jan 2006 18:25

Re: Delphi-Noob hat Fragen
 
Ich habe mir mal die Unit angeguckt. Naja Objektorientiert ist da irgentwie nicht viel.
Kleine Einführung zur OOP

Das ganze würde ich in etwa so machen :

Du erstellst dir eine Klasse mit allen Basis Eigenschaften die alle deine (Zeichen-)Objekte gemeinsam haben (mir fallen da spontan top und left ein) und leitest dann von dieser Klasse alle weiteren (Zeichen-)Klassen ab mit den weiteren Eigenschaften wie Radius usw. dann musst du nur noch die Klassen zeichnen oder den Klassen methoden einbauen das Sie sich selbst auf ein TBitmap oder TCanvas zeichnen können.

Zum Drucken und Speichern:
Der Drucker Dialog richtet den Drucker nur ein (Seitenabstand usw.) Drucken musst du mit Printer.Canvas und der SaveDialog liefert nur den Filename speichern kanst du bilder z.B. TBitmap.SaveToFile.

ManuMF 9. Jan 2006 18:48

Re: Delphi-Noob hat Fragen
 
Hallo,

1. Nicht zu viele unnötige Umwandlungen.
2. Besserer Code-Stil. Dann kannst du selbst besser durchblicken. Siehe dazu die Änbderungen unten.
3. Die Delphi-Hilfe liefert zu vielen Funktionen eine gute Beschreibung. Zum Beispiel gibt die Funktion StrToIntDef "0" zurück, wenn man irgend einen Mist eingibt. Alternativ kann man Fehleingaben mit Delphi-Referenz durchsuchentry...except abfangen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var rad, hoehex, hoehey : Integer;
begin
  Rad := StrToIntDef(Radius.Text, 0);
  with PaintBox1 do begin
    hoehex := width DIV 2;
    hoehey := height DIV 2;
    Canvas.Pen.Color := clGreen;
    Canvas.Pen.Width := 10;
    Canvas.Ellipse(hoehex - rad, hoehey - rad, hoehex + rad, hoehey + rad);
  end;
  //Radius.Text:=(FloattoStr(StrtoFloat(Umfang.Text) / 2));
  //Den Sinn dieser Zeile verstehe ich nicht ganz.
  //eher folgende, um den Umfang zu berechnen:
  Umfang.Text := IntToStr(Round(2 * PI * Rad));
end;
Gruß,
ManuMF

ichbins 9. Jan 2006 19:03

Re: Delphi-Noob hat Fragen
 
TImage ist praktisch das selbe wie eine TPaintbox, nur mit dem Vorteil dass der Canvas nicht verlorengeht wenn du ein anderes Form darüber hinwegziehst.

TBitmap kannst du so verwenden:
Delphi-Quellcode:
var
  b:tbitmap;
begin
  b:=tbitmap.create;                         //erstellen
  b.width:=breite;
  b.height:=hoehe;
  b.canvas.dosomething;
  b.savetofile('c:\datei.bmp');
  paintbox1.canvas.draw(0,0,b);              //legt das Bitmap auf der Paintbox ab
  b.free;                                    //freigeben
end;
ich würd es so machen, dass ich eine globale Bitmap-Variable habe, die ich in der form.create erstelle und in der Paintbox im Ereigniss onpaint oder bei Änderungen der Bitmap mit paintbox1.canvas.draw ausgebe. Gezeichnet wird nur auf den Canvas des Bitamps (sowieso schneller) Ich glaub tbitmap hat auch den Befehl print.

Luckie 9. Jan 2006 19:09

Re: Delphi-Noob hat Fragen
 
Ein TImage ist aber nicht zum Zeichnen gedacht und auch nicht dafür geeignet.

@He4db4nger: Bitte editier dein erstes Posting und gibt iohm ein ausagekräftiges Topic, was deutölich macht, um was es geth. Das geht umso leichter, wenn man sich an die Regeln hält und auch nur eine Frage pro Thread stellt. Halte dich bitte das nächste mal daran.

He4db4nger 9. Jan 2006 19:10

Re: Delphi-Noob hat Fragen
 
ManuMF, ich werde dich in mein abendgebet einschließen ^^
*niederknie* Es funktioniert.. danke,danke,danke ^^

und wie krieg ich das jetzt hin (ja.. ich weiß ^^), dass das jetzt auch noch für Rechtecke und Quadrate funzt?
:wiejetzt:

wenn du mir noch das hinschreibst, wie man eine weitere figur da reinkriegt, müsste ich die nächsten eig. können..^^

Delphi-Quellcode:
...
 end;
  Umfang.Text := IntToStr(Round(2 * PI * Rad));
  Radius.Text := IntToStr(Round(StrToInt(Radius.Text) div 2));
so zumindest gehts schonmal nicht..

arbu man 9. Jan 2006 19:14

Re: Canvas/TBitmap + Geometrische Figuren
 
Mit Canvas.Rectangle zeichnest du Recheck und Quadrat.

He4db4nger 9. Jan 2006 20:17

Re: Canvas/TBitmap + Geometrische Figuren
 
Zitat:

Mit Canvas.Rectangle zeichnest du Recheck und Quadrat.
ja,schon klar. aber das muss ja jetzt wiederhohlt eingetragen werden in den Codeschnipsel von ManuFM.


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