Thema: Delphi Polygon ziehen

Einzelnen Beitrag anzeigen

Alawvahr

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

Polygon ziehen

  Alt 30. Dez 2009, 04: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