Autor |
Beitrag |
D0P3 F!$H
Gast
Erhaltene Danke: 1
|
Verfasst: Di 17.12.02 18:17
Moin!
In der Schule haben wir die Aufgabe bekommen MSPaint (in einfacher Form ... ist es nicht schon einfach  ) nachzuproggen.
Die Farbauswahl mache ich über ColorDialog.
Mein Problem: Wenn ich keine Standard- sondern eine neue Farbe definieren will (im ColorDialog eine Farbe "mischen") und diese auswähle, dann ist alles, was ich bisher gezeichnet habe weg, wenn es hinter dem Fenster des ColorDialog ist.
Kann ich das irgendwie verhindern?
|
|
Michael Ebner
Hält's aus hier
Beiträge: 13
|
Verfasst: Mi 18.12.02 17:46
Du zeichnest direkt auf das Formular?
Hoffentlich im Ereignis OnPaint.
Oder statt dessen TImage verwenden.
|
|
D0P3 F!$H
Gast
Erhaltene Danke: 1
|
Verfasst: Mi 18.12.02 18:14
Also wir sollten bisher nur machen, dass wir die Strickstärke und die Lininefarbe verändern und Punkt oder Linie auswählen können. Hab ich auch.
Und dann gibts das oben genannte Prob.
Ich mach nix im Ereignis OnPaint oder mit TImage. Unser Lehrer hat mit uns allen am Beamer das Programm Begonnen und dann sollten wir das jeder für sich noch mal schreiben.
Ich poste mal meinen Quellcode: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97:
| unit Paint;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Punkt: TButton; Linie: TButton; Linienstaerke: TButton; Linienfarbe: TButton; Farbauswahl: TColorDialog; procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); procedure PunktClick(Sender: TObject); procedure LinieClick(Sender: TObject); procedure LinienstaerkeClick(Sender: TObject); procedure LinienfarbeClick(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; MausGedrueckt : Boolean = False; ButtonAuswahl : Integer = 2;
implementation
{$R *.dfm}
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin MausGedrueckt := True; Form1.Canvas.MoveTo(X, Y); if (MausGedrueckt) and (ButtonAuswahl = 1) then begin with Canvas do begin Ellipse(X - Pen.Width, Y - Pen.Width, X + Pen.Width, Y + Pen.Width); Brush.Color := clBlack; FloodFill(X, Y, clBlack, fsBorder); end; end; end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin MausGedrueckt := False; end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if (MausGedrueckt) and (ButtonAuswahl = 2) then Canvas.LineTo(X, Y); if (MausGedrueckt) and (ButtonAuswahl = 5) then Canvas.Rectangle(X, Y, Canvas.PenPos.X, Canvas.PenPos.Y); end;
procedure TForm1.PunktClick(Sender: TObject); begin ButtonAuswahl := 1; Punkt.Enabled := False; Linie.Enabled := True; Linienfarbe.Enabled := True; Linienstaerke.Enabled := True; end;
procedure TForm1.LinieClick(Sender: TObject); begin ButtonAuswahl := 2; Linie.Enabled := False; Punkt.Enabled := True; Linienfarbe.Enabled := True; Linienstaerke.Enabled := True; end;
procedure TForm1.LinienstaerkeClick(Sender: TObject); var i : Integer; begin i := StrToInt(Linienstaerke.Caption[Length(Linienstaerke.Caption)]) + 1; if i >= 9 then Dec(i, 8); Linienstaerke.Caption := 'Linienstärke: ' + IntToStr(i); Canvas.Pen.Width := i; end;
procedure TForm1.LinienfarbeClick(Sender: TObject); begin if Farbauswahl.Execute then Canvas.Pen.Color := Farbauswahl.Color; end;
end. | Hoffe, du weisst jetzt besser was ich (in meiner berühmten unzugänglichen Art und Weise) eigentlich erklären wolle.
|
|
D0P3 F!$H
Gast
Erhaltene Danke: 1
|
Verfasst: Do 19.12.02 18:36
Hab die Lösung heute im Unterricht selbst gefunden!
Beim ColorDialog muss im ObjectInspector unter Options cdFullOpen auf true gesetzt werden.
Doch iwe ich gerade sehe, klappt das nur in der Schule, bei mir zu Hause klappt es nicht!
Weiss wer nen Tipp?
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Fr 20.12.02 00:21
D0P3 F!$H hat folgendes geschrieben: | Mein Problem: Wenn ich keine Standard- sondern eine neue Farbe definieren will (im ColorDialog eine Farbe "mischen") und diese auswähle, dann ist alles, was ich bisher gezeichnet habe weg, wenn es hinter dem Fenster des ColorDialog ist.
Kann ich das irgendwie verhindern? |
Zuerst: das ist normal. Bedenke bitte, daß du auf dem Bildschirm zeichnest. Nichts ist so flüchtig wie ein Punkt oder Linie auf dem Bildschirm. Warum? Weil sie überzeichnet werden können. Form-Canvas schützt sein Inhalt nicht. Wenn du auf Form-Canvas zeichnest, dann zeichnest du (mehr oder weniger) direkt auf dem Bildschirm.
Wenn das nicht haben willst, dann mußt du es da (oder so) zeichnen, daß der Inhalt nicht von fremden Objekten gelöscht werden kann.
"da zeichnen" könnte TImage sein. TImage zeichnet zuerst in Puffer-Bitmap und gibt diese dann auf dem Bildschirm aus.
"so zeichnen" könnte TBitmap sein. Du tust dann so als ob du auf der Form-Canvas zeichnen würdest. In Wahrheit zeichnest du zuerst in einer Bitmap und gibt diese dann auf dem Bildschirm aus.
Bei der Ersten Methode brauchst du nichts extra machen. TImage sorgt selbst dafür, daß gelöschte Bildschirmbereiche neu gezeichnet werden. Bei der zweiten Methode mußt du im OnPaint des Formulars ein Draw Befehl haben, der bei Bedarf die Bitmap neu zeichnet.
|
|
D0P3 F!$H
Gast
Erhaltene Danke: 1
|
Verfasst: Sa 21.12.02 11:58
Komisch, bei mir klappts jetzt auch mit dem ColorDialog bei der Option FullOpen := True. Gestern hatte es nie geklappt, obwohl ich zu heute nichts verändert hab! *nixpeil*
@ Popov: Wenn ich Zeit hab kann ich deine Vorschläge mal ausprobieren, aber die Schulaufgabe war, dass wir auf die Form zeichnen sollen. Lustigerweise dürfen wir alles andere (Farbauswahl, Strickdicke, Werkzeuge wie Kreis, Radierer usw.) so programmieren wie wir es wollen.
Naja, sind halt Lehrer ... 
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: So 22.12.02 01:59
Dann hast du nicht verstanden was ich geschreiben habe. Das ist kein DOS wo es ein Fenster gibt und dir keiner etwas drüberzeichnen kann. Wenn du in Windows auf dem Formular zeichnest, dann kann dieser Bereich jeder Zeit von einen anderen Fenster gelöscht werden. Das hat mit Einstellungen nichts zu tun, das ist so. Die Begründung hab ich oben geschreiben. Entweder nutzt man eine Pufferbitmap oder man zeichnet alles bei Form-Repaint sofort nach. Die erste Methode nutzt z.B. PaintBrush. Das Bild ist immer im Puffer und zeichnet beim Bedarf die gelöschen Flächen nach. Die zweite Methode wird von den Kompnenten benutzt. War ein Fenster im Hintergrund und wird es nach vorne geholt, so sind alle vorher verdeckten Bereiche leer. Das Formular sendet dann an alle seine Komponenten die Anweisung sich selbst neu zu zeichnen. Das geht so schnell, daß du davon garnichts mitbekommst. Es ist aber so.
Dein auf dem Formular gezeichnetes Bild hat aber kein Puffer und kein Repaint. Deshalb kann es sich nicht automatisch wieder hestellen.
Wenn es aber heute klappt was gestern nicht geklappt hat, so ist dein Programm nicht so wie du es beschreiben hast.
|
|
D0P3 F!$H
Gast
Erhaltene Danke: 1
|
Verfasst: So 22.12.02 10:55
@ Popov: Warum meinst du, ich habe nicht verstanden, was du geschrieben hast?
Ich habe in meinem Programm von Donnerstag in der Schule auf Freitag und Samstag nichts verändert!
In der Schule hat es, nachdem ich die Eigenschaft FullOpen des ColorDialogs auf True gesetzt hab, immer funktioniert.
Zu Hause hab ich einfach das Programm aus der Schule, das ich auf Diskette gezogen hatte, auf meinen Rechner kopiert. Obwohl ich nach der Schule nichts verändert habe, hat es am Freitag nicht funktioniert.
Seitdem ich das Programm am Samstag nochmal gestartet hatte, um zu gucken, ob es jetzt funktioniert, läuft es perfekt.
Es gab bei uns in der Schule aber schon häufiger zu Problemen mit Delphi. Was auf dem einen Rechner klappte, hat auf dem anderen nicht funktioniert, obwohl das Programm völlig identisch war.
Aber ich denke nicht, dass das die Ursache für die "Fehlfunktion" meines Programms ist.
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: So 22.12.02 12:00
Ich bin jetzt hier keinem böse, habe aber langsam das Gefühl, daß ich hier als der schlechtlauniger Popov angesehen werde.  Ist alles Spaß. Nur sind manchmal meine Beiträge direkt. Dann muß man das einfach überlesen.
Zurück zum Thena:
Glaube ich nicht. Ich meine mit dem: "Jetzt funktioniert es". Nicht bei dem Quellcode. Das was gezeichnet wurde wird gelöscht wenn sich der Dialog öffnet.
|
|
Ist die Frage beantwortet? Das Problem gelöst?
Dann klicke hier, um das Thema entsprechend zu markieren!
|
|