-
Hmm, ja, sie müssen ja global sein, wenn man sie aus ner anderen Subroutine auch ansprechen kann.
Beide werden ja hier deklariert:
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".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; }
Um aber eine globale Variable zu bekommen, müsste ich die Deklaration eine Stufe höher hinschreiben, also so:
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.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() { ...
Die geschieht erst mit dem Ereignis "Form1_Load".
Also hab ich folgendes probiert (auf C# übertragen):
Das geht aber wiederum nicht, weil die Eigenschaften "Width" und "Height" des Bitmaps "Readonly", also schreibgeschützt sind.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; ...
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
aus C# identisch ist mitCode :1 2 3 4
public Form1() { ... }
aus VB.Code :1 2 3
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ... End Sub
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
-
prüfe mal ob im Konstruktor die Funktion InitializeComponent(); als erstes aufgerufen wird.
Dies ist eine vom Designer generierte Funktion und kümmert sich um das erstellen der Objekte und setzen der eingestellten Eigenschaften im Designer.Code :1 2 3 4
public Form1() { InitializeComponent(); ...
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 }
Du liegst falsch.
Dies ist der Konstruktor meiner Klasse, dieser ist im allgemeinen da um Speicher für das Objekt anzufordern.Code :1
public Form1()
http://de.wikipedia.org/wiki/Konstruktor
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)Code :1
Private Sub Form1_Load
http://de.wikipedia.org/wiki/Ereigni...grammierung%29
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.
-
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ß
Nix von nem Konstruktor...Code :1 2
Public Class Form1 End Class
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
-
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
-
das Image (Bitmap) Objekt hat eine Methode Save, mit dieser Methode kannst du das Bild als Datei oder in ein Stream speichern.
-
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
-
20.03.09 20:09 #22
- 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,.. AlexWith 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
-
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
-
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; }
-
Vielen, vielen Dank
Ich werde es sofort ausprobieren
lg beyoNd
Ähnliche Themen
-
Haare malen
Von McStanley im Forum PhotoshopAntworten: 12Letzter Beitrag: 17.05.07, 22:46 -
Unsichtbar malen ?
Von Alex BDX im Forum PhotoshopAntworten: 7Letzter Beitrag: 04.09.06, 15:12 -
pictureBox auf PictureBox oder Label
Von shn im Forum .NET Windows FormsAntworten: 1Letzter Beitrag: 31.08.05, 16:37 -
PictureBox über PictureBox
Von JK_net im Forum .NET ArchivAntworten: 1Letzter Beitrag: 14.03.05, 09:03 -
Malen in Picturebox rückgängig machen?
Von daDom im Forum Visual Basic 6.0Antworten: 2Letzter Beitrag: 06.06.04, 15:58



2Danke

Zitieren

Login





