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
 
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
 


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 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz