AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Polygon ziehen

Ein Thema von Alawvahr · begonnen am 30. Dez 2009 · letzter Beitrag vom 30. Dez 2009
Antwort Antwort
Alawvahr

Registriert seit: 22. Dez 2009
5 Beiträge
 
#1

Polygon ziehen

  Alt 30. Dez 2009, 05:55
Guten Morgen,

ja Probleme sind gelöst, das hier kann jetzt jeder verwenden, der ein Vieleck, wie MS-Paint zeichnen möchte...


hier sind die relevanten Codeauschnitte:


Delphi-Quellcode:
  private
    var Zeichenart : Integer; // damit das Programm weiß welcher button grade geklickt ist
        Stiftart : TPenStyle; // Speichert die Stiftart zwischen
        Pinselart : TBrushStyle; // Speichert die Brushart zwischen
        Zeichnen : Boolean; // legt fest ob bei Mausbewegung gezeichnet werden soll
        Stiftfarbe,Pinselfarbe : TColor; // Farbe von Pinsel(Ausfüllen) und Stift
        x0,y0,x1,y1 : Integer; // ist für das Zeichnen wichtig (x,y Positionen)
...
        Anfangen : boolean; // für Vielecke zeichnen wichtig
        Punktezahl : integer; // für Vielecke zeichnen wichtig
        Punkte : array[0..100] of TPoint; // für Vielecke zeichnen wichtig (theoretisch bis zu einem 100-Eck, ist so gewählt, damit es nie passieren wird, da 100-eck sehr unwahrscheinlich ist
        Punkt : TPoint; // zum Auslesen eines Punktes aus dem Array nötig, da man die Koordinaten nicht direkt bekommt
        Punktezeichnen : array of TPoint; // dynamisches Array ist notwendig fürs Vieleck zeichnen
Delphi-Quellcode:
procedure TForm2.SpeedButton25Click(Sender: TObject); // Vieleck
begin
  Speedbutton25.Down; // Button soll unten bleiben beim Drücken
  Zeichenart := 10; // legt die Zeichenart fest
  Unsichtbar; // Labels und Editfleder unsichtbar machen
end;
Delphi-Quellcode:
procedure TForm2.Image1MouseDown(Sender: TObject; Button: TMouseButton; // Wenn man die Maus über Image1 drückt
  Shift: TShiftState; X, Y: Integer);
  var i,j : integer; // Lokale Zählvariablen
begin
  x := round(x/Zoomfaktor); // wenn das Bild gezoomt ist müssen die Koordinaten entsprechend angepasst werden
  y := round(y/Zoomfaktor); // wenn nicht, dann ist der Faktor = 1
  Zeichnen := true; // Es soll gezeichnet werden
  x0 := x; y0 := y; x1 := x; y1 := y; // X- und Y-Werte merken
  with Image1.Canvas do // Verkürzung
    begin
      Pen.Color := Stiftfarbe; // Pinselfarbe, Style usw übergeben
      Pen.Style := Stiftart;
      Brush.Color := Pinselfarbe;
      Brush.Style := Pinselart;
      case Zeichenart of // if Abfrage mit sehr vielen Möglichkeiten (welche Zeichenart?)
         // zeichenmodus für die einzelenn Zeichenarten festlegen

...

  10: begin
              Pen.Mode := pmNotXor; // Vielecke ( Mode = mit Pixeln verknüpfen)
              if Anfangen = false then
                begin
                  Punkt := Punkte[Punktezahl]; // letzten Punkt auslesen
                  x0:= Punkt.X; // x und y-Wert des letzten Punktes auslesen
                  y0:= Punkt.Y;
                  Moveto(x0,y0);
                  Lineto(x,y);
                end;
            end;

...
Delphi-Quellcode:
procedure TForm2.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, // wenn man die Maus über Image1 bewegt
  Y: Integer);
  var i,j : integer; // Lokale Zählvariablen
begin
  x := round(x/Zoomfaktor); // wenn das Bild gezoomt ist müssen die Koordinaten entsprechend angepasst werden
  y := round(y/Zoomfaktor); // wenn nicht, dann ist der Faktor = 1
  if Zeichnen then
    begin
      with Image1.Canvas do
        begin
          case Zeichenart of // if Abfrage mit sehr vielen Möglichkeiten (wie soll gezeichnet werden?)

...

            10: begin // Vieleck
                   Moveto(x0,y0); // Es wird mit den alten werden gelöscht (durch erneutes Zeichnen)
                   Lineto(x1,y1);
                   Moveto(x0,y0); // Es wird mit den neuen Werten gezeichnet
                   Lineto(x,y);
               end;
...
Delphi-Quellcode:
procedure TForm2.Image1MouseUp(Sender: TObject; Button: TMouseButton; // wenn man die Maustaste über Image1 wieder loslässt
  Shift: TShiftState; X, Y: Integer);
begin
  x := round(x/Zoomfaktor); // wenn das Bild gezoomt ist müssen die Koordinaten entsprechend angepasst werden
  y := round(y/Zoomfaktor); // wenn nicht, dann ist der Faktor = 1
  Zeichnen := false; // nachdem die Maustaste losgelassen wurde soll nicht mehr gezeichnet werden
  with Image1.Canvas do //mit Image1.Canvas tue..
    begin
      Pen.Mode := pmCopy; // das, was nun gezeichnet wird, soll auf Image1 überschrieben werden
      case Zeichenart of // fragt ab, wie gezeichnet werden soll
...
 
        10: begin // Vieleck
              if Anfangen then // wenn man beginnt das Vieleck zu zeichnen (in dem Moment ist es dasselbe, wie ein Linie ziehen)
                begin
                  Moveto(x0,y0); // Es wird mit den alten werden gelöscht (durch erneutes Zeichnen)
                  Lineto(x1,y1);
                  Moveto(x0,y0); // Es wird mit den neuen Werten gezeichnet
                  Lineto(x,y);
                  Anfangen := false; // Erste Linie ist gezogen
                  Punkte := Point(x0,y0); // Ursprungspunkt speichern
                  Punktezahl := Punktezahl + 1; // jetzt gibt es einen Punkt mehr
                  Punkte[Punktezahl] := Point(x,y); // letzten Punkt abspeichern
                end else
                  begin
                    Moveto(x0,y0); // Es wird mit den alten werden gelöscht (durch erneutes Zeichnen)
                    Lineto(x1,y1);
                    Moveto(x0,y0); // Es wird mit den neuen Werten gezeichnet
                    Lineto(x,y);
                    Punktezahl := Punktezahl + 1; // jetzt gibt es einen Punkt mehr
                    Punkte[Punktezahl] := Point(x,y); // letzten Punkt abspeichern
                  end;
            end;

...
Delphi-Quellcode:
procedure TForm2.Image1DblClick(Sender: TObject); // Beim Doppelklick
var i :integer;
begin
  if Zeichenart = 10 then // wenn ein Vieleck gezeichnet wird
    begin
      Lineto(x0,y0); // Letzte Linie, die durch den Doppelklich entstanden ist löschen
                    // es ist immernoch pmNotXor aktiv
      setLength(Punktezeichnen, (Punktezahl)); // Dynamisches Array wird auf die richtige Länge gesetzt
      for i := 0 to Punktezahl - 1 do
        begin
          Punktezeichnen[i] := Punkte[i];
        end;
      with Image1.Canvas do // Verkürzung
        begin
          Pen.Mode := pmCopy; // jetzt fest zeichnen
          Pen.Color := Stiftfarbe; // Pinselfarbe, Style usw übergeben
          Pen.Style := Stiftart;
          Brush.Color := Pinselfarbe;
          Brush.Style := Pinselart;
          Polygon(Punktezeichnen);
          Anfangen := true;
          Punktezahl := 0;
        end;
    end;
end;


mfg

Alex

//edit1: ein Fehler gefunden selten dämlich, aber der übrige ist mir leider komplett schleierhaft
// edit2: code geupdatet genauso verwende ich ihn
// edit3: code geupdatet
//edit4: so funktioniert es jetzt, wie es soll sorry das ich hier nen beitrag schreibe und es dann kurze zeit später selber gelöst bekomme...

und weiter
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Polygon ziehen

  Alt 30. Dez 2009, 09:08
Wäre es nicht sinnvoller, diese Codeschnipsel in eine Klassse zu packen? Damir wird der Code wenigstens wiederverwendbar. Für jede Zeichenart implementierst Du dann eine eigene Klasse, die genau weiss, wie sie sich auf dem Canvas darstellen soll. So kannst du dein Programm beliebig erweitern, ohne das die CASE-Konstrukte irgendwann zu lang werden.

Auch solltest Du dir angewöhnen, deinen Methoden Namen zu geben, die beschreiben, was sie tun. "Unsichtbar" ist so ein Kandidat. "VerbergeSichtbareTexte" würde mir besser gefallen, zumal man dann auf den Kommentar verzichten könnte.

Was bedeutet '10' ? Diese Zahl (irgendwas mit 'Zeichenart') taucht an mehreren Stellen im Code auf. Verwende eine beschreibende Konstante ('CONST'). Dann weiss jeder (und Du auch nach 2 Wochen), was es mit dieser 10 auf sich hat.

Ganz allgemein: Die Kommentare in deinem Code wiederholen sich, sind überflüssig und langweilen.
with Image1.Canvas do //mit Image1.Canvas tue.. Wenn ich eine Variable (z.B. 'Zeichnen' oder 'Zeichenart') erklären muss, dann sollte ich mir einen anderen Namen ausdenken. Anstatt 'Zeichnen' könnte man 'ZeichnenAktiv' verwenden und sich den Kommentar sparen.

Gleiches gilt für die 'Zeichenart'. Wieso heißt das nicht 'ZuZeichnendesObjekt'?

Ach ja: Poste bitte keine Zwischenergebnisse. Verwende dazu lieber einen Blog.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Alawvahr

Registriert seit: 22. Dez 2009
5 Beiträge
 
#3

Re: Polygon ziehen

  Alt 30. Dez 2009, 11:11
Hey,

Ich weiß, das viele Kommentare überflüssig sind, aber ich habe extra bei meinem Lehrer gefragt, ich soll das so machen ansonsten würden da NICHT solche sachen stehen.

Zu dem 10 ich hab es schlecht rauskopiert, ich weiß, was da passiert und weiß es auch in 2 wochen noch, ich arbeite an dem projekt jetzt schon n paar monate und zwischendurch recht lange so gut wie nichts gemacht, ist so beschriftet, dass ich mich problemlos zurechtfinde, bzw ohne Probleme nachvollziehen kann was warum und wie passiert.

Das mit den klassen ist richtig. Hätte ich machen sollen, leider wusste zu dem Zeitpunkt, wo ich mit dem Projekt begonnen habe noch nicht, wie man andere Klassen verwendet, und habe jetzt auch noch Lücken, da ich mich darauf konzentriere das fertig zu bekommen, nächsten Donnerstag Abgabe^^

Zitat:
Ach ja: Poste bitte keine Zwischenergebnisse. Verwende dazu lieber einen Blog.
Das verstehe ich nicht so ganz, was du damit meinst (vllt liegst auch am Schlafmangel^^) ansonsten:

Herzlichen Dank für deine Tipps und Verbesserungsvorschläge, werde ich mir zu Herzen nehmen beim nächsten solchen Projekt, das kann ich dir versichern^^

mfg

alex
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz