Autor Beitrag
Ivy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Mi 15.08.12 10:34 
Guten Morgen,
ich erstelle controls zur Laufzeit bzw beim start des Programms. NUn möchte ich den einzelen Controls ein Ergeinis zuweisen und dieses aufrufen. Wie kann ich das während der Laufzeit machen? Ich kann die ergnisse ja nicht schon davor im code festlegen, sie existieren bis dort hin ja nicht. irgendwie steh ich auf dem schlauch...

danke lg
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 15.08.12 10:40 
ausblenden C#-Quelltext
1:
MeinControl.MeinEvent += MeineMethode;					


und abhängen dann mit -= (wenn nötig)

Wenn du bisher das nur per Designer gemacht hast wage einfach mal einen Blick in die Designer.cs Datei zu deinem Formular. Da wirst du entsprechenden Code finden und dir besser vorstellen können was da eigentlich passiert.
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Mi 15.08.12 10:49 
okay habs jetzt so gemacht, aber dann wird nur eine einzige feste funktion erstellt. ich nummeriere meine controls aber durch mit einer schleife und somit ist der name variabel. jedes muss dann dieses ereignis haben mit seiner nummer
ausblenden C#-Quelltext
1:
digitalIoControls[i].StateChanged += DigitalIoControlStateChanged;					


ich hoffe das ist einigermaßen verständlich, weiß nicht wie ich es richtig beschreiben soll :D
also rein theoretisc h sollte so aussehen:
ausblenden C#-Quelltext
1:
digitalIoControls[i].StateChanged += DigitalIoControl+[i]+StateChanged;					

aber dann kann ich vor laufzeit beginn die funktion nicht schon aufrufen da sie ja nicht existiert. das ist alles ein teufelskreis :-/
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 15.08.12 11:09 
Wie unterscheiden sich die Funktionen denn? Kannst Du nicht eine schreiben, de alles behandeln kann, indem sie schaut, von "wem" sie aufgerufen wird?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Mi 15.08.12 11:17 
ja das habe ich auch schon überlegt, dass ich einfach alles in dieser einen funktion abarbeite. aber ich weiß nicht wie ich die einzelnen elemente aufrufen soll. der index ist nach dem laden der form schon hochgezählt.
zum verständis hier mal mein code:

ausblenden 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:
digitalIoControls = new DigitalIoControl[Channels];
            for (int i = 0; i < Channels; i++)
            {
                digitalIoControls[i] = new DigitalIoControl
                {
                    Comment = string.Format("Channel {0}", i),
                    DefaultName = string.Format("Channel {0}", i),
                    CommentVisible = true,
                    Index = i,
                    IndexVisible = true,
                    InputState = false,
                    Name = string.Format("digitalIoControl{0}", i),
                    Output = true,
                    OutputState = false,
                    ReadOnly = false,
                    Location = new Point(025 * i),
                    Size = new Size(20025),
                    TabIndex = i,
                    TabStop = true
                   };

                digitalIoControls[i].StateChanged += DigitalIoControlStateChanged;
                digitalIoControls[i].ModeVisible = false;

                valuesPanel.Controls.Add(digitalIoControls[i]);


channels ist ganz einfach die anzahl der zu erstellenden controls
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 15.08.12 11:47 
In deinem Event bekommst du doch den Sender mitgeliefert (erster Parameter)?
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Mi 15.08.12 11:56 
outch ok stimmt :D
und wie weise ich den sender zu bzw lese ihn aus??
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 15.08.12 12:03 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
DigitalIoControl digitalIoControl = sender as DigitalIoControl;
if (digitalIoControl != null)
{
   // mach was tolles
}
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Mi 15.08.12 13:23 
super das hat geklappt =) vielen dank...
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Do 16.08.12 10:48 
Soo sorry hab nochmal ne kleine frage zu diesem thema:


ich habe nun einen Timer erstellt welcher ein Tick ereignis ausführt. in diesem tick ereignis benötige ich nun wieder die eigenschaft eines bestimmten moduls.

nun wollt ich das genauso machen wie bim ereignis StateChanged, also erstmal

ausblenden C#-Quelltext
1:
digitalIoControls[i].StateChanged += Timer1_Tick;					


nur irgendwie haut das nicht so recht hin, im sender stehen dieses mal nur daten vom timer nicht meine control daten.

weil wenn ich im ereignis dann so definiere:
ausblenden C#-Quelltext
1:
2:
3:
4:
private void Timer1_Tick(object sender, EventArgs e)
{
DigitalIoControl digitalIoControl = sender as DigitalIoControl;
bool setState = digitalIoControl.OutputState;


ist mein digitalIoControl NULL und klar exception :-/

hab ich irgendwas vergessen oder kann ich das so nicht machen???
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 16.08.12 11:01 
Nur weil deine EventHandler Methode Tick im Namen hat wird daraus kein Timer Event? Wenn du den deinem StateChanged Event zuweist wird der halt beim StateChanged aufgerufen und zwar von einer DigitalIoControl Instanz die sich dann selbst an den Event als Sender mitgibt. Wenn du den selben EventHandler auch an den Tick Event eines Timers gehängt hast bekommst du halt wenn die Methode durch den Timer aufgerufen wurde den Timer als sender und wenn er durch ein DigitalIoControl aufgerufen wurde eben diese Instanz.

Wenn du eine bestimmte DigitalIoControl Instanz in einem ~echten~ TimerEvent brauchst solltest du uns sagen warum dann kann man auch was raten. Gibt es bei dir Paare von Timern und DigitalIoControl oder nur einen Timer? Bist du dir sicher das richtige zu tun? Ein Timer bei einem offensichtlich wohl visuellen Control hört sich immer nach Problemen an. Halt üblicherweise der Versuch regelmäßig was zu refreshen was zu flackern oder zu irgendwelchen unerwarteten visuellen Artefakten führt.
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Do 16.08.12 11:18 
ja ich brauche einen timer, da daten über eine serielle schnittstelle abgerufen werden und diese unvorhersehbar jeder zeit kommen.
über diesen timer werden die controls auf meiner oberfläche gesteuert bzw verändert. ich habe das ganze so schonmal gemacht, aber damals hatte ich eben feste controls, da konnten diese einzeln im quellcode aufgerufen werden.
hab auch versuch ganz einfach bei jeden so das entsprechende control also hier das erste

ausblenden C#-Quelltext
1:
digitalIoControls[1].OutputState					

aufzurufen es befindet sich dort natürlich der letzte wert

EDIT control war inaktiv, jetzt funktionierts :D sorry
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 16.08.12 13:10 
Zitat:
ja ich brauche einen timer, da daten über eine serielle schnittstelle abgerufen werden und diese unvorhersehbar jeder zeit kommen.


SerialPort sollte einen DataReceived Event feuern wenn Daten anliegen. Gibt eigentlich keinen zwingenden Grund den per Timer zu pollen.