tutorials.de Buch-Aktion 05/2012
Seite 2 von 2 ErsteErste 12
ERLEDIGT
JA
ANTWORTEN
24
ZUGRIFFE
18252
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    TobsDi TobsDi ist offline Rookie
    Registriert seit
    May 2008
    Beiträge
    6
    Hmm, ja, sie müssen ja global sein, wenn man sie aus ner anderen Subroutine auch ansprechen kann.
    Beide werden ja hier deklariert:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    public Form1()
            {
                InitializeComponent();
     
                this.list = new List<Point>(); //Liste für Koordinaten instanziieren
                this.bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                pictureBox1.Image = bmp;
            }
    Mein Problem ist, dass ich sie innerhalb der Klasse "Form1" dann auch nur in der Sub "Form1_Load" erreichen kann (ich schätze mal, dass in C# das Ereignis Form1_Load wie oben aussieht). Und nicht in anderen Subs wie z.B. "button1_Click".
    Um aber eine globale Variable zu bekommen, müsste ich die Deklaration eine Stufe höher hinschreiben, also so:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    public partial class Form1 : Form
        {
                this.list = new List<Point>(); //Liste für Koordinaten instanziieren
                this.bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                
               public Form1()
               {
                ...
    Wenn ich es aber so mache, dann hagelt es Fehlermeldungen, weil ich nämlich auf eine Eigenschaft der Picturebox1 zugegriffen hab, obwohl sie noch gar nicht geladen wurde.
    Die geschieht erst mit dem Ereignis "Form1_Load".
    Also hab ich folgendes probiert (auf C# übertragen):
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    public partial class Form1 : Form
        {
                this.list = new List<Point>(); 
                this.bmp = new Bitmap(1,1);    //(1,1), weil (,) nicht funktioniert
                
               public Form1()
               {
                      bmp.width = picturebox1.width;
                      bmp.height = picturebox1.height;
                ...
    Das geht aber wiederum nicht, weil die Eigenschaften "Width" und "Height" des Bitmaps "Readonly", also schreibgeschützt sind.
    Die Lösung wäre deshalb, innerhalb der Sub "Form1_Load" das Bitmap zu deklarieren, aber es wäre dann außerhalb davon eben nicht mehr erreichbar.
    Zu dem "Me": Das stimmt schon, das gibts, es wäre in dem Fall ein Verweis auf die Klasse Form1. Ich hab halt gedacht, das "this" wäre ne Möglichkeit, unter C# in einer Sub eine globale Variable zu deklarieren.

    ODER:
    Ich liege komplett falsch mit der Annahme, dass
    Code :
    1
    2
    3
    4
    
     public Form1()
               {
               ...
               }
    aus C# identisch ist mit
    Code :
    1
    2
    3
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                ...
    End Sub
    aus VB.
    In dem Fall bräuchte ich eine Möglichkeit in VB, erst die Form mit allen Steuerelementen zu laden, und anschließend die Bitmap zu erstellen.

    Ich hoffe, dass ich es ned zu blöd erklärt hab
     

  2. #17
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    prüfe mal ob im Konstruktor die Funktion InitializeComponent(); als erstes aufgerufen wird.
    Code :
    1
    2
    3
    4
    
    public Form1()
               {
                     InitializeComponent();
                     ...
    Dies ist eine vom Designer generierte Funktion und kümmert sich um das erstellen der Objekte und setzen der eingestellten Eigenschaften im Designer.


    Zitat Zitat von TobsDi Beitrag anzeigen
    Hmm, ja, sie müssen ja global sein, wenn man sie aus ner anderen Subroutine auch ansprechen kann.
    Beide werden ja hier deklariert:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    public Form1()
            {
                InitializeComponent();
     
                this.list = new List<Point>(); //Liste für Koordinaten instanziieren
                this.bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                pictureBox1.Image = bmp;
            }
    Nein, das was das ist, ist der Konstruktor. Dort wird nur der Speicher für das Bitmap und die Liste angefordert.

    Deklariert hab ich die Objekte in meinem ersten Codeausschnitt (siehe Seite 1) unten am ende meiner Klasse:
    Code :
    1
    2
    3
    4
    
            private bool mouseDown; //ob Maustaste gedrückt wird (zur Speicherung der Maus koordinaten)
            private readonly List<Point> list; //Mauskoordinaten
            private readonly Bitmap bmp; //Bitmap zum speichern des gezeichneten
        }



    Zitat Zitat von TobsDi Beitrag anzeigen
    ODER:
    Ich liege komplett falsch mit der Annahme, dass
    Code :
    1
    2
    3
    4
    
     public Form1()
               {
               ...
               }
    aus C# identisch ist mit
    Code :
    1
    2
    3
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                ...
    End Sub
    Du liegst falsch.

    Code :
    1
    
     public Form1()
    Dies ist der Konstruktor meiner Klasse, dieser ist im allgemeinen da um Speicher für das Objekt anzufordern.
    http://de.wikipedia.org/wiki/Konstruktor

    Code :
    1
    
    Private Sub Form1_Load
    Ist mehr eine Funktion die einem Ereignis zugeordnet wurde welches aufgerufen wird wenn das Objekt das erste mal geladen wird. (Beachten der Konstruktor wurde schon aufgerufen, Speicher wurde schon angefordert)
    http://de.wikipedia.org/wiki/Ereigni...grammierung%29

    Zitat Zitat von TobsDi Beitrag anzeigen
    In dem Fall bräuchte ich eine Möglichkeit in VB, erst die Form mit allen Steuerelementen zu laden, und anschließend die Bitmap zu erstellen.
    Starte ein neues VB Projekt als Windows Application. Dann müsstest du dort ein erstes Formular Names Form1 sehen. Schaut dir denn dort generierten Code an
    Dann wird dir auffallen das das Form einen Konstruktor hat der die besagte Funktionen InitializeComponent() aufruft.
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  3. #18
    TobsDi TobsDi ist offline Rookie
    Registriert seit
    May 2008
    Beiträge
    6
    Hey! Vielen Dank!
    Wie gesagt, ich bin nochn Anfänger..
    Das mitm Konstruktor hab ich noch gar nicht gewusst; dass man schon vorher Speicher reservieren kann, das is ja Klasse! Das würd einige Probleme erklären, die ich schon früher gehabt hab...
    Wenn ich ne neue WinApp erstell, dann kommt immer bloß
    Code :
    1
    2
    
    Public Class Form1
    End Class
    Nix von nem Konstruktor...
    Aber ich hab die Lösung gefunden (für Leute, dies auch brauchen):
    Man muss es folgendermaßen machen:
    Code :
    1
    2
    3
    4
    5
    6
    
    Public Class Form1
        Sub New()
            InitializeComponent()
            'Hier z.B. die Variablen eintragen
        End Sub
    End Class

    mfg, Tobi
     

  4. #19
    beyoNd beyoNd ist offline Mitglied Silber
    Registriert seit
    Jan 2009
    Beiträge
    81
    Hallo,

    ich weiß das dieses Thema schon Länge her ist aber kann mir dennoch einer sagen
    wie ich das entstande Bild aus dem Source von spike speicher kann ?

    Danke schon mal im voraus
    lg beyoNd
     

  5. #20
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    das Image (Bitmap) Objekt hat eine Methode Save, mit dieser Methode kannst du das Bild als Datei oder in ein Stream speichern.
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  6. #21
    beyoNd beyoNd ist offline Mitglied Silber
    Registriert seit
    Jan 2009
    Beiträge
    81
    Danke!!

    Jetzt noch eine Frage:

    Ich hab es schon versucht aber nicht geschafft . Wie kann ich einen Kreis Zeichnen also ich hab den Source von Spyke womit ich Linien male und dann möchte ich wenn man button1 drückt das er stat einer Linie einen Kreis malt. Sry wenn die frage doof Klinkt aber ich bin totaler anfänger.

    hoffe ihr könnt mir Helfen
    lg beyoNd
     

  7. #22
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hi.

    Als erstes würde ich dich gerne bitten, etwas mehr Zeit in das Verfassen deiner Beiträge zu investieren.

    Zu deinem Problem:

    Mag ja sein, dass du Anfänger bist, aber überleg doch selber mal, wie du das Problem lösen kannst. Diese Tätigkeit gehört zum Lernprozess dazu.
    Kommst du kein bisschen weiter, hast dir dein Ziel vielleicht zu hoch gesteckt.

    Wenn dir hier jemand alles klitzeklein vorbetet, lernst ja auch nichts daraus.

    Hier mal ein paar Fragen die du dir selbst stellen kannst, um vielleicht zu einer Lösung zu gelangen.
    • Wie zeichne ich einen Kreis?
    • Welche Methoden gibts bei der entsprechenden Klasse dafür, und wie unterscheidet es sich vom Zeichnen einer Linie?
    • Welche Daten brauche ich für die entsprechenden Methoden?
    • Start- und Endpunkt? Breite, Höhe? (Kreis oder auch Ellipse?!)
    • Wie könnte ich an diese Daten gelangen?


    lg,.. Alex
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  8. #23
    beyoNd beyoNd ist offline Mitglied Silber
    Registriert seit
    Jan 2009
    Beiträge
    81
    Ich habe mir schon meine gedanken und mehr als 3 Stundeb probiert wie ich es machen koennte und bin zu keinem Ergebnis gekommen. Wenn mir z.B. einer das In den Source reinschreiben kann wie ich malen und Kreise machen kann dann koennte ich mir den alten Source nehmen wo man nur malen kann und kucken was sich veraendert hat etc.. Zudem habe ich dann versucht nur einen Kreis zu malen (mit Hilfe eines Buches) aber mein Problem ist ich bekommen die beiden Programme nicht zu einem. Kann mir dann keiner zeigen wie das geht

    lg beyoNd
     

  9. #24
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    ok du willst jetzt also 2 Unterschiedliche Zeichenzustände abhandeln.
    Da stellt sich natrülich die Frage wie kann man am besten utnerscheiden ob frei Hand oder ein Kreis gezeichnet werden soll.

    Ich hab mich hier für ein Enum entschieden da man dies leicht mit weiteren Zeichenelemente erweitern könnte.
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    
    /// <summary>
    /// beschreibung unserer verfügbaren Zeichenobjekte
    /// </summary>
    enum ZeichenObjekte
    {
            Frei = 0,
            Kreis = 1
    }

    Dann noch eine private globale Variable welche uns sagt welches Objekt wir gerade Zeichnen wollen
    Code csharp:
    1
    
    private ZeichenObjekte currentZeichenObjekt = ZeichenObjekte.Frei; //akt. zu zeichnende Objekt

    Als nächstes habe ich nur die Draw Methode um das Kreis Objekt erweitert
    Code csharp:
    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
    
    /// <summary>
    /// zeichnen
    /// </summary>
    private void Draw(Graphics g)
    {
            if (list.Count > 0)
            {
                    if (currentZeichenObjekt == ZeichenObjekte.Frei)
                    {
                            byte[] bs = new byte[list.Count];
                            bs[0] = (byte)PathPointType.Start;
                            for (int i = 1; i < list.Count; i++)
                                    bs[i] = (byte)PathPointType.Line;
     
                            using (Pen p = new Pen(Color.Black, 5))
                                    g.DrawPath(p, new System.Drawing.Drawing2D.GraphicsPath(list.ToArray(), bs));
                    }
                    else if (currentZeichenObjekt == ZeichenObjekte.Kreis)
                    {
                            //ermittelt der Startpunkte und Endpunkte (list[0] (Maustaste gedrückt) und list[list.Count - 1] (Maustaste losgelassen) da uns in diesem Fall die anderen Punkte nicht interessieren
                            int minX = Math.Min(list[0].X, list[list.Count - 1].X);
                            int maxX = Math.Max(list[0].X, list[list.Count - 1].X);
                            int minY = Math.Min(list[0].Y, list[list.Count - 1].Y);
                            int maxY = Math.Max(list[0].Y, list[list.Count - 1].Y);
     
                            Rectangle rec = new Rectangle(minX, minY, maxX - minX, maxY - minY);
     
                            using (Pen p = new Pen(Color.Black, 5))
                                    g.DrawEllipse(p, rec);
                    }
            }
    }

    Über Buttons kannst du nun einfach die Objekte wechseln
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    private void freiBn_Click(object sender, EventArgs e)
    {
            currentZeichenObjekt = ZeichenObjekte.Frei;
    }
     
    private void kreisBn_Click(object sender, EventArgs e)
    {
            currentZeichenObjekt = ZeichenObjekte.Kreis;
    }
    beyoNd bedankt sich. 
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  10. #25
    beyoNd beyoNd ist offline Mitglied Silber
    Registriert seit
    Jan 2009
    Beiträge
    81
    Vielen, vielen Dank
    Ich werde es sofort ausprobieren

    lg beyoNd
     

Ähnliche Themen

  1. Haare malen
    Von McStanley im Forum Photoshop
    Antworten: 12
    Letzter Beitrag: 17.05.07, 22:46
  2. Unsichtbar malen ?
    Von Alex BDX im Forum Photoshop
    Antworten: 7
    Letzter Beitrag: 04.09.06, 15:12
  3. pictureBox auf PictureBox oder Label
    Von shn im Forum .NET Windows Forms
    Antworten: 1
    Letzter Beitrag: 31.08.05, 16:37
  4. PictureBox über PictureBox
    Von JK_net im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 14.03.05, 09:03
  5. Malen in Picturebox rückgängig machen?
    Von daDom im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 06.06.04, 15:58