Autor Beitrag
benni316
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: So 30.06.13 12:38 
Mein erstes größeres Projekt, programmiert mit Delphi 7.
Es handelt sich um ein einfaches Zeichenprogramm wie Paint, und beherrscht auch die meisten üblichen Funktionen (Zeichnen mit der Maus, Rechtecke aufziehen, Bereiche einfarbig füllen, eine Pipette, Textausgabe, Bitmaps öffnen und speichern) und noch zusätzlich zwei Möglichkeiten, um ein zufälliges Bild mit Linien und Rechtecken erzeugen zu lassen.

Dafür habe ich auf dem Hauptfenster folgende Komponenten verwendet: Eine Paintbox, ein MainMenu und Dialoge für Öffnen, Speichern und Farbauswahl.
Insgesamt gibt es 6 Formulare, 5 davon werden verwendet, mit der 6ten werde ich vielleicht noch etwas machen.

Begonnen habe ich damit im März, da ich mich für meine Informatik-Matura mit einfachen 2D-Grafiken in Delphi beschäftigt habe, und mein dadurch angeeignetes Wissen über Canvas in einem Programm verwenden wollte. Das Programm wurde immer wieder von mir auf Fehler getestet, und seit März immer wieder ein bisschen bearbeitet, in letzter Zeit wieder etwas mehr, und nun ist es so weit fortgeschritten, dass ich es hier hochladen kann.

Wenn ihr noch ein paar Ideen habt, was ich noch hinzufügen oder verbessern könnte, teilt sie mir mit, deswegen hab ich es ja auch hier hochgeladen ;)

Die finale Version gibts über meinen Mediafire-Ordner (exe und Quellcode):
www.mediafire.com/fo...fwd4/Zeichenprogramm

oder im Anhang.


Crossposts in anderen Foren:
www.delphipraxis.net...m-3.html#post1220831
forum.delphi-treff.d...d&threadID=58947
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von benni316 am Mi 10.07.13 18:37, insgesamt 7-mal bearbeitet
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: So 30.06.13 13:47 
Vorerst freue ich mich über Übungsprojekte :)
Hier mal ein paar Fragen/ Bemerkungen
1. Deine Pipette übernimmt leider nicht die farbe, sondern "klaut" sie und füllt das Feld schwarz :( (hast es mit dem "Sprüher" verwechselt?
2. Warum funktionieren gestrichelte Linien nicht mit einer "breiten" Linie? du könntest z.B. Canvas.pen.width auf die stiftbreite setzen oder die Linien mehrfach dazu ziehen (parallel, bei schräge leicht versetzt, dennoch parallel)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: So 30.06.13 14:14 
Danke für deine Bemerkungen, dass man das mit den strichlierten Linien so lösen könnte (weil mit die Eigenschaft canvas pen.style ja nur mit pen.width 1 funktioniert) , hab ich gar nicht bedacht, mal sehen, ob ich da was zusammenbringe ;)
Zur Pipette: Die Pipette selbst füllt gar nichts, sie übernimmt nur die Farbe von deiner Cursorposition. Du hast vielleicht gleichzeitig Füllen aktiviert?! Wobei ich das einfach unmöglich machen könnte, damit sowas nicht passiert ;)
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: So 30.06.13 14:50 
Moin,

und herzlich willkommen in der Entwickler-Ecke! :welcome:

Sehr cooles Programm! :) Besonders die Funktion, ein computergeneriertes Bild zu erstellen sieht sehr gut aus! Leider hat jedoch bei mir die Sache mit den gestrichelten Linien gar nicht funktioniert, auch nicht, wenn ich bei Strichdicke 1 eingegeben habe.

Viel Spaß bei uns!
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: So 30.06.13 15:03 
Danke für die schönen Willkommensgrüße :D
Ich habe für die strichlierten Linien die Eigenschaft canvas.pen.style auf psdash gesetzt, komischerweise geht das bei mir aber auch nur, wenn ich die Maus sehr schnell bewege O.o
Dass das mit den pen-styles mit einer Breite größer als 1 nicht geht, scheint übrigens eine Windows-Limitierung zu sein, wobei ich dazu nur einen Foreneintrag von 2003 finde, vielleicht geht das ja schon mit einer neueren Delphi-Version, weiß das jemand genaueres?
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: So 30.06.13 18:51 
So, neue Version :)
Es ist jetzt möglich, Polygone zu zeichnen, dazu muss man zuerst die Anzahl der Punkte angeben, die Länge des Arrays wird bestimmt, und man wird auf eine extra Form mit Paintbox umgeleitet, um die Punkte festzulegen, man klickt auf einen Punkt und er wird festgelegt, an der Stelle steht dann die Nummer des Punktes.
Ich werde dass demnächst noch überarbeiten, ein Ziel ist es, die Paintbox in der Form, in der man die Punkte fürs Polygon festlegt, mit demselben Inhalt zu füllen, der auf Form1 gezeichnet wurde.
Mit:
Zitat:

bmp.Canvas.copyrect(bounds(0,0,form1.PaintBox1.Width,form1.PaintBox1.Height),form1.PaintBox1.Canvas,form1.PaintBox1.ClientRect);
form7.PaintBox1.Canvas.Draw(0,0,bmp);

im OnClick des Buttons, der Form7 aufruft, funktioniert es leider nicht (bmp ist eine globale Variable vom Typ TBitmap).

Und das mit den pen-styles werd ich eher so lassen, mögliche Lösungen aus dem Internet sind mir zu kompliziert ;)
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: So 30.06.13 21:47 
Wieder neue Version, es gibt ein paar Änderungen bei der Oberfläche, man kann nun auch über die Polygon-Form Linienfarbe und Breite festlegen.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 02.07.13 20:36 
- Nachträglich durch die Entwickler-Ecke gelöscht -
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: Di 02.07.13 20:59 
Die Seite war bis vor ein paar Stunden down, aber inzwischen hat sich einiges getan.
Neue Versionen von exe und Code gibts ab sofort in meinem Mediafire-Ordner:
www.mediafire.com/fo...fwd4/Zeichenprogramm

Das mit den Polygonen hab ich aufgrund dieser AccessViolation-Meldungen geändert, man gibt nun keine Punkteanzahl mehr an, sondern die Länge des Arrays wird auf 100 begrenzt, was absolut ausreichen sollte, allerdings gibt es nun ein anderes Problem mit den Polygonen: Irgendwie wird der Punkt (0,0) immer in das Array eingefügt und somit ist er auch im Polygon enthalten, obwohl man nie dorthin geklickt hat, das sollte der einzige Bug zurzeit sein.
Sonstige Neuerungen:
Besser formatierter Code
Zum Zeichnen wird nun ein TImage benutzt, statt einer Paintbox
Die Mausbewegungen werden nun wirklich punktgenau erfasst, da nun die lokale Muasposition hergenommen wird
Noch ein paar Kleinigkeiten, die mir entfallen sind ;)
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Di 02.07.13 21:12 
user profile iconbenni316 hat folgendes geschrieben Zum zitierten Posting springen:

Zum Zeichnen wird nun ein TImage benutzt, statt einer Paintbox


Das ist eher ein Schritt zurück, als einer in die Richtige Richtung ;)
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: Di 02.07.13 21:30 
Der Nachteil an der Paintbox ist, dass man das Fenster nicht verkleinern/vergrößern darf, sonst ist die ganze Zeichnung weg, was beim TImage nicht der Fall ist.
ICh hab schon mal wo gelesen, für Sachen wie Spiele, wo dauernd etwas neu gezeichnet wird (wie auch hier) soll man die Paintbox nehmen, allerdings gibt es dann die bereits erwähnten Nachteile.
Was wären denn Vorteile der Paintbox gegenüber dem Image? Würd mich brennend interessieren ;)
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: Mi 03.07.13 13:36 
Update:
Das Programm sollte nun komplett Bug-frei sein (alles funktioniert wie es soll, aber es ist leider immer noch möglich, es an einigen Stellen gezielt abstürzen zu lassen, werd mich heute noch darum kümmern ;)) hat ab sofort eine Versionsnummer (1.0) sowie eine Dateibeschreibung (sieht man unter den Eigenschaften oder wenn man mit dem Cursor drauf bleibt).
Weiters verwende ich nun den OpenPicture- bzw. SavePicture-Dialog, man kann Dateien nun als JPG, BMP, ICO, EMF und WMF speichern und auch solche Dateitypen öffnen (hätte ich gleich von Anfang an machen sollen, aber besser spät als nie :D)


Wenn ihr dennoch Bugs findet, bitte hier reinschreiben!
Falls jemand Vorschläge für neue Features hat, teilt sie mir mit!

Aktuelle ToDo-List:
Durch User hervorgerufene Abstürze verhindern
Die Computergeneriertes-Bild-Funktion leicht verändern
Funktion hinzufügen, um ein Bild in Graustufen umzuwandeln
Namen verändern
(evtl Toolbar statt MainMenu verwenden)
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: Mi 03.07.13 21:56 
Neue Version (1.1.2 Beta), hier der Changelog:

Die Funktion "Computergeneriertes Bild erstellen" wurde überarbeitet, damit die Rechtecke nicht immer im Vordergrund sind
JPEG öffnen wird unterstützt, man kann sie aber nicht bearbeiten (geht nur für Bitmaps) ich werde versuchen, eine Funktion zur Umwandlung einzubauen
Stiftbreite wird nun über eine Scrollbar festgelegt, in einer Paintbox daneben sieht man, wie dick eine Linie dann ist
Wenn man ein Bild einmal gespeichert hat, wird man beim Beenden des Programms nicht mehr gefragt, ob man es speichern möchte
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: Mi 03.07.13 22:52 
Mir ist grad aufgefallen, dass ich die halb fertig überarbeitete TextForm im aktuellen Code/exe drin habe, wird gleich gefixt ;)
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: Mi 03.07.13 23:30 
Neue Version, Text-Ausgabe wurde komplett überarbeitet ;)
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: Do 04.07.13 16:29 
Neues Update (Version 1.3)

Changelog:
Man kann JPEGs öffnen, bearbeiten, und in verschiedenen Formaten speichern (GIF und PNG ausgeschlossen, da diese standardmäßig nicht unterstützt werden, wird aber noch kommen, ich muss nur eine passende Unit im Netz finden und in mein Projekt einbinden ;))
Einige Exceptions wurden hinzugefügt
Die wechselnde Stiftfarbe kann nun abgestellt werden (hätte man früher eigentlich auch können sollen, aber hat nicht funktioniert)
Beim Schliessen des Programms über Datei-->Schließen wird man nicht mehr zweimal gefragt, ob man die Datei vorher speichern möchte

Bekannte Bugs:
Wenn man das Öffnen eines JPEGs abbricht, gibts eine Access Violation, obwohl ich ein Try-Except eingebaut habe, und dieses auch ausgeführt wird
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 04.07.13 20:10 
user profile iconbenni316 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn man das Öffnen eines JPEGs abbricht, gibts eine Access Violation, obwohl ich ein Try-Except eingebaut habe, und dieses auch ausgeführt wird
Execute hat nicht umsonst einen Rückgabe-Wert:
ausblenden Delphi-Quelltext
1:
if OpenDialog1.Execute then					

Damit wird auch dann das Try-Except obsolet. :-)

Du wirst übrigens merken, dass der Quelltext Deines Programmes immer und immer schwieriger wird zu warten.

Ich würde Dir daher empfehlen den Quelltext wenigstens zu formatieren. Da Du bereits relativ viel Source-Code zusammengetragen hast, eignet sich ein Tool, das Dir hier die Arbeit abnimmt. Z.B. das Plugin von user profile icondummzeuch. :idea:
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: Do 04.07.13 21:25 
Ich verwende bereits Einrückungen, hast du vllt die Version hier aus dem Forum gedownloadet?
Die ist nämlich alles andere als aktuell, neue Versionen, sowie die meisten älteren Versionen gibts immer hier: www.mediafire.com/fo...fwd4/Zeichenprogramm ;)
Der Quellcode ist im 7z-Archiv.

EDIT: Das Plugin wer dich mir trotzdem holen, scheint sehr nützlich zu sein ;)
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 04.07.13 22:43 
user profile iconbenni316 hat folgendes geschrieben Zum zitierten Posting springen:
Ich verwende bereits Einrückungen, hast du vllt die Version hier aus dem Forum gedownloadet?
Ja, ich hatte mir die angehängte Version aus Deinem ersten Beitrag angesehen.

Nunja, Du hast zwar ein paar Zeilen eingerückt, nach System sieht das aber nicht aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for h:=0 to random(15do
  with paintbox1.canvas do
    brush.color:=random($FFFFFF);
    paintbox1.Canvas.Rectangle(random(pw),random(ph),random(pw) div random(rnd),random(ph) div random(rnd));
end;

Liest sich auf dem ersten Blick für mich beispielsweise, als gehöre Zeile 4 mit zur Schleife. :idea:
Da ist noch sehr viel verbesserungsbedarf. Zum Teil hast Du es aber auch schon richtig gemacht. (Z.B. Zeile 330-339, Unit1) :zustimm:

Zu dem Code-Snippet oben: Du tust Dir mit dem with-do Konstrukt keinen Gefallen. Und gerade hier macht das doch bei einer Zeile keinerlei Sinn. :)
benni316 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

Win XP, Win Vista, Win 7, Android
Delphi 7
BeitragVerfasst: Do 04.07.13 23:05 
Ich glaub, da wollte ich sowieso ein "begin" hinschreiben, aber habs dann doch nicht getan?! :D
Hab das jetzt geändert, nun siehts so aus:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
for h:=0 to random(15do
  with paintbox1.canvas do
    begin
      brush.color:=random($FFFFFF);
      Rectangle(random(pw),random(ph),random(pw) div random(rnd),random(ph) div random(rnd));
    end;


Wobei ich diese Funktion sowieso überarbeiten will, damit die Rechtecke nicht immer im Vordergrund sind, aber wie genau ich das regle, überleg ich mir Morgen ;)