Button Namen ändern aus externe Datei



  • Ich habe in meiner form Datei ja die Funktion

    public: void setzeButtonText(String ^text)
           {
              button1->Text = "test";
            }
    

    Die dann intern in der Datei den Button Namen ändert.
    Wenn ich diese dann in der cpp(main) aufrufe geht es sogar das ich den Button Namen änder

    formbutton->setzeButtonText("test");
    	Application::Run(formbutton);
    

    wenn ich allerdigns das ganze nach Application::Run aufrufe geht es nicht mehr.



  • Kann ich vielleicht mit einer Vorwärtsdeklaration das ganze lösen?



  • themonk schrieb:

    Ich habe in meiner form Datei ja die Funktion

    public: void setzeButtonText(String ^text)
           {
              button1->Text = "test";
            }
    

    Die dann intern in der Datei den Button Namen ändert.
    Wenn ich diese dann in der cpp(main) aufrufe geht es sogar das ich den Button Namen änder

    formbutton->setzeButtonText("test");
    	Application::Run(formbutton);
    

    wenn ich allerdigns das ganze nach Application::Run aufrufe geht es nicht mehr.

    Also du hast da ein fehler, nicht? button1->Text = text;
    meinst du wohl.



  • Also du hast da ein fehler, nicht? button1->Text = text;
    meinst du wohl.

    Ja klar aber zum testen kann ich da ja auch button1->Text = "test";stehen, am Ende soll natürlich text da stehen. Aber die Funktionen gehen ja alle soweit.
    Nur da die beiden Header Datein gegenseitig Zugreifen funktioniert das ganze nicht. Ich habe gelesen das man dies mit Vorwärtsdeklaration lösen kann stimmt das und wenn ja wie muss das ungefär ausssehen.

    Das ganze muss ja so aussehen das form.h die Funktion but in formbutton.h aufruft. but ruft dann wieder in form.h setzeButtonText auf nur hier ist das Problem.
    Ich habe bis jetzt geschafft but aus der cpp(main) aufzurufen aber nicht aus der form.h.



  • Wenn du formbutton.h in .cpp (main) instanziert hast, kannst du die diese Instanz nur über .cpp (main) ansprechen. Oder aber du übergibst einen Zeiger. Oder schreibst eine Funktion mit dem Rückgabetyp *(Zeiger) in die .cpp

    Natürlich kannst du auch für jede Operation die mit der Klasse getätigt werden soll, diese Klasse jedes mal neu instanzieren. Solltest dann aber die voherigen Instanzen voher auflösen.

    Eine weitere möglichkeit ist eine statische (static) Klasse. Diese kannst du dann immer mit Namespace und immer mit dem gleichen Namen aufrufen. Dies ist dann sinvoll wenn du, dass was in dieser Klasse ist immer nur single benötigt wird.

    Du könntest aber u.a. auch wenn du von form.h Methode but() aufrufst, nur einen Rückgabewert erwarten. Also das sich Mehtode but() nicht um das Ziel kümmert. Diese Methode ist übrigens die gängigste!
    Dazu tust du in form.h formbutton.h instanzieren, und tust an der Stelle wo ein neuer Wert zu gewiesen sol, nach dem = den Instanznammen hinzufügen und zeigst über -> auf die Funktion, die das Ergebnis zurückgibt.
    Damit diese Funktion was zurückgibt musst du sie statt mit void, mit dem gewünschten Rückgabetyp deklarieren. Bei deinem Fall zur Button Text-Eigenschaft währe, dass String ^

    Die Funktion gibt das zurück was in der Funktion mit return angegeben wird. Eine Variable oder eine Konstante.



  • Du könntest aber u.a. auch wenn du von form.h Methode but() aufrufst, nur einen Rückgabewert erwarten. Also das sich Mehtode but() nicht um das Ziel kümmert. Diese Methode ist übrigens die gängigste!
    Dazu tust du in form.h formbutton.h instanzieren, und tust an der Stelle wo ein neuer Wert zu gewiesen sol, nach dem = den Instanznammen hinzufügen und zeigst über -> auf die Funktion, die das Ergebnis zurückgibt.

    Dann würde das ganze so aussehen:
    formbutton^test3= gcnew formbutton("12");

    button1->Text=test3->but("test");

    Dann bekomme ich den Fehler:error C2065: 'formbutton': nichtdeklarierter Bezeichner



  • Die Klasse ist am Ort der instanzierung eingebunden (#include "...")?
    formbutton ist der Name der Klasse?
    Ist ein Namespace vorhanden, musst du diesen vohr formbutton mit :: setzten, Bsp. formbutton::formbutton ^FormButton = gcnew formbutton::formbutton();

    Wichtig: Wenn du inerhalb einer Funktion() instanziert, kann sie nur inerhalb der Funktion() angesprochen werden. Möchtest du es in mehren Funktionen() ansprechen musst du die instanzierung Global in der Klasse machen, dass heist unter dem Konstruktor.

    Übrigens kannst du eine Klasse mit Parameter nur instanzieren, wenn du Übergabeparameter im Konstruktor dieser Klasse deklarierst.



  • Die Klasse ist am Ort der instanzierung eingebunden (#include "...")?

    Das ist ja das Problem wenn ich formbutton.h vor form.h einbinde meckert der Compiler das er für das Namespace in formbutton.h nichts findet.

    'formularprojekt ': Es ist kein Namespace mit diesem Namen vorhanden

    Das ist ja das Problem mit der reihenfolge des Includens egal wie ich das mache es fehlt immer einer Datei der Bezug zur anderen.



  • themonk schrieb:

    Die Klasse ist am Ort der instanzierung eingebunden (#include "...")?

    Das ist ja das Problem wenn ich formbutton.h vor form.h einbinde meckert der Compiler das er für das Namespace in formbutton.h nichts findet.

    'formularprojekt ': Es ist kein Namespace mit diesem Namen vorhanden

    Das ist ja das Problem mit der reihenfolge des Includens egal wie ich das mache es fehlt immer einer Datei der Bezug zur anderen.

    Du hast also "using namespace formbutton;" eingetragen? Mach das mal ohne using namespace und verwende wirklich formbutton::formbutton



  • Also die anfänge beider Dateien sehen so aus:
    formbutton.h

    #pragma once
    namespace buttonform {
    using namespace System;
    using namespace formularprojekt;
    ref class formbutton// ... blabla
    {
    
    public: formbutton(Form1^ form1)
            {
    ....
    

    form.h

    #pragma once
    #include "formbutton.h"
    namespace formularprojekt {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    ...
    

    Und dann kommt:

    formbutton.h(4) : error C2871: 'formularprojekt ': Es ist kein Namespace mit diesem Namen vorhanden



  • uuuuf also langsam...

    von wo aus greifst du auf die Klasse mit dem namespace formularprojekt zu?



  • Aus der cpp(main)

    #include "stdafx.h"
    #include <windows.h>
    #include <stdio.h>
    #include "Form1.h"
    #include <time.h>
    
    using namespace formularprojekt;
    ....
    


  • Naja mach doch einfach statt using namespace formularprojekt, formularprojekt::Form1()



  • gib der formbutton.h einen anderen namespace.



  • gib der formbutton.h einen anderen namespace.

    Umbennnen?
    Und in der formbutton.h habe ich den Fehler in dieser Zeile
    public: formbutton(Form1^ form1)
    soll ich da
    public: formbutton(formularprojekt::Form1^ form1)
    machen?


Anmelden zum Antworten