Forum: PC-Programmierung C#: extern-Befehl


von Toadie R. (marcel_r)


Lesenswert?

Moin, habe folgende Klasse:
1
  public partial class MainForm : Form
2
  {
3
    public CanPortAsync canPort;
4
    public CanPort port;
5
    public CanMessage cmsg = new CanMessage();
6
    ....

und möchte cmsg in einer anderen Klasse verwenden. Mit 'extern cmsg;' 
funktioniert das nicht. Was muss ich tun?

von Peter II (Gast)


Lesenswert?

Marcel R. schrieb:
> und möchte cmsg in einer anderen Klasse verwenden. Mit 'extern cmsg;'
> funktioniert das nicht. Was muss ich tun?
deine Frage verständlich Formulieren - ich habe keine Ahnung was du 
meinst.

von Toadie R. (marcel_r)


Lesenswert?

Ich habe cmsg als Message da definiert, wo ich den CAN-Zugriff 
initalisiere. Den Write-Befel habe ich aber als Funktion in einer 
anderen Datei und Klasse. Jetzt muss ich doch irgendwie wie bei globalen 
Variablen (z.B. extern int bla") die cmsg in der anderen Klasse 
einbinden.

von Peter II (Gast)


Lesenswert?

Marcel R. schrieb:
> Ich habe cmsg als Message da definiert, wo ich den CAN-Zugriff
> initalisiere. Den Write-Befel habe ich aber als Funktion in einer
> anderen Datei und Klasse. Jetzt muss ich doch irgendwie wie bei globalen
> Variablen (z.B. extern int bla") die cmsg in der anderen Klasse
> einbinden.

ich versteht immer noch nicht genau, warum gibt du dem Write nicht als 
Parameter das cmsg mit?
Ich glaube du hast den Objektorientierten Ansatz noch nicht verstanden, 
sotwas wie globale Variabeln machen keinen Sinn und führen eh meist zu 
problemen.
Man könnte auch Methoden die ohne Objekt sind als Static deklarieren 
dann kann man sie einfach so aufrufen.

Zeige etwas mehr von den Code, eventuell kann man da noch etwas machen.

von Toadie R. (marcel_r)


Lesenswert?

Hier gibts Code:

Die Methode can_write möchte ich woanders auslagern (in eine andere 
Datei)
1
using System;
2
using System.Text;
3
using System.IO;
4
using Esd.IO.Ntcan;
5
using System.Windows.Forms;
6
using canuir;
7
8
namespace canuir
9
{
10
11
    public partial class MainForm : Form
12
    {
13
        CanPortAsync canPort;
14
        CanPort port;
15
        CanMessage cmsg = new CanMessage();
16
            
17
        public MainForm()
18
        {
19
            InitializeComponent();
20
        }
21
22
        void Button1Click(object sender, System.EventArgs e)
23
        {
24
            canPort = new CanPortAsync(0);
25
            
26
            port = new CanPort(0, CanPortMode.FifoMode, 1000, 1000, 512, 3000);
27
            port.Open();
28
            port.BitRate = new CanBitRate(CanBitRateTable.Cia500KBit);
29
            
30
            try
31
            {
32
                canPort.Open();
33
            }
34
            catch (IOException)
35
            {
36
                MessageBox.Show("!! CAN Netz 0 ist nicht verfügbar !!", "Fehler");
37
                return;
38
            }
39
40
            canPort.BitRate = new CanBitRate(CanBitRateTable.Cia500KBit);
41
            progressBar1.Minimum=0;
42
            progressBar1.Maximum=2047;
43
            for (int id = 0; id < 2047; id++)
44
            {
45
                canPort.AddToMessageFilter(CanMessageType.Data, id);
46
                progressBar1.Value=id+1;
47
                progressBar1.Refresh();
48
            }
49
            progressBar1.Visible=false;
50
            
51
            canPort.AddToMessageFilter(CanMessageType.ExtendedData, 0);
52
            canPort.AddHandler(OnCanData);
53
54
            listBox1.Items.Add("CAN init");
55
            listBox1.SelectedIndex = listBox1.Items.Count - 1;
56
57
        }
58
        
59
        void OnCanData(ref CanMessage[] cmsgArray, ref Int32 entries)
60
        {
61
            for(int i = 0; i < entries; i++)
62
            {
63
                setzen(cmsgArray[i]);
64
            }
65
        }
66
           
67
        void setzen(CanMessage daten)
68
        {
69
            listBox1.Invoke (new EventHandler(versuch), new object[]{daten, null});
70
        }
71
                
72
        void SendClick(object sender, EventArgs e)
73
        {        
74
            can_write(0,2,0x01,0x00,0,0,0,0,0,0);            
75
        }
76
        
77
        
78
        void Button2Click(object sender, EventArgs e)
79
        {
80
            if (canPort.IsOpen)
81
            {
82
                canPort.RemoveHandler(OnCanData);
83
                canPort.Close();
84
            }    
85
            if (port.IsOpen)
86
            {
87
                port.Close();
88
            }
89
        }
90
        
91
        public void can_write(int id, byte len, byte d1, byte d2, byte d3, byte d4, byte d5, byte d6, byte d7, byte d8)
92
        {
93
            
94
            cmsg.Identifier = id;
95
            cmsg.DataLength = len;
96
            cmsg[0]=d1;
97
            cmsg[1]=d2;
98
            cmsg[2]=d3;
99
            cmsg[3]=d4;
100
            cmsg[4]=d5;
101
            cmsg[5]=d6;
102
            cmsg[6]=d7;
103
            cmsg[7]=d8;
104
            port.Write(ref cmsg);
105
        }
106
107
    }
108
}

von user (Gast)


Lesenswert?

Stichwort Getter/Setter-Methoden

von Matthias (Gast)


Lesenswert?

Das schaut alles etwas Prozedural aus. Normalerweise sollte man GUI und 
Funktion trennen. Also einfach eine Klasse für deine CAN Geschichten 
machen und die Funktionen als Public deklarieren. Dann kannst aus der 
GUI Klasse (MainForm) die entsprechenden Funktionen einfach aufrufen.

Gruß
Matthias

von bluppdidupp (Gast)


Lesenswert?

Marcel R. schrieb:
> und möchte cmsg in einer anderen Klasse verwenden. Mit 'extern cmsg;'
> funktioniert das nicht. Was muss ich tun?

Gibt das cmsg-Objekt beim erzeugen der anderen Klasse einfach als 
Konstruktur-Parameter mit.

Fusch-Lösung: cmsg static machen, dann kann in der anderen Klasse über 
MainForm.cmsg drauf zugegriffen werden

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.