Paint in Delphi Programmieren?

Code46

Erfahrenes Mitglied
Wie kann ich in Delpi Paint programmieren wie müsste da anfangen und wie lange würde das dauern ungefähr das ich mir ein Bild machen kann. Ich habe nicht so viel erfahrung in Delphi wäre es machbar das zu programmieren
 
Machbar ist das auf alle Fälle. Ich habe mir Paint mal eben angeschaut (ich nutze normal ein anderes Programm) und der Funktionsumfang hält sich in einem überschaubaren Rahmen. Ein Abschätzung über das "wie lange" ist aber nicht ganz so einfach. Wenn du das als Projekt bis Februar machen möchtest (ich denke da an deinen Thread "Projektvorschlag gesucht"), glaube ich beinahe, daß eine Nachprogrammierung von Paint zu hoch gegriffen ist. Denn was nach außen hin so einfach und locker aussieht, erfordert im Hintergrund eine Menge Programmierarbeit. Nicht umsonst sieht Paint nach einem einfachen Programm aus.

Ich gehe mal so die einzelnen Funktionen durch (quasi: Ich denke laut) und gebe mal meinen Senf dazu ab. Das wäre z.B. auch normal der erste Schritt, wenn man sich an so ein Projekt ranmachen möchte. ;) Man sollte sich wirklich klar sein darüber, was man da versucht zu entwickeln. Ein "das Programm soll halt so sein wie Paint" ist dabei in keinster Weise eine Funktionsbeschreibung, mit der sich irgendetwas anfangen lässt. Das muß dann schon sehr viel detaillierter sein...

Äußerer Aufbau: Von der Programmiererseite her sehr einfach. SDI-Architektur, ein Hauptmenü, kein Kontextmenü, ein Statusbar und zwei Panels mit Optionen (Malwerkzeuge und Farbauswahl), wobei sich im Panel der Malwerkzeuge noch die Anzeige zur Laufzeit verändert (Auswahl Liniendicke, Pinselart etc.). Da würde ich einen normalen Aufwand bei der Nachprogrammierung sehen. Das Wichtigste hier wäre nur, sich genaue und detaillierte Gedanken zu machen, bevor man sich das Ganze wild zusammenklickt. Stichwort z.B. TActionManager.

Dateioptionen: Laden, Speichern, alles von der Stange. Allerdings hat Paint einige Grafikfilter. BMP, JPG, PNG, TIFF und ICO. Ok, BMP wird von Delphi serienmässig verarbeitet, JPG weiss ich jetzt nicht genau (ich glaube bis Delphi 7 gab es da ein TJPEGImage oder so), ICO und PNG kann man sich zur Not nachbauen, TIFF wird schon deutlich schwieriger, wenn man nicht irgendwelche Grafikbibliotheken zur Hilfe nimmt. Also entweder ist da noch die Suche nach einer Grafikbibliothek notwendig, die dann auch noch eingebunden werden muß und deren Verwendung noch erlernt werden muß oder es müssen manuell entsprechende Filter geschrieben werden, was einen sehr hohen Aufwand bedeutet.
..........
Ok, kurz für 1 Minute gegoogelt, für JPG, PNG usw. gibt es anscheinend eine ganze Menge Klassen, die man verwenden kann. Das senkt den Aufwand wieder deutlich.

Druckoptionen: Prinzipiell auch wieder Standard und von der Stange (Drucken, Seite einrichten, Drucker einrichten), aber da steckt der Teufel im Detail. Keine Ahnung, wie es anderen geht, aber mir persönlich fällt das Drucken generell etwas schwerer, v.a. wenn ich die Blindbereiche des Druckers mitberücksichtigen soll und wenn sich der Benutzer seinen Druck so gestalten können soll, wie er will. Die Rave Reports helfen da zwar gewaltig weiter, aber es bleibt dennoch eine fiese Frickelei (nach meinem Empfinden), v.a. wenn man die Druckdialoge im Standardlook beibehalten will und nicht die Nevrona-Dialoge verwenden möchte. Aber auch hier behauptet Google, daß speziell der Bitmapdruck relativ einfach realisierbar sein soll. Nach ersten Sichtungen des Internets würde ich dann doch die Rave Reports weglassen und selber eine Prozedur zusammen hämmern. Sieht auch nach einem vertretbaren Aufwand aus.

Sehr viel interessanter wird da schon der Menüpunkt "Senden". Wenn man es mal gemacht hat, ist so ein DDE-Aufruf ja nicht mehr so das Problem, aber wenn man das das erste Mal macht, ist es doch recht happig...
Auch das Nachbauen von "Zuletzt verwendete" Datei kann lustig werden. Aber zum Glück sind Registrymanipulationen mit Delphi deutlich einfacher als z.B. mit MS Visual C++.

Sooo... was haben wir noch?

Hehehe, da wird's schon heftiger. "Rückgängig" und "Wiederholen". Aber gut, im Vergleich zu professionellerer Software hält sich das gerade noch in Grenzen und ist auf 3 Schritte reduziert. Dennoch: Das nachzuprogrammieren wird für einen Neuling bereits schwer. Behaupte ich mal.
Auch der "benutzerdefinierte Zoom" unter Ansicht dürfte recht knifflig werden, weil dann an dieser Stelle bereits mit Viewports gearbeitet werden muß. Da geht also nichts mit "ich mache einfach ein TImage oder eine TPaintBox auf den Canvas und ab geht's". Nö. Mit einem Zoom darf dann schön geblittet werden zwischen Speicherbitmap und Anzeigebitmap - und bitte nicht vergessen, den Skalierungsfaktor bei allen Bildoperationen mit einzurechnen. Inklusive Viewportkoordinaten.

Ooooh, da ist ja was richtig Schönes... wenn ich alles kombiniere...

- "Datei -> Neu..."
- "Ansicht -> Zoom -> benutzerdefiniert -> 600%"
- Werkzeugleiste -> Bögen
- drei Bögen mit unterschiedlicher Liniendicke malen
- "Bearbeiten -> Rückgängig" 3x
- "Bearbeiten -> Wiederherstellen" 3x

Also bis diese Ablauffolge sauber (und vor allem flackerfrei) programmiert ist (inklusive Drag & Drop auf dem Bildcanvas zum Zeichnen der Bögenstücke) ist eine Menge Arbeit notwendig.


Wenn ich jetzt Paint nachprogrammieren sollte, würde ich so vorgehen, daß ich die Kernfunktionalitäten erst einmal voneinander getrennt entwickel und sie so sauber wie nur möglich bastel. Das wären:

Zeichnen auf einem Canvas inklusive Drag & Drop (z.B. für Linienzeichnen oder Einfügen von Bildteilen). Nein, ich setze da nicht bereits alle möglichen Zeichenoperationen um. Ich will einfach nur ein anzeigbares Bild, auf welches ich Klicken kann und was mir dann brav die angeklickten Pixel einfärbt. Und wenn ich auf ein Linienicon klicke, dann will ich mittels Drag & Drop eine Linie zeichnen können. Sobald ich so weit bin, gehe ich mal davon aus, daß ich die gröbsten Kernprobleme des reinen Zeichnens einigermaßen im Griff habe. Denn ob ich jetzt mittels Drag & Drop zwei Koordinatenpunkte bestimme, um eine Linie zu zeichnen oder um die Eckpunkte eines Rechtecks aufzuspanne bleibt sich im Endeffekt gleich.
(Da ich so etwas schon mal gemacht habe, kann ich dir verraten: Das Programmieren solch einer Bildoberfläche ist sehr viel trickreicher als es auf den ersten Blick erscheint. Was mit einfachen Mausklicks mit und ohne Kombination mit Mauszeigerbewegung und Festhalten/Loslassen der Maustasten alles möglich ist, hätte ich auch nicht für möglich gehalten. Nicht umsonst habe ich bei meiner TMyPicture-Klasse die drei Methoden OnMouseDown, OnMouseMove und OnMouseUp jeweils in eine eigene Unit ausgelagert...)

Implementierung eines einfachen Zooms: Entweder sehe ich das Bild in der Größe 1:1 oder 1:2. Nur diese beiden Modi, dafür aber mit variablen Scrollbalken in einer ScrollBox und mit der Möglichkeit, den betrachteten Bildausschnitt in Zoomansicht zu verscieben. Sobald ich dann dafür ein bißchen ein Gefühl bekommen habe, mache ich mich an die Implementierung eines Viewports und Entwickelung einer vollständigen Zoomfunktion.

Danach würde ich ein Programm schreiben, welches mir eine Bitmap ausdruckt. Natürlich mit Druckereinstellung, Positionierung der Bitmap auf dem Blatt Papier, Skalierung etc. pp. Was halt so alles dazu gehört.

Wenn diese drei Programme stehen, würde ich mit dem "Paint Klon" anfangen und die erste Oberfläche basteln und dann die Kernmethoden aus den anderen drei Programmen da einbauen. Und auf dieser Basis dann allmählich den Rest entwickeln (als nächstes wohl die 3-stufige Rückgängig-/Wiederholenfunktionalität).


Ich hoffe, ich konnte dir ein bißchen bei der Entscheidungsfindung helfen. :)
 
Jo danke für dein großen aufwand. Es nicht excaktdas selbe wie paint sein. ALso ich lasse einige Funktionen weg.Weil wie du schon sagtest das würde mich sehr viel Zeit kosten.Ich hatte mir gedacht, dass ich Farbe,Öffnen,Speichern,Drucken,Malen,Radiargummi nur diese sachen nehme. Das müsste doch wesentlich einfacher sein oder? Wenn nicht was für ein Projekt könnt ich sonst machen.Ich hatte mir sonst Tetris überlegt?

Würdew mich wieder freuen wenn du mir weiter helfen könntest

Danke
 
Was ist eigentlich das Ziel des Projektes?

Sollst du zeigen, dass du Delphi beherrscht?
Sollst du zeigen, dass du Software allegemein entwickeln kannst?
Sollst du zeigen, dass du eine komplexe Aufgabe in ein Programm verwandeln kannst?
.....?

Vielleicht tut es ja auch ein Projekt, bei dem mehr die Planung relevant ist als die Realisierung in Delphi?
 
Zurück