Autor Beitrag
prog_1
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Fr 03.06.11 20:01 
Hallo

Bei einem Programm das ich schreiben habe ich folgendes Problem: Eine Form(Form1) übergibt eine string Variable an eine übergeordnete Klasse (Objekt1 enthält Form1 und Form2), wenn in Form1 das ButtonClick Ereignis ausgelöst wird. Anschließend verarbeitet Form2 die string Variable.
Leider funktioniert dieser Ansatz nicht. Wenn ich die string Variable im Event Handler (Form1.ButtonClick) übergebe, und dann Form1 schließe, löscht sich Form1 selbst, logisch, es gibt keinen Wert für die string Variable.

Nach einigem Suchen im www, habe ich den Ansatz gefunden mit einer übergeordneten Klasse zu arbeiten (die Klasse enthält Form1 und Form2).

Ich denke, dass ich dann wieder das selbe Problem habe.

Vielleicht weiss jemand Rat?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 04.06.11 10:03 
Hallo,

so ganz verstehe ich nicht, was du jetzt programmiert hast (evtl. etwas Code wäre hilfreich ;-)

Die klassische Weitergabe von Variablen an andere Forms (oder auch Klassen) basiert auf der Abhängigkeit der beiden Forms zueinander:
- Übergeordnete Form gibt Daten an untergeordnete Form (SubForm) weiter: Konstruktor bzw. Eigenschaft benutzen
- Untergeordnete Form möchte Daten an aufrufende Form zurückgeben: Eigenschaft oder Ereignis benutzen

Ich habe dazu extra einen ausführlichen Artikel verfaßt: Kommunikation von 2 Forms
casban
Hält's aus hier
Beiträge: 10

Window 8.1 Professional
C# (VS 2013 Ultimate Edition)
BeitragVerfasst: So 12.08.12 10:58 
Hallo Th69,
das ich noch nicht lange dabei bin und machne Sachen noch nicht verinnerlicht habe ,erbitte ich hier etwas Hilfe, bzw. Tipps :-)

ich habe eben den Artikel über Kommunikation von Form2 gelesen, und erhat mir auch schon bei einen Problem geholfen. Ich habe aber noch das Problen ,das ich eine aktuelle Farbe auf Form2 anzeigen lassen möchte. Diese Farbe ist früher schon über einen colorDialog ermittelt worden und einer Methode speichernEinstellungen gespeichert worden. Auf pictureBox1 in Form1 klappt das mit der aktuellen Farbe auch, sodas ich mit dergewählten Farbe zeichnen kann, aber ich bekomme diese Farbe dann nicht auf Form2.

Anbei etwas Quelltext:

Danke schon mal im Vorraus und Grüße aus Vlotho

Carsten

Moderiert von user profile iconTh69: Full-Quote entfernt
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 12.08.12 13:25 
Hallo casban :welcome:

leider kann ich deinen angehängten Quelltext hier nicht lesen, da ich auf dem Internetrechner kein Word installiert habe. Besser wäre es, wenn du den relevanten Quellcode direkt hier postest (in die dafür vorgesehenen C#-Code Tags [ cs ] ... [ /cs ] - ohne die Leerzeichen).

Bezogen auf dein beschriebenes Problem mußt du der Form2-Klasse eine Eigenschaft vom Typ Color geben und dann diesen Wert setzen (ich nehme mal an, daß Form2 von Form1 aus aufgerufen wird):
ausblenden C#-Quelltext
1:
2:
3:
Form2 form2 = new Form2();
form2.MyColor = currentColor; // Eigenschaft setzen
form2.Show(); // bzw. ShowDialog()

(selbstverständlich solltest du bessere Namen als Form2 oder form2 in deinem Quellcode wählen ;-))

Grüße aus Bielefeld
casban
Hält's aus hier
Beiträge: 10

Window 8.1 Professional
C# (VS 2013 Ultimate Edition)
BeitragVerfasst: Mo 13.08.12 21:59 
Hallo

Ich habe alle Werte im Konstruktor übergeben, und auch das erreicht was ich erreichen wollte, nämlich das ich ein Rechteck füllen kann mit der aktuellen Farbe.
Jetzt habe ich ein anderes Problem. Ich habe ja die übergebenen Variablen von Form1 an Form2 übergeben und möchte eine Linie in der Methode
Form2_Paint zeichnen lassen,aber ich bekomme die Variablen einfach nicht in die Methode.

Anbei ein wenig Code;

Konstruktor Form1
ausblenden C#-Quelltext
1:
2:
Form2 öffne = new Form2(fuellung,stift.DashStyle,stift.Width, pinsel.Color, musterPinsel);
öffne.ShowDialog();

Form2
ausblenden volle Höhe C#-Quelltext
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:
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Zeichnen2
{
    public partial class Form2 : Form
    {
        public Form2(bool fuellung, System.Drawing.Drawing2D.DashStyle stiftmuster, float Stiftbreite, Color pinselfarbe, System.Drawing.Drawing2D.HatchBrush muster)
        {
            InitializeComponent();

            if (fuellung == false)
            {
                pictureBox1.BackColor = pinselfarbe;//
            }
        }
        
        public void Form2_Paint(object sender ,PaintEventArgs e)
        {
            Pen Stift = new Pen(Color.Black, 1);
            e.Graphics.DrawRectangle(Stift, 2020100100);            
        }
    }
}


Moderiert von user profile iconTh69: Full-Quote entfernt.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 13.08.12 23:11 
Bringt dir nicht viel, die Objekte im Konstruktor zu verlangen und dann einfach im Nichts verschwinden zu lassen, oder? ^^

Du musst die schon zwischenspeichern, einfach als private Variable in der Klasse.
Im Konstruktor weist du die Parameter dann entsprechend den Variablen zu und kannst dann die Daten auch in der Methode nutzen.

Für diesen Beitrag haben gedankt: casban
casban
Hält's aus hier
Beiträge: 10

Window 8.1 Professional
C# (VS 2013 Ultimate Edition)
BeitragVerfasst: Di 14.08.12 08:31 
user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Bringt dir nicht viel, die Objekte im Konstruktor zu verlangen und dann einfach im Nichts verschwinden zu lassen, oder? ^^

Du musst die schon zwischenspeichern, einfach als private Variable in der Klasse.
Im Konstruktor weist du die Parameter dann entsprechend den Variablen zu und kannst dann die Daten auch in der Methode nutzen.



quasi so:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public Form2(bool fuellung, System.Drawing.Drawing2D.DashStyle stiftmuster, float Stiftbreite, Color pinselfarbe, System.Drawing.Drawing2D.HatchBrush muster)
        {
            InitializeComponent();
            bool fuellungForm2=fuellung;
            System.Drawing.Drawing2D.DashStyle StiftMusterForm2= stiftmuster;
            float StiftbreiteForm2=Stiftbreite;
            Color PinselfarbeForm2=pinselfarbe;
            System.Drawing.Drawing2D.HatchBrush musterForm2= muster;
             if (fuellung == false)
            {
                pictureBox1.BackColor = pinselfarbe;
            }
        }
casban
Hält's aus hier
Beiträge: 10

Window 8.1 Professional
C# (VS 2013 Ultimate Edition)
BeitragVerfasst: Di 14.08.12 22:15 
Juhu geschafft :dance:

nachdem ich die Variablen aus Form1 über den Konstruktor an Form2 übergeben habe , musste ich nur noch die Variablen (aus Form1)
als Klassenvariable vereinbaren und schon hat alles geklappt.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
Form1

        private void infoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 öffne = new Form2(stift, fuellung, pinsel, musterPinsel);
            öffne.ShowDialog();
        }


ausblenden volle Höhe C#-Quelltext
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:
33:
34:
35:
Form2

    public partial class Form2 : Form
    {
        Pen StiftForm2;
        SolidBrush pinselForm2;
        bool fuellungForm2;
        System.Drawing.Drawing2D.HatchBrush musterForm2;

        public Form2(Pen stift, bool fuellung, SolidBrush pinselfarbe, System.Drawing.Drawing2D.HatchBrush muster)
        {
            InitializeComponent();
            this.StiftForm2 = stift;
            this.pinselForm2 = pinselfarbe;
            this.fuellungForm2 = fuellung;
            this.musterForm2 = muster;

        }

        public void Form2_Paint(object sender, PaintEventArgs e)
        {
            Pen Stift = new Pen(Color.Black, 1);
            e.Graphics.DrawRectangle(Stift, 2020100100);
            e.Graphics.DrawLine(StiftForm2, 20145120145);
            if (fuellungForm2 == false)
            {
                e.Graphics.FillRectangle(pinselForm2, 21219999);
            }
            else
            {
                e.Graphics.FillRectangle(musterForm2, 21219999);
            }
        }
    }
}
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mi 15.08.12 00:19 
Genau so macht man das. ^^

Aber vielleicht solltest du dir wirklich erst einmal den Artikel von Th69 durch lesen, da lernst du auch noch einige andere Techniken zur Kommunikation zwischen Fenstern.

Allerdings vermute ich, dass du da Probleme haben wirst, die Grundkenntnisse betreffend.
Ich verlinke ja immer wieder gerne dieses Buch. Damit habe ich den Großteil meines Wissens gelernt und vorheriges Wissen sehr gefestigt. Es lohnt sich wirklich und es ist komplett kostenlos, also warum nicht? ^^

Auch hat mir mal jemand wegen der Abneigung gegen so ein dickes Buch gesagt, dass das Programmieren so erst richtig Spaß macht, weil man auf diese Weise viele nützliche und tolle Techniken kennen lernt und gleich ausprobieren kann.
Auch macht es viel mehr Spaß, wenn man nicht immer nach Hilfe suchen und fragen muss, nur um dann viele Dinge nicht zu verstehen.

Also lies es dir durch, du lernst C# allgemein, XML, XAML und damit auch WPF bis sogar 2D-Grafik, ADO.Net (Datenbank-Anbindung), LINQ to Objects/SQL bis zu Setups mit Visual Studio. Sogar Multi-Threading wird erklärt.

Es gibt noch mehr Techniken, aber was C# angeht, kannst du danach alles um völlig alleine weiter zu machen.


Ich wünsche noch viel Programmier-Spaß ^^
Icedragon2k
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 14.08.16 19:52 
Hallo zusammen,

ich habe leider bei diesem Teil ein Problem.

Ich habe den Quellcode genauso geschrieben, aber in meiner Form2 wird nichts angezeigt (bleibt einfach leer).
Müssen dort noch gewisse Felder angelegt werden ?

Vielen Dank für die Hilfe vorab.

MfG

Icedragon2k

PS: Habe meinen Fehler gefunden, hätte nur die Picturebox vorher generieren müssen. :)