This-Pointer in anderen Pointer schreiben

  • C++

  • locutus
  • 2831 Aufrufe 13 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • This-Pointer in anderen Pointer schreiben

    Hi,

    ich hab gerade ein Problem:

    und zwar möchte - nein, muss - ich ein Programm schreiben, welches über den Com-Port mit einem µC kommuniziert. Das ganze Projekt ist in Visual Studio 2010 (Ultimate über die msdnaa) erstellt, einiges funktioniert auch schon, aber:

    Ich möchte eigentlich ganz gerne diese Funktion: SerialPort.DataReceived Event (System.IO.Ports) nutzen, um dadurch eben bei Inputs entsprechende Handlungen auslösen zu können. Nur: egal was ich mache, ich kann die datareceviedhandler-Funktion nur als static definieren, sonst meckert der Compiler rum. in der Static-Funktion darf ich aber wiederrum nicht den this-Operator nutzen, welchen ich eigentlich brauche, um bestimmte Steuerelemente in Abhängigkeit vom Input zu verändern.

    Daher bin ich nach einigem Nachdenken auf die Idee gekommen "schreibst doch einfach die Adressen von den Elementen, auf welche du mit this sonst zugreifst, in neue, globale pointer und nutzt die dann" - gesagt, getan, aber: jetzt bekomm ich andauernd den Fehler "'&' erwartet L-Wert", jedoch habe ich keine Ahnung, warum.

    hier mal die entsprechenden Code-Auszüge:

    Quellcode

    1. // ganz am Anfang der header-Datei:
    2. bool* startenable; //ich hatte es auch schon mit int versucht,
    3. bool* zielvarenable; //aber da ists genau das gleiche
    4. //in der Routine zur Initialisierung des Com-Ports:
    5. startenable = &this->starte->Enabled; //das sind Buttons, welche abhängig vom
    6. zielvarenable = &this->zielvariable->Enabled; //Input geschaltet werden sollen
    7. //und in der Datareceviedhandler-Funktion:
    8. *startenable = true;
    9. *zielvarenable = true;
    Alles anzeigen


    kann mir da wer sagen, woran das liegt bzw. wie ich das Problem lösen könnte? Ich hab heut schon den ganzen Tag damit verbracht, die MSDN-Resourcen zu durchsuchen (nicht nur zu diesem Problem, da waren noch ein paar andere Dinge, die nicht so ganz wollten und deren Lösung auch ewig gebraucht hat), konnte aber absolut nichts dazu finden.
  • Also ich habe keine Ahnung von MSDN. Aus deiner Beschreibung lese ich jedoch heraus, dass es von der Klasse, deren 'this' du gerne hättest, maximal eine Instanz gibt. Wenn ich richtig liege, dann frage ich mich, warum du daraus nicht einen Singleton machst. Der bietet ja bekanntlich eine getInstance() das jederzeit den this-Pointer liefert.

    Hoffe geholfen zu haben :)
  • ich hab ehrlich gesagt nicht allzu tiefgreifende kenntnisse von klassen in c - vor zwei jahren hab ich mal java inklusive klassen gemacht, seitdem aber nur noch c bzw. c++ (und asm) ohne klassen...

    vom prinzip her gibt es von der klasse her allerdings glaub ich nur eine instanz, ja.

    die eigentlichen dateien, in denen ich arbeite, wurden von visual studio selbst erstellt (was den enormen vorteil hat, dass ich die buttons, text-boxen und co. direkt grafisch platzieren konnte und eben nur noch mit funktionen füllen musste), von daher weis ich auch nur bedingt, wie das ganze eigentlich genau initialisiert wird. natürlich hat das auch seine nachteile, für mich als "gelegenheitsprogrammierer" ists allerdings ganz praktisch.

    auch weis ich nicht so recht, wie ich das ganze in ein singleton verwandeln könnte - und wie ich das dann weiter ausnutzen könnte - am liebsten wäre es mir ja fast, wenn ich einfach aus der static-funktion eine nicht-statische funktion aufrufen könnte - aber auch da meckert der compiler nur rum. -.-
  • So ganz verstehe ich nicht wirklich was Du so vorhast.
    Was hast Du denn als Vorlage gewählt (MFC, WindowsForm Win32Konsole) ?
    Und warum nimmst Du nicht gleich C#?
    Also bei Deinem MSDN-Link kannst Du doch grob die Funktion "Daten empfangen" von der SerialPort-Klasse nachschauen.
    Wo hast Du den da einen this Pointer entdeckt ???
    Welche Steuerelemente willst Du denn wie ändern ?
    Buttons kannst Du doch in der static Funktion mit button_xyz.Enable = false oder true aktiv setzen.
  • es sollte windowsForm sein - zumindest konnte ich direkt nach erstellen die objekte auf der oberfläche anordnen wie ich wollte.

    sprachlich hab ich nirgendwo eine einstellmöglichkeit gefunden, bei visual studio 2010 hab ich aber auch kein c#-projekt öffnen können, also da scheints nicht mit klar zu kommen.
    mal abgesehen davon hab ich keine ahnung von C#.

    und zum thema this-pointer: an mehreren stellen habe ich grob den befehl
    this->button1->Enabled = true bzw. false; //ist zumindest so, wies in der doku steht und die buttons sind bei mir aber noch umbenannt
    ausserdem ist das zweite, was umgeschaltet werden soll, eine textbox.

    denn: ich schalte die buttons ab, so lange sie nicht benutzt werden sollen. gleichzeitig kann ich nicht das gesamte programm so lange blockieren, bis die gegenstelle zurückmeldet "ich bin da, wo ich hin soll", weshalb ich praktisch die buttons von einem interrupt aktivieren lassen muss. (und noch andere tasks ausführen lassen möchte, welche aber eben alle in dem einen fenster passieren sollen)
    wenn es irgendwas helfen würde, würde ich den gesamten quelltext hier rein stellen, aber ich denke mal, das würde dann den ganzen rahmen doch etwas überladen.

    nachdem ich jetzt noch mal etwas zeit hatte, dieses button_xyz zu testen, muss ich leider sagen: geht nicht. :(


    im endeffekt sieht der (für diesen teil wohl wichtige) code so aus:

    Quellcode

    1. #pragma once
    2. namespace Steuerung {
    3. using namespace System;
    4. using namespace System::ComponentModel;
    5. using namespace System::Collections;
    6. using namespace System::Windows::Forms;
    7. using namespace System::Data;
    8. using namespace System::Drawing;
    9. using namespace System::IO::Ports;
    10. bool* startenable;
    11. bool* zielvarenable;
    12. /// <summary>
    13. /// Zusammenfassung für Form1
    14. /// </summary>
    15. public ref class Form1 : public System::Windows::Forms::Form
    16. {
    17. public:
    18. Form1(void)
    19. {
    20. InitializeComponent();
    21. //
    22. //TODO: Konstruktorcode hier hinzufügen.
    23. //
    24. }
    25. protected:
    26. /// <summary>
    27. /// Verwendete Ressourcen bereinigen.
    28. /// </summary>
    29. ~Form1()
    30. {
    31. if (components)
    32. {
    33. delete components;
    34. }
    35. }
    36. /* hier steht noch etwas mehr code, der ist aber wohl irrelevant, ist im endeffekt wie die folgende zeile,
    37. zum teil aber mit protected-suffix - s.u.*/
    38. private: System::Windows::Forms::MaskedTextBox^ zielvariable;
    39. protected:
    40. protected: //z.b. hier
    41. private: System::Windows::Forms::Button^ starte;
    42. private: System::ComponentModel::IContainer^ components;
    43. private:
    44. /// <summary>
    45. /// Erforderliche Designervariable.
    46. /// </summary>
    47. #pragma region Windows Form Designer generated code
    48. /// <summary>
    49. /// Erforderliche Methode für die Designerunterstützung.
    50. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    51. /// </summary>
    52. void InitializeComponent(void)
    53. {
    54. this->starte = (gcnew System::Windows::Forms::Button());
    55. this->zielvariable = (gcnew System::Windows::Forms::MaskedTextBox());
    56. /*hier steht dann noch der ganze restliche initialisierungscode, welcher weitere
    57. elemente initialisiert und eigenschaften vergibt*/
    58. }
    59. #pragma endregion
    60. System::IO::Ports::SerialPort^ comPort;
    61. int value;
    62. float eingabe;
    63. private: System::Void label1_Click(System::Object^ sender, System::EventArgs^ e) {
    64. }
    65. private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
    66. this->comboBox1->Items->Clear();
    67. this->comboBox1->Items->AddRange(SerialPort::GetPortNames());
    68. }
    69. private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
    70. try {
    71. //routinen zum comport initialisieren
    72. comPort = gcnew SerialPort(this->comboBox1->Text);
    73. comPort->DataReceived += gcnew SerialDataReceivedEventHandler(&Steuerung::Form1::DataReceviedHandler); //hier wird die zu verwendende Int-Funktion benannt
    74. comPort->Open();
    75. }
    76. catch (Exception^ x) {
    77. //error-handler
    78. }
    79. }
    80. private: static void DataReceviedHandler(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) {
    81. array<unsigned char> ^ibuffer = gcnew array<unsigned char>(2);
    82. System::IO::Ports::SerialPort^ cp = (System::IO::Ports::SerialPort^)sender;
    83. cp->Read(ibuffer,0,2);
    84. if((ibuffer[0]==255) && (ibuffer[1]==255)) { //wenn 0b1111 1111 1111 1111 gesendet wurde, dann:
    85. this->starte->Enabled = true; //genau hier gehts nicht, auch nicht mit Button_starte.Enable = true
    86. this->zielvariable->Enabled = true; // und hier natürlich das gleiche!
    87. //hier sollten eben eigentlich button und eingabefeld wieder eingeschaltet werden.
    88. }
    89. }
    90. /* und dann kommt noch nen bischen mehr code für andere funktionen,
    91. welche u.a. eben auch button starte und textfeld zielvariable deaktivieren.
    92. natürlich wäre es rein theoretisch möglich, mit einer blocking-funktion (z.b. while(xyz); ) auf eine antwort zu warten,
    93. allerdings muss es zum einen möglich sein, die antwort vom externen system zu empfangen, zum anderen muss aber ein
    94. anderer button weiterhin klickbar sein!
    95. */
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Broken Sword () aus folgendem Grund: Doppelpost =&gt; Regeln lesen!

  • Also grundsätzlich gilt der this-Pointer auf das Formular,
    d.h wenn Du auf this->starte zugreifen willst sollte ein Element starte vorhanden sein.
    Du scheinst ja beim Klick auf Button4 (button4_Click) den Port zu Öffnen.
    Dort solltest Du dann auch den Button erst mal disablen.
    In der DataReceviedHandler-Funktion kannst Du dann disen Button wieder enablen.
    Sorry ist jetzt spät, weiss noch nicht genau wer oder was zielvariable ist(comboBox1 ?)
    Mehr morgen abend...
  • nicht ganz: zielvariable ist MaskedTextBox. comboBox ist das drop-down-feld, welches alle vorhandenen comports eingeschrieben bekommt und aus welchem der gewünschte gewählt sowie ausgelesen wird. (vlt. hätte ich doch den teil gleich mit posten sollen?)

    Der teil, bei welchem der COM-Port geöffnet wird, ist hier jetzt auch nicht vollständig abgebildet, nur eben wegen der comPort->DataReceived += ... - zeile überhaupt drin. denn der comport läuft soweit ansonsten eigentlich, wie er soll. (und ja, erschaltet auch den öffnen-button ab)

    das element starte existiert im übrigen:

    Quellcode

    1. private: System::Void starte_Click(System::Object^ sender, System::EventArgs^ e) {
    2. array<unsigned char> ^obuffer = gcnew array<unsigned char>(2);
    3. this->starte->Enabled = false;
    4. this->zielvariable->Enabled = false;
    5. try {
    6. eingabe = Convert::ToSingle(this->zielvariable->Text);
    7. value = Convert::ToByte(Math::Round(eingabe * 63 / 45));
    8. obuffer[0] = value;
    9. }
    10. catch (Exception^ x) {
    11. MessageBox::Show("Fehlerhafte Eingabe!");
    12. }
    13. try {
    14. if ((eingabe >= 0) && (45 >= eingabe)) {
    15. comPort->Write(obuffer,0,1);
    16. }
    17. else {
    18. MessageBox::Show("Eingegebenes Ziel ausserhalb des Bereichs (0 ... 45) mm !");
    19. }
    20. }
    21. catch (Exception^ y) {
    22. MessageBox::Show("Fehler beim Senden!");
    23. }
    24. }
    Alles anzeigen


    um das, was ich machen will, noch mal genau zu beschreiben: nachdem dieser button geklickt wurde, wird die gewünschte position codiert und meinem µC die berechnete Position gesendet. danach soll diese funktion wieder verlassen werden, damit auch der button:

    Quellcode

    1. private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
    2. array<unsigned char> ^obuffer = gcnew array<unsigned char>(2);
    3. obuffer[0] = 255;
    4. comPort->Write(obuffer,0,1);
    5. this->starte->Enabled = true;
    6. this->zielvariable->Enabled = true;

    geklickt werden kann (welcher dem µC sagt, dass er sofort stoppen soll, das ist auch essentiell wichtig, dass das funktioniert!).

    gleichzeitig schreibt der µC aber auch aktuelle positionen (ist ja nicht so wichtig) zurück, (welche ich eigentlich auch noch, aber an anderer stelle, behandeln lassen möchte, das ist aber mehr wunsch und entsprechend werd ich mich damit erst viel später befassen) und eben - und das ist wiederrum wichtig - ein 0b 1111 1111 1111 1111 (also 2 byte mit jeweils nur 1 gefüllt) zurück, wenn er seine aufgabe erledigt hat. und genau dann sollten das eingabefeld und der sende-button wieder aktiviert werden. (was sich dann ja wiederum im DataReceviedHandler gemacht wird - oder zumindest versuche ich, das dort zu machen).
  • Hoppla, das wird mir momentan etwas unübersichtlich.
    1.Tip von mir: Benenne die Buttons usw. nach der ungefähren Funktion, weil button1, button2 usw. sind ziemlich nichtssagend. Besser wäre btn_start, btn_send, btn_open, cb_com_ports, mtb_eingabe usw...
    2. Benutze unbedingt den Debugger. Setze Breakpoints an wichtigen Stellen. Dann sieht Du auch, wie und wann und ob überhaubt der Code angesprungen wird.
    Dort kannst Du dann testen ob DataReceviedHandler Daten empfängt. Wenn ja kannst Du diese Daten ja auswerten und Dort das EingabeFeld und den Button wieder aktivieren...
  • zu 1.: ich habe die buttons im entwurf eigentlich auch benannt - nur irgendwo hat vs das wohl nicht für jeden button in jede funktion mitgeschleift. ist zwar unübersichtlich, ich weis aber nicht, ob ich da jetzt einfach was dran ändern kann oder darf.

    debugger würde ich liebend gerne verwenden - das problem ist nur, dass ich das projekt nicht compiliert bekomme, so lange ich über die this->... - funktionalität versuche, die buttons wieder zu aktivieren. genau da liegt bei mir ja gerade der hase im pfeffer!

    letzten endes ist es bestimmt nur irgend eine kleinigkeit, die ich statt dem this-> eintippen müsste, damit ich direkt auf die funktionalität zugreifen könnte, auf welche ich zugreifen will.

    Ich hab eben noch mal den code etwas sortiert - also eigentlich nur noch mal die funktionen umsortiert und vor jeder einzelfunktion noch mal geschrieben was sie machen soll und wann sie ausgeführt wird:


    hier der eigencode: ((ich wünscht, ich wüsst jetzt nen befehl für den vbulletin-editor, um das ganze weniger zeilen anzeigen zu lassen, gerade für den 2. teil!)

    Quellcode

    1. #pragma endregion
    2. System::IO::Ports::SerialPort^ comPort;
    3. int value;
    4. float eingabe;
    5. /*************************************************************
    6. ** Diese Funktion wird beim Klicken von Refresh ausgeführt. **
    7. ** Aufgaben: **
    8. ** comboBox1 leeren und anschliessend mit allen vorhandenen **
    9. ** COM-Ports füllen. **
    10. **************************************************************/
    11. private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
    12. this->comboBox1->Items->Clear();
    13. this->comboBox1->Items->AddRange(SerialPort::GetPortNames());
    14. }
    15. /************************************************************
    16. ** Diese Funktion wird beim Klicken von Select ausgeführt. **
    17. ** Aufgaben: **
    18. ** Öffnen des in comboBox1 ausgewählten COM-Ports **
    19. ** Behandeln von Fehlern beim Öffnen des COM-Ports **
    20. *************************************************************/
    21. private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
    22. try {
    23. this->select->Enabled = false;
    24. this->refresh->Enabled = false;
    25. this->comboBox1->Enabled = false;
    26. comPort = gcnew SerialPort(this->comboBox1->Text);
    27. comPort->DataReceived += gcnew SerialDataReceivedEventHandler(&Steuerung::Form1::DataReceviedHandler);
    28. comPort->Open();
    29. //startenable = &(this->starte->Enabled);
    30. //zielvarenable = &this->zielvariable->Enabled;
    31. this->kalibrieren->Enabled = true;
    32. this->kalibladen->Enabled = true;
    33. }
    34. catch (Exception^ x) {
    35. MessageBox::Show("Konnte Verbindung nicht herstellen!");
    36. this->kalibrieren->Enabled = false;
    37. this->kalibladen->Enabled = false;
    38. this->refresh->Enabled = true;
    39. this->select->Enabled = true;
    40. this->comboBox1->Enabled = true;
    41. try {
    42. void Dispose(bool disposing);
    43. }
    44. catch (Exception^ y) {}
    45. }
    46. }
    47. /**************************************************************************
    48. ** Diese Funktion wird aufgerufen, sobald der Sendebuffer Daten enthält. **
    49. ** Aufgaben: **
    50. ** Auswertung des Dateneingangs und von Diesem Abhängig ein reaktivieren **
    51. ** des Verfahren-Buttons und der Ziel-Eingabe-Box. **
    52. ***************************************************************************/
    53. private: static void DataReceviedHandler(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) {
    54. array<unsigned char> ^ibuffer = gcnew array<unsigned char>(2);
    55. System::IO::Ports::SerialPort^ cp = (System::IO::Ports::SerialPort^)sender;
    56. cp->Read(ibuffer,0,2);
    57. if((ibuffer[0]==255) && (ibuffer[1]==255)) {
    58. this->starte->Enabled = true;
    59. this->zielvariable->Enabled = true;
    60. }
    61. }
    62. /********************************************************************
    63. ** Dieser Funktion wird beim Klicken von Anhalten ausgeführt. **
    64. ** Aufgaben: **
    65. ** Senden von 0xFF an Steuerung zum Anhalten des Gerätes. **
    66. ** Reaktivieren des Verfahren-Buttons und der Positionseingabebox. **
    67. *********************************************************************/
    68. private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
    69. array<unsigned char> ^obuffer = gcnew array<unsigned char>(2);
    70. obuffer[0] = 255;
    71. comPort->Write(obuffer,0,1);
    72. this->starte->Enabled = true;
    73. this->zielvariable->Enabled = true;
    74. }
    75. /************************************************************************
    76. ** Diese Funktion wird beim Klicken von Kalibrierung Laden ausgeführt. **
    77. ** Aufgaben: **
    78. ** Positionsangaben aus Datei einlesen und Programm zur Verfügung **
    79. ** stellen. **
    80. ** Diese Funktion ist zur Zeit nicht implementiert!! **
    81. *************************************************************************/
    82. private: System::Void button6_Click(System::Object^ sender, System::EventArgs^ e) {
    83. this->kalibrieren->Enabled = false;
    84. this->kalibladen->Enabled = false;
    85. this->starte->Enabled = true;
    86. this->stoppe->Enabled = true;
    87. this->zielvariable->Enabled = true;
    88. }
    89. /********************************************************************
    90. ** Diese Funktion wird beim Klicken von Kalibrieren ausgeführt. **
    91. ** Aufgaben: **
    92. ** Steuerung jede mögliche Position anfahren lassen und Positions- **
    93. ** wert empfangen sowie auswerten und in Datei schreiben. **
    94. ** Diese Funktion ist zur Zeit nicht implementiert!! **
    95. *********************************************************************/
    96. private: System::Void button5_Click(System::Object^ sender, System::EventArgs^ e) {
    97. this->kalibrieren->Enabled = false;
    98. this->kalibladen->Enabled = false;
    99. this->starte->Enabled = true;
    100. this->stoppe->Enabled = true;
    101. this->zielvariable->Enabled = true;
    102. }
    103. /************************************************************************
    104. ** Diese Funktion wird beim Klicken von Verfahren ausgeführt. **
    105. ** Aufgaben: **
    106. ** aus Eingabefeld zielvariable (MaskedTextBox1) Eingabewert einlesen, **
    107. ** überprüfen, ob Eingabewert innerhalb Spezifikationen liegt, **
    108. ** Codieren der Eingabe und Senden an Steuerung. **
    109. *************************************************************************/
    110. private: System::Void starte_Click(System::Object^ sender, System::EventArgs^ e) {
    111. array<unsigned char> ^obuffer = gcnew array<unsigned char>(2);
    112. this->starte->Enabled = false;
    113. this->zielvariable->Enabled = false;
    114. try {
    115. eingabe = Convert::ToSingle(this->zielvariable->Text);
    116. value = Convert::ToByte(Math::Round(eingabe * 63 / 45));
    117. obuffer[0] = value;
    118. }
    119. catch (Exception^ x) {
    120. MessageBox::Show("Fehlerhafte Eingabe!");
    121. }
    122. try {
    123. if ((eingabe >= 0) && (45 >= eingabe)) {
    124. comPort->Write(obuffer,0,1);
    125. }
    126. else {
    127. MessageBox::Show("Eingegebenes Ziel ausserhalb des Bereichs (0 ... 45) mm !");
    128. }
    129. }
    130. catch (Exception^ y) {
    131. MessageBox::Show("Fehler beim Senden!");
    132. }
    133. }
    134. private: System::Void groupBox1_Enter(System::Object^ sender, System::EventArgs^ e) {
    135. }
    136. private: System::Void label1_Click(System::Object^ sender, System::EventArgs^ e) {
    137. }
    138. private: System::Void label3_Click(System::Object^ sender, System::EventArgs^ e) {
    139. }
    140. private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
    141. }
    142. private: System::Void zielvariable_MaskInputRejected(System::Object^ sender, System::Windows::Forms::MaskInputRejectedEventArgs^ e) {
    143. }
    144. };
    145. }
    Alles anzeigen


    und der Code, der vorne weg von VS selbst erzeugt wurde:

    Quellcode

    1. #pragma once
    2. namespace Steuerung {
    3. using namespace System;
    4. using namespace System::ComponentModel;
    5. using namespace System::Collections;
    6. using namespace System::Windows::Forms;
    7. using namespace System::Data;
    8. using namespace System::Drawing;
    9. using namespace System::IO::Ports;
    10. bool* startenable;
    11. bool* zielvarenable;
    12. /// <summary>
    13. /// Zusammenfassung für Form1
    14. /// </summary>
    15. public ref class Form1 : public System::Windows::Forms::Form
    16. {
    17. public:
    18. Form1(void)
    19. {
    20. InitializeComponent();
    21. //
    22. //TODO: Konstruktorcode hier hinzufügen.
    23. //
    24. }
    25. protected:
    26. /// <summary>
    27. /// Verwendete Ressourcen bereinigen.
    28. /// </summary>
    29. ~Form1()
    30. {
    31. if (components)
    32. {
    33. delete components;
    34. }
    35. }
    36. private: System::Windows::Forms::Button^ stoppe;
    37. private: System::Windows::Forms::MaskedTextBox^ zielvariable;
    38. protected:
    39. protected:
    40. private: System::Windows::Forms::GroupBox^ groupBox1;
    41. private: System::Windows::Forms::Button^ starte;
    42. private: System::Windows::Forms::PictureBox^ pictureBox1;
    43. private: System::Windows::Forms::ProgressBar^ progressBar1;
    44. private: System::Windows::Forms::ComboBox^ comboBox1;
    45. private: System::Windows::Forms::Button^ refresh;
    46. private: System::Windows::Forms::Button^ select;
    47. private: System::Windows::Forms::GroupBox^ groupBox2;
    48. private: System::Windows::Forms::Label^ label1;
    49. private: System::Windows::Forms::Label^ label2;
    50. private: System::Windows::Forms::OpenFileDialog^ openFileDialog1;
    51. private: System::Windows::Forms::GroupBox^ groupBox3;
    52. private: System::Windows::Forms::Button^ kalibladen;
    53. private: System::Windows::Forms::GroupBox^ groupBox4;
    54. private: System::Windows::Forms::StatusStrip^ statusStrip1;
    55. private: System::Windows::Forms::ToolStripStatusLabel^ toolStripStatusLabel1;
    56. private: System::Windows::Forms::SaveFileDialog^ saveFileDialog1;
    57. private: System::Windows::Forms::Button^ kalibrieren;
    58. private: System::ComponentModel::IContainer^ components;
    59. private:
    60. /// <summary>
    61. /// Erforderliche Designervariable.
    62. /// </summary>
    63. #pragma region Windows Form Designer generated code
    64. /// <summary>
    65. /// Erforderliche Methode für die Designerunterstützung.
    66. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    67. /// </summary>
    68. void InitializeComponent(void)
    69. {
    70. this->stoppe = (gcnew System::Windows::Forms::Button());
    71. this->zielvariable = (gcnew System::Windows::Forms::MaskedTextBox());
    72. this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
    73. this->label2 = (gcnew System::Windows::Forms::Label());
    74. this->label1 = (gcnew System::Windows::Forms::Label());
    75. this->starte = (gcnew System::Windows::Forms::Button());
    76. this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox());
    77. this->progressBar1 = (gcnew System::Windows::Forms::ProgressBar());
    78. this->comboBox1 = (gcnew System::Windows::Forms::ComboBox());
    79. this->refresh = (gcnew System::Windows::Forms::Button());
    80. this->select = (gcnew System::Windows::Forms::Button());
    81. this->groupBox2 = (gcnew System::Windows::Forms::GroupBox());
    82. this->openFileDialog1 = (gcnew System::Windows::Forms::OpenFileDialog());
    83. this->groupBox3 = (gcnew System::Windows::Forms::GroupBox());
    84. this->kalibrieren = (gcnew System::Windows::Forms::Button());
    85. this->kalibladen = (gcnew System::Windows::Forms::Button());
    86. this->groupBox4 = (gcnew System::Windows::Forms::GroupBox());
    87. this->statusStrip1 = (gcnew System::Windows::Forms::StatusStrip());
    88. this->toolStripStatusLabel1 = (gcnew System::Windows::Forms::ToolStripStatusLabel());
    89. this->saveFileDialog1 = (gcnew System::Windows::Forms::SaveFileDialog());
    90. this->groupBox1->SuspendLayout();
    91. (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->BeginInit();
    92. this->groupBox2->SuspendLayout();
    93. this->groupBox3->SuspendLayout();
    94. this->groupBox4->SuspendLayout();
    95. this->statusStrip1->SuspendLayout();
    96. this->SuspendLayout();
    97. //
    98. // stoppe
    99. //
    100. this->stoppe->Enabled = false;
    101. this->stoppe->Location = System::Drawing::Point(6, 100);
    102. this->stoppe->Name = L"stoppe";
    103. this->stoppe->Size = System::Drawing::Size(155, 32);
    104. this->stoppe->TabIndex = 0;
    105. this->stoppe->Text = L"Anhalten";
    106. this->stoppe->UseVisualStyleBackColor = true;
    107. this->stoppe->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    108. //
    109. // zielvariable
    110. //
    111. this->zielvariable->Enabled = false;
    112. this->zielvariable->Location = System::Drawing::Point(9, 37);
    113. this->zielvariable->Name = L"zielvariable";
    114. this->zielvariable->Size = System::Drawing::Size(77, 20);
    115. this->zielvariable->TabIndex = 1;
    116. this->zielvariable->Text = L"0";
    117. this->zielvariable->MaskInputRejected += gcnew System::Windows::Forms::MaskInputRejectedEventHandler(this, &Form1::zielvariable_MaskInputRejected);
    118. //
    119. // groupBox1
    120. //
    121. this->groupBox1->Controls->Add(this->label2);
    122. this->groupBox1->Controls->Add(this->label1);
    123. this->groupBox1->Controls->Add(this->starte);
    124. this->groupBox1->Controls->Add(this->zielvariable);
    125. this->groupBox1->Controls->Add(this->stoppe);
    126. this->groupBox1->Location = System::Drawing::Point(14, 181);
    127. this->groupBox1->Name = L"groupBox1";
    128. this->groupBox1->Size = System::Drawing::Size(167, 139);
    129. this->groupBox1->TabIndex = 2;
    130. this->groupBox1->TabStop = false;
    131. this->groupBox1->Text = L"Steuerung";
    132. this->groupBox1->Enter += gcnew System::EventHandler(this, &Form1::groupBox1_Enter);
    133. //
    134. // label2
    135. //
    136. this->label2->AutoSize = true;
    137. this->label2->Location = System::Drawing::Point(6, 21);
    138. this->label2->Name = L"label2";
    139. this->label2->Size = System::Drawing::Size(81, 13);
    140. this->label2->TabIndex = 4;
    141. this->label2->Text = L"Bauteil liegt bei:";
    142. //
    143. // label1
    144. //
    145. this->label1->AutoSize = true;
    146. this->label1->Location = System::Drawing::Point(92, 40);
    147. this->label1->Name = L"label1";
    148. this->label1->Size = System::Drawing::Size(69, 13);
    149. this->label1->TabIndex = 3;
    150. this->label1->Text = L"mm auf Band";
    151. //
    152. // starte
    153. //
    154. this->starte->Enabled = false;
    155. this->starte->Location = System::Drawing::Point(6, 63);
    156. this->starte->Name = L"starte";
    157. this->starte->Size = System::Drawing::Size(155, 31);
    158. this->starte->TabIndex = 2;
    159. this->starte->Text = L"Verfahren";
    160. this->starte->UseVisualStyleBackColor = true;
    161. this->starte->Click += gcnew System::EventHandler(this, &Form1::starte_Click);
    162. //
    163. // pictureBox1
    164. //
    165. this->pictureBox1->Location = System::Drawing::Point(187, 7);
    166. this->pictureBox1->Name = L"pictureBox1";
    167. this->pictureBox1->Size = System::Drawing::Size(329, 366);
    168. this->pictureBox1->TabIndex = 3;
    169. this->pictureBox1->TabStop = false;
    170. //
    171. // progressBar1
    172. //
    173. this->progressBar1->Location = System::Drawing::Point(8, 19);
    174. this->progressBar1->Name = L"progressBar1";
    175. this->progressBar1->Size = System::Drawing::Size(155, 22);
    176. this->progressBar1->TabIndex = 3;
    177. //
    178. // comboBox1
    179. //
    180. this->comboBox1->FormattingEnabled = true;
    181. this->comboBox1->Location = System::Drawing::Point(4, 19);
    182. this->comboBox1->MaxDropDownItems = 50;
    183. this->comboBox1->Name = L"comboBox1";
    184. this->comboBox1->Size = System::Drawing::Size(80, 21);
    185. this->comboBox1->Sorted = true;
    186. this->comboBox1->TabIndex = 4;
    187. this->comboBox1->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::comboBox1_SelectedIndexChanged);
    188. //
    189. // refresh
    190. //
    191. this->refresh->Location = System::Drawing::Point(90, 19);
    192. this->refresh->Name = L"refresh";
    193. this->refresh->Size = System::Drawing::Size(71, 23);
    194. this->refresh->TabIndex = 5;
    195. this->refresh->Text = L"Refresh";
    196. this->refresh->UseVisualStyleBackColor = true;
    197. this->refresh->Click += gcnew System::EventHandler(this, &Form1::button3_Click);
    198. //
    199. // select
    200. //
    201. this->select->Location = System::Drawing::Point(6, 46);
    202. this->select->Name = L"select";
    203. this->select->Size = System::Drawing::Size(155, 23);
    204. this->select->TabIndex = 7;
    205. this->select->Text = L"Select";
    206. this->select->UseVisualStyleBackColor = true;
    207. this->select->Click += gcnew System::EventHandler(this, &Form1::button4_Click);
    208. //
    209. // groupBox2
    210. //
    211. this->groupBox2->Controls->Add(this->select);
    212. this->groupBox2->Controls->Add(this->refresh);
    213. this->groupBox2->Controls->Add(this->comboBox1);
    214. this->groupBox2->Location = System::Drawing::Point(14, 13);
    215. this->groupBox2->Name = L"groupBox2";
    216. this->groupBox2->Size = System::Drawing::Size(167, 77);
    217. this->groupBox2->TabIndex = 8;
    218. this->groupBox2->TabStop = false;
    219. this->groupBox2->Text = L"COM-Port";
    220. //
    221. // openFileDialog1
    222. //
    223. this->openFileDialog1->FileName = L"openFileDialog1";
    224. this->openFileDialog1->Tag = L"*.calib";
    225. //
    226. // groupBox3
    227. //
    228. this->groupBox3->Controls->Add(this->progressBar1);
    229. this->groupBox3->Location = System::Drawing::Point(12, 326);
    230. this->groupBox3->Name = L"groupBox3";
    231. this->groupBox3->Size = System::Drawing::Size(169, 47);
    232. this->groupBox3->TabIndex = 9;
    233. this->groupBox3->TabStop = false;
    234. this->groupBox3->Text = L"Fortschritt:";
    235. //
    236. // kalibrieren
    237. //
    238. this->kalibrieren->Enabled = false;
    239. this->kalibrieren->Location = System::Drawing::Point(6, 21);
    240. this->kalibrieren->Name = L"kalibrieren";
    241. this->kalibrieren->Size = System::Drawing::Size(155, 23);
    242. this->kalibrieren->TabIndex = 10;
    243. this->kalibrieren->Text = L"Kalibrieren";
    244. this->kalibrieren->UseVisualStyleBackColor = true;
    245. this->kalibrieren->Click += gcnew System::EventHandler(this, &Form1::button5_Click);
    246. //
    247. // kalibladen
    248. //
    249. this->kalibladen->Enabled = false;
    250. this->kalibladen->Location = System::Drawing::Point(6, 50);
    251. this->kalibladen->Name = L"kalibladen";
    252. this->kalibladen->Size = System::Drawing::Size(155, 23);
    253. this->kalibladen->TabIndex = 11;
    254. this->kalibladen->Text = L"Kalibrierdatei laden";
    255. this->kalibladen->UseVisualStyleBackColor = true;
    256. this->kalibladen->Click += gcnew System::EventHandler(this, &Form1::button6_Click);
    257. //
    258. // groupBox4
    259. //
    260. this->groupBox4->Controls->Add(this->kalibrieren);
    261. this->groupBox4->Controls->Add(this->kalibladen);
    262. this->groupBox4->Location = System::Drawing::Point(14, 96);
    263. this->groupBox4->Name = L"groupBox4";
    264. this->groupBox4->Size = System::Drawing::Size(167, 79);
    265. this->groupBox4->TabIndex = 12;
    266. this->groupBox4->TabStop = false;
    267. this->groupBox4->Text = L"Kalibrierung";
    268. //
    269. // statusStrip1
    270. //
    271. this->statusStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(1) {this->toolStripStatusLabel1});
    272. this->statusStrip1->Location = System::Drawing::Point(0, 384);
    273. this->statusStrip1->Name = L"statusStrip1";
    274. this->statusStrip1->Size = System::Drawing::Size(521, 22);
    275. this->statusStrip1->SizingGrip = false;
    276. this->statusStrip1->TabIndex = 13;
    277. this->statusStrip1->Text = L"statusStrip1";
    278. //
    279. // toolStripStatusLabel1
    280. //
    281. this->toolStripStatusLabel1->Name = L"toolStripStatusLabel1";
    282. this->toolStripStatusLabel1->Size = System::Drawing::Size(118, 17);
    283. this->toolStripStatusLabel1->Text = L"toolStripStatusLabel1";
    284. //
    285. // Form1
    286. //
    287. this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    288. this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    289. this->ClientSize = System::Drawing::Size(521, 406);
    290. this->Controls->Add(this->statusStrip1);
    291. this->Controls->Add(this->groupBox4);
    292. this->Controls->Add(this->groupBox3);
    293. this->Controls->Add(this->groupBox2);
    294. this->Controls->Add(this->pictureBox1);
    295. this->Controls->Add(this->groupBox1);
    296. this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::Fixed3D;
    297. this->MaximizeBox = false;
    298. this->Name = L"Form1";
    299. this->SizeGripStyle = System::Windows::Forms::SizeGripStyle::Hide;
    300. this->Text = L"Greiferarmsteuerung";
    301. this->groupBox1->ResumeLayout(false);
    302. this->groupBox1->PerformLayout();
    303. (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->EndInit();
    304. this->groupBox2->ResumeLayout(false);
    305. this->groupBox3->ResumeLayout(false);
    306. this->groupBox4->ResumeLayout(false);
    307. this->statusStrip1->ResumeLayout(false);
    308. this->statusStrip1->PerformLayout();
    309. this->ResumeLayout(false);
    310. this->PerformLayout();
    311. this->comboBox1->Items->Clear();
    312. this->comboBox1->Items->AddRange(SerialPort::GetPortNames());
    313. }
    Alles anzeigen


    beim kompilieren bekomm ich aber leider folgende fehlermeldungen:

    Fehler 3 error C2355: 'this': Nur innerhalb nicht statischer Memberfunktionen verfügbar
    Fehler 4 error C2227: Links von "->starte" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    Fehler 5 error C2227: Links von "->Enabled" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    (davor noch 2 warnungen wegen den x und y als unreferenzierte variablen, dabei sind das nur error-handler und werden nicht weiter benötigt. zusätzlich der block 3, 4, 5 noch ein 2. mal. ;) )


    ich hoffe mal, das ist so jetzt etwas übersichtlicher. wahrscheinlich würde es in nem code-editor noch mal sehr viel übersichtlicher werden, da dort ja wenigstens eine farbige hervorhebung gemacht wird...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von locutus ()

  • Ich komme jetzt nicht mehr dazu das zu analysieren.

    Klick doch mal in der Fehlerliste auf den Fehler und Du bekommst die Zeile angezeigt, in der der Fehler ist. Dann kommentier diese Zeilen aus und starte den Debugger, dann lass Dir in der Überwachung mal this anzeigen.
    Sonst am Freitag kann ich erst wieder...

    Viele Grüsse
    biernase
  • ich hab jetzt mal - nach ewigen herumgesuche in den elementen des Buttons - folgende position für den enabled-wert gefunden:

    (((System::Windows::Forms::Control^)((((System::Windows::Forms::ButtonBase^)(starte)))->ImageKey)))->Enabled

    aber: wenn ich das als wert angebe und true setzen will, gibt mir der compiler trotzdem ewig viele fehler aus:

    Fehler 3 error C2843: 'Steuerung::Form1::starte': Die Adresse eines nicht statischen Datenmembers oder einer Methode eines verwalteten Typs kann nicht übernommen werden
    Fehler 4 error C2440: 'Typumwandlung': '' kann nicht in 'System::Windows::Forms::ButtonBase ^' konvertiert werden
    Fehler 5 error C2227: Links von "->ImageKey" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    Fehler 6 error C2227: Links von "->Enabled" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.


    was wohl so viel heißen soll wie "Das darfst du nicht machen!" -.-
    langsam glaub ich echt, ich würde wesentlich besser wegkommen, wenn ich mir jetzt visual c# aus der msdnaa ziehe und dort alles noch mal mache. vor allem auch, da visual studio 2010 auch noch .net 4.0-features zu nutzen scheint, wodurch das programm natürlich nicht gerade auf jedem rechner lauffähig wäre. :(
  • So, habe mal das Programm geladen.
    1) Habe wohl nur ComPort COM1.
    2) Weiss nicht was der so macht.
    3) Bei mir wird bei button4 aka Select der DataReceivedHandler nicht angesprungen.
    4) this im DataReceivedHandler gibt Fehlermeldung, daher auskommentiert.
    5) Versuch doch mal eine Member-Variable im DataReceivedHandler zu setzen und diese nach dem Handler irgendwie auszuwerten..
    6) C# kann man auch unter NET2.0 kompilieren.
    7) C++ Windows Forms macht Augenkrebs :)

    Gute N8
  • joa, c++ ist wirklich ziemlich unangenehm vom codelayout. -.-

    die datareceivedhandler soll an und für sich nur angesprungen werden, wenn daten in den in-buffer des comports geschrieben werden. von daher müsste das verhalten vollkommen normal sein.

    ich hatte mich jetzt die tage mal hingesetzt und das programm noch mal in c# aufgezogen, da hat dann letzten endes wirklich alles so funktioniert, wie es sollte. (die datareceived-handler-funktion einfach nicht als static definiert und schon gings!) also von daher läuft das programm jetzt bei mir zumindest so wie es soll - nur eben in ner anderen sprache.

    allerdings verwundert es mich trotzdem auch weiterhin, dass es nicht möglich ist, aus einer static-funktion einzelne elemente des form1-fensters zu verändern.

    aber vielen dank schon mal für die mühen! ^^