Autor Beitrag
Medicide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Sa 29.11.08 19:10 
hey, leute
ich habe da so ein problem
wir sollen für die schule in informatik ein kleines minipaint programieren. So ich habe bereits die farbpalette, radieren, freihandzeichnen, löschen, die dicke des stifts, speichern und öffnen einprogramiert . Dies reicht aber noch nciht ganz, ich würde gerne noch quadrate zeiehn können, kreise, ellipsen und so aber ich weiß dass es sehr schwer sien soll. Deswegen was einfacheres was ich leider iwie nciht hinbekomme:
ich möchte gerne eine gummilinie (s heißt das, habe ich gelesen) zeichen können. Was ich damit meine ist, das programm soll sich den punkt (X,Y) merken an dem ich die linke maustaste drücke, von da an soll er eine gerade linie zeichnen aber nur so weit ich die maus bewege und gedrückt habe. Wenn ich die maustatse loslasse soll die linie von dem anfangspunkt bis hin zu dem punkt an dem ich die maustaste losgelassen habe gezeichnet werden.
Hoffe ihr könnt mir helfen

Gruß daniel
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 29.11.08 19:18 
Ich nehme an das hier meinst du? Bezierkurven?
www.delphipraxis.net/topic99285.html

Oder willst du einfach nur eine gerade Linie ziehen? Da wüsste ich jetzt nicht was du mit Gummilinie meinst.
Medicide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Sa 29.11.08 19:23 
ich möchte einfach nur eine gerade linie zeichnen...natürlich aber mit der maus gezogen
den begriff "gummilinie" habe ich gefunden als ich mal gegooglet habe..aber dies nicht verstanden habe
eine einfach gerade linie soll es sein
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 29.11.08 19:34 
Dann musst du nur in OnMouseDown die Koordinaten x und y als Zeichenposition setzen.
In OnMouseUp kannst du dann eine Linie von den gespeicherten Koordinaten zu den aktuellen machen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm86.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Canvas.MoveTo(X, Y);
end;

procedure TForm86.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Canvas.LineTo(X, Y);
end;


Zusätzlich könntest du auch in OnMouseMove die Linie wie sie beim Loslassen gezeichnet würde zeichnen, aber erstmal reicht es ja beim Loslassen zu zeichnen. Um beim Ziehen die aktuelle Linie zu zeichnen müsstest du in OnMouseDown eine Boolean-Variable auf True setzen, die dir anzeigt, dass die Maustaste gedrückt ist, dazu die Koordinaten. In OnMouseMove kannst du dann wenn die Maustaste gedrückt ist die alte Linie löschen und die neue zeichnen. Dafür musst du auch die letzten Koordinaten von OnMouseMove speichern.
Medicide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Sa 29.11.08 19:45 
vielen dank schonmal dafür...
aber das andee versteh ich gard nicht: du meinst dass mann die linie sieht wenn man die maus gedrückt bewegt ne?
ok das wäre gut wenn ich dass dann noch machen würde...probier gleich mal aus
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Sa 29.11.08 21:41 
und was deine Kreise und Rechtecke angeht, kannst du genauso per OnMouseDown und OnMouseUp die Koordinaten speichern und dann den Kreis oder Rechteck mit Canvas.Ellipse oder Canvas.Rectangle zeichnen.

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Medicide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 02.12.08 19:56 
hey
dankeschön

ich hätte da noch ne bitte
ich möchte jetzt auch noch das, was ich in meinem image gemalt habe drucken
ich habe das mal so ausgetestet:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.PrintClick(Sender: TObject);
begin
If printdialog1.Execute then
  TRY
    Printer.BeginDoc; //Startet ein neues Dokument
    Printer.Enddoc; //Beendet das aktuelle Dokument: der Druckborgang beginnt
    Printer.Newpage; //Beginnt eine neue Seite
  EXCEPT
    showmessage ('Fehler beim Drucken der Datei!');
  End;
end;


hat aber nciht wirklich funktioniert...könnt ihr mir da helfen?

Moderiert von user profile iconGausi: B- durch Delphi-Tags ersetzt
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 02.12.08 19:57 
warum nicht funktioniert?
Welche Fehlermeldung?
Medicide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 02.12.08 20:00 
also fehlermeldung kommt nur an meinem pc (der keinen drucker hat :-P)
habe des aber dann an einem anderen pc (wo ein drucker angeschlossen ist und aug eig funktioniert)....doch da hat der dann einfach cniht gedruckt

es kam dann die meldung die angezeigt werden sollte ( habe ich ja selbst einprogrammiert:

Fehler beim Drucken der Datei!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 02.12.08 20:07 
Naja, schau mal was du machst:
1. BeginDoc --> "Heft" aufschlagen zum Schreiben
2. EndDoc --> Heft zumachen und zum Drucken abgeben
3. NewPage... öhm, neue Seite? Von was? Das Heft (Dokument) ist doch schon abgeschickt und geschlossen.

Zwischen BeginDoc und EndDoc solltest du auch was zu Druckendes dem Druckdokument hinzufügen, dass sonst nix passiert ist irgendwie klar.
Du gehst zur Druckerei und sagst: "Druck mal folgendes, ich fange an... (Schweigen) ...ja, das war alles" ;-)
Medicide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 02.12.08 20:11 
aso...uups
muss ich also das Printer.Enddoc; und da dann sowas wie:
ausblenden Delphi-Quelltext
1:
Image1.print;					

reinschreiben oder so?

Moderiert von user profile iconGausi: B- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 02.12.08 20:13 
Medicide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 02.12.08 20:25 
thx
aber

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.PrintClick(Sender: TObject);
Var
  Rect:TRect;
Begin
  Printer.BeginDoc;
  With Printer.Canvas Do
    Rect:=Bounds(0,0,Printer.PageWidth div 2, Printer.PageHeight div 2);
    StretchDraw(Rect, Image1.Picture.Bitmap);
  End;
  Printer.Enddoc;
End;


kennt der nciht : [Fehler] paint.pas(134): Undefinierter Bezeichner: 'StretchDraw'

Moderiert von user profile iconGausi: B- durch Highlight-Tags ersetzt
Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 02.12.08 20:27 
:shock: , ich hatte mir den Code nicht genauer angeschaut, da haben die doch glatt ein begin vergessen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.PrintClick(Sender: TObject);
Var
  Rect:TRect;
Begin
  Printer.BeginDoc;
  With Printer.Canvas Do
  begin
    Rect:=Bounds(0,0,Printer.PageWidth div 2, Printer.PageHeight div 2);
    StretchDraw(Rect, Image1.Picture.Bitmap);
  end;
  Printer.Enddoc;
End;
Medicide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 02.12.08 20:40 
ich bedanke mch schonmal für dein bemühen
aber könntest du mir die fettgedruckten sachen mal erklären also was das programm da jetzt genau machtund so halt...wäre super nett:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.PrintClick(Sender: TObject);
Var
  Rect:TRect;
Begin
printdialog1.Execute;
  Printer.BeginDoc;
  With Printer.Canvas Do
  begin
    Try
      Rect:=Bounds(0,0,Printer.PageWidth div 2, Printer.PageHeight div 2);
      StretchDraw(Rect, Image1.Picture.Bitmap);

    Except
      showmessage ('Fehler beim Drucken der Datei!');
  End;
  Printer.Enddoc;
end;


Moderiert von user profile iconGausi: B- durch Highlight-Tags ersetzt
Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 02.12.08 20:52 
Rect ist ein Rechteck, in diesem Fall gibt es an in welchen Bereich gedruckt werden soll. StretchDraw zeichnet das angegebene Bild auf die Leinwand, in diesem Fall auf die des Druckers und passt die Größe dabei an das angegebene Rechteck an.

Was soll das try..except denn dauernd? Wenn überhaupt tritt ein Fehler (kein Drucker installiert) nicht an der Stelle auf, zudem sollte man try..except nur im Notfall verwenden, wenn es anders eben nicht geht. Hier kannst du aber einfach mit Printer.Printers.Count die Anzahl der installierten Drucker am Anfang abfragen und ggf. einen Fehler anzeigen, wenn die Anzahl 0 ist.

Das with sorgt dafür, dass man Befehle aus dem angegebenen Objekt benutzen kann ohne es erneut hinzuschreiben, aber das ist ohnehin kein guter Programmierstil.

So sieht es anders geschrieben aus, statt Bounds zu benutzen kann man die Grenzen des Rechtecks auch einzeln zuweisen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
  Rect: TRect;
Begin
  if Printer.Printers.Count = 0 then
    ShowMessage('Kein Drucker installiert!');
  if not PrintDialog1.Execute then
    Exit;
  Printer.BeginDoc;
  Rect.Left := 0;
  Rect.Top := 0;
  Rect.Right := Printer.PageWidth div 2;
  Rect.Bottom := Printer.PageHeight div 2;
  Printer.Canvas.StretchDraw(Rect, Image1.Picture.Bitmap);
  Printer.Enddoc;


F1 drücken, wenn der Textcursor in einem Befehl ist, ist auch eine Idee, die Hilfe von Delphi ist gar nicht so schlecht. ;-)
Medicide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 02.12.08 21:45 
danke....klappt jetz alles und ahbe es auch halbwegs verstanden..guck ich mir einafch nochmal an