| Autor |
Beitrag |
Ivy
      
Beiträge: 228
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 15.08.12 10:40
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 
      
Beiträge: 228
|
Verfasst: 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
C#-Quelltext 1:
| digitalIoControls[i].StateChanged += DigitalIoControlStateChanged; |
ich hoffe das ist einigermaßen verständlich, weiß nicht wie ich es richtig beschreiben soll
also rein theoretisc h sollte so aussehen:
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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 228
|
Verfasst: 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:
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(0, 25 * i), Size = new Size(200, 25), 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 15.08.12 11:47
In deinem Event bekommst du doch den Sender mitgeliefert (erster Parameter)?
|
|
Ivy 
      
Beiträge: 228
|
Verfasst: Mi 15.08.12 11:56
outch ok stimmt
und wie weise ich den sender zu bzw lese ihn aus??
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 15.08.12 12:03
C#-Quelltext 1: 2: 3: 4: 5:
| DigitalIoControl digitalIoControl = sender as DigitalIoControl; if (digitalIoControl != null) { } |
|
|
Ivy 
      
Beiträge: 228
|
Verfasst: Mi 15.08.12 13:23
super das hat geklappt =) vielen dank...
|
|
Ivy 
      
Beiträge: 228
|
Verfasst: 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
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:
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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 228
|
Verfasst: 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
C#-Quelltext 1:
| digitalIoControls[1].OutputState |
aufzurufen es befindet sich dort natürlich der letzte wert
EDIT control war inaktiv, jetzt funktionierts  sorry
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
|
|