Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - PaintBox-Inhalt mit Form vergrößern/verkleinern
r@cer - Sa 10.03.12 16:51
Titel: PaintBox-Inhalt mit Form vergrößern/verkleinern
Hallo :)
ich wollte mal eben ein neues (kleines) Projekt angehen, nämlich ein Koordinatensystem mit einer Paintbox zeichnen lassen.
Damit möchte ich dann später verschiedene Funktionen zeichnen...
Bin noch am Anfang und lasse das ganze noch etwas schlicht und einfach also ohne viel Buttons und ähnliches. Das heißt momentan habe ich eigentlich nur meine PaintBox auf meiner Form und sonst nichts. Ich habe mir das so gedacht, dass ich das Koordinatensystem in der FormCreate zeichnen lasse, also beim starten der Anwendung, wenn das Fenster erscheint.
Hierbei bin ich auch schon auf mein erstes Problem gestoßen: Das Koordinatensystem wird nicht gezeichnet.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.FormCreate(Sender: TObject); var x,y:integer; begin
x:=Form1.Width-40; y:=Form1.Height-60;
with paintbox1.Canvas do begin moveto(0,round(y/2));lineto(x,round(y/2)); moveto(round(x/2),0);lineto(round(x/2),y); end;
end; |
Nachdem ich unter Ereignisse/OnClick auf FormCreate verwiesen habe, funktionierte das auch - nur eben mit einem Klick auf die Form.
Das heißt, mein Code ist soweit richtig, nur ich wüsste eben gerne, warum es nicht einfach auch mit der FormCreate geht.
Denn anscheinend habe ich das noch nicht so richtig verstanden.
Danach habe ich mir noch eine FormResize-Prozedur erstellt, damit auch die PaintBox bei verändern der Fenstergröße (bei laufender Anwendung) proporional dazu mit vergrößert oder verkleinert wird:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.FormResize(Sender: TObject); var x,y:integer; begin
PaintBox1.Left:=10; PaintBox1.Top:=10; PaintBox1.Height:=Form1.Height-60; PaintBox1.Width:=Form1.Width-40;
x:=Form1.Width-40; y:=Form1.Height-60;
with paintbox1.Canvas do begin moveto(0,round(y/2));lineto(x,round(y/2)); moveto(round(x/2),0);lineto(round(x/2),y); end;
end; |
Als ich dann auch noch den Inhalt der Painbox mit vergrößern/verkleinern wollte (unter dem zweiten Kommentar) hat das nicht geklappt. Der einzige Effekt, den dieser Teil meines Codes hat, ist das automatische Erscheinen des Koordinatensystems, was ich bisher nur mit "OnClick" erreichte. Aber sobald ich mit der Maus die Größe des Fensters verändere, schrumpft oder wächst zwar die Painbox mit, aber nicht deren Inhalt. Dieser erscheint dann erst nach einem Klick auf die Form wieder.
Gibt es da eine Möglichkeit wie ich das ändern kann?
Bin um jeden kleinen Tipp dankbar :)
lg r@cer
Gausi - Sa 10.03.12 17:20
Zum Malen in einer Paintbox ist das OnPaint-Event da. Das wird immer dann ausgelöst, wenn die Paintbox neu gezeichnet werden muss - da gehört den Zeichnen-Code rein. ;-)
Im OnCreate ist die Paintbox noch nicht sichtbar, daher sieht man davo nichts, wenn die danach angezeigt wird.
Und zum Vergrößern beim Vergrößern der Form: Schau dir mal die Eigenschaft Anchors an - damit geht das dann automatisch. :D
compiler93 - So 11.03.12 14:10
ich mache gerade ein ähnliches Programm als Funktionsplotter, ich kann dir zwar nicht helfen, hab aber auch eine Frage:
mein Problem: ich zeichne alles auf die Leinwand eines Image. aber wie sende ich das dann an den Drucker?
Ich hab das jetzt so versucht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Drucken1Click(Sender: TObject); var v_printer: TGraphic; begin if PrintDialog1.Execute then begin v_printer:= Image1.Picture.Graphic; printers.Printer.BeginDoc; printers.Printer.Canvas.Draw(20,20,v_printer); Printers.Printer.EndDoc; |
die Positon hab ich erst mal so auf 20,20 festgelegt, weil ich erstmal erreichen wollte, das ÜBERHAUPT etwas gedruckt wird, aber er "druckt" mir nur ne Weiße Fläche, irgendwelche Vorschläge? wäre echt super dankbar
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
compiler93 - So 11.03.12 14:35
bummi hat folgendes geschrieben : |
Der Code als solcher ist OK, ein Bild ist zugewiesen?
|
Ich hab direkt kein Bild zugewiesen, ich hab halt nur auf der Leinwand gezeichnet.
Das sieht dann z.B. so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| begin while v_mx<=v_xn do begin v_my:=v_a*cos(v_b*v_mx)+v_c; v_bx:=v_kux+round(v_mx*v_mass); v_by:=v_kuy-round(v_my*v_mass); Image1.Canvas.Pixels[v_bx,v_by]:=ColorBox1.Selected; v_mx:=v_mx+0.0005; end; end; |
und mir fällt sonst aber nichts ein bzw hab auch nichts gefunden wie ich das dann auf die Druckerleinwand übertrage, wenn es sich nur um einen Zeichenprozess handeln würde, würde ich ja einfach nochmal den selben Code auf Pronters.Canvas zeichnen, aber es handelt sich um mehrere Nacheinander abgelaufene Prozesse die auf den selben Variabeln basieren aber halt verschiedene Funktiosntypen darstellen
bummi - So 11.03.12 15:19
Wenn Du statt Image1.Canvas eine Parameter aCanvas übergibst kannst Du überall hin malen.
Das Problem bei Deinem Aufruf ist daß Du Image1.Picture.Graphic übergibst, gemalt hast Du hingegen auf Image1.Picture.Bitmap, diese solltest Du hier übergeben.
Delphi-Quelltext
1: 2: 3:
| Printer.BeginDoc; Printer.Canvas.Draw(20,20,Image1.Picture.Bitmap); Printer.EndDoc; |
compiler93 - So 11.03.12 15:36
es klappt weiterhin nicht, ist aber nicht weiter soooo tragisch, dann schmeiße ich die Druckfunktion einfach raus und lass mir was anderes einfallen
trotzdem danke Bummi
bummi - So 11.03.12 16:17
soooo schnell würde ich nicht aufgeben, irgendwann benötigst Du es wieder, den Fehler zu finden sollte Dir schon (aus Prinzip) am Herzen legen ... ;-)
compiler93 - So 11.03.12 18:09
bummi hat folgendes geschrieben : |
| soooo schnell würde ich nicht aufgeben, irgendwann benötigst Du es wieder, den Fehler zu finden sollte Dir schon (aus Prinzip) am Herzen legen ... ;-) |
Grundsättlich gebe ich dir ja Recht, aber indem Falle wäre das nur ein "Extra" um eine bessere Note zu bekommen, wobei ich noch andere Alternativen habe. Ich warte am besten ab bis wir das auch direkt im Unterricht behandeln, bevor ich euch noch Ewigkeiten nerve. Wenns fertig ist stell ich es für euch online zum Testen.
r@cer - So 11.03.12 21:48
@Gausi
danke für deine schnelle Antwort. :)
Dein Tipp mit dem OnPaint-Event hat geholfen. Also nachdem ich den Code aus der OnCreate in die OnPaint hineinverschoben hatte, hat dann auch das mit der FormResize einwandfrei funktioniert. :) Da war das mit den Anchors gar nicht mehr nötig. (das hab ich jetzt auch nicht mehr ausgetestet...oder ist das viel einfacher?)
Bevor ich mich jetzt an dem eigentlichen Zweck meines Programmes mache, nämlich wie schon gesagt soll es Funktionsgraphen zeichnen können, habe ich überlegt, doch erst "das Äußere" noch etwas aufzupeppen ... also noch ein wenig Extras :D. (Hierbei in Bezug auf das Koordinatensystem)
Wenn das Koordinatensystem erzeugt wurde, soll man 1. per DragAndDrop das ganze verschieben und 2. per Mausrad raus- und reinzoomen können, damit man später gewisse Bereiche einer Funktion besser betrachten/untersuchen kann. Jetzt ist mein Problem ähnlich wie zu Anfang, dass ich einfach vorher noch nie mit einer Paintbox gearbeitet habe, und auch mit Ereignissen wie "OnDragDrop" usw.. keine Erfahrung habe. Ich habe aber auch schon gemerkt, dass es die OnMouseWheelDown- OnMouseWheelUp-Events, wie sie unter den Ereignissen der Form zu finden sind, für die Paintbox nicht existieren. Heißt das es ist für eine PaintBox so nicht möglich?
Könnte mir da jemand etwas unter die Arme greifen? :) - wäre echt dankbar, wenigstens für einen kleinen Tipp als Anstoß.
(Ich hoffe es ist ok, dass ich dafür jetzt kein neues Thema auf mache.. oder sollte ich das?)
lg r@cer
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!