Name und Position vom Button ändern!!



  • Öffne die Datei... geh bis zum 1. [Button] guck dann ob darunter der Name: kommt... wenn nicht brichst de ab und suchst nach dem nächsten [Button] usw...



  • Hallo,

    meine Antwort kommt ein bißchen spät, da ich in den letzten Tagen Probleme mit meinem PC hatte.
    Die Datei kann ich mittlerweile im Programm holen und kann auf die verschiedenen Attributen (Name, Position etc..) des Elementes "Button" zugreifen, aber ich kann leider immer noch keinen Button aus diesen Attributen erstellen.
    Für eine kleine Hilfe wäre ich sehr dankbar.

    Gruß, Pox



  • Wieso... wie sieht denn dein Ansatz aus? Du musst ja nur nen CButton erstellen...



  • Die Attributte wurden zuerst in den Variablen Button-Name, X, Y, Breite und Hoehe geholt. dann habe ich flogendes im Proramm eingefügt:

    class CMainFrame : public CFrameWnd
    {
     ......
     protected:
        CButton *m_pButton;
    };
    
    CMainFrame::CMainFrame()
    {
     m_pButton = new CButton;
    }
    CMainFrame::~CMainFrame()
    delete m_pButton;
    }
    
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
     .....
     CRect rectButton(X,Y,Breite,Hoehe);
     m_pButton->Create("Button-Name", WS_Broder | WS_VISIBLE, rectButton, this, IDC_Button);
    }
    

  • Administrator

    Also erstens ist mir ein wenig ein Rätsel was du mit dem Button im Mainframe machen willst, aber ok, ich meine das geht auch.
    Zweitens du musst das Objekt nicht unbedingt auf dem Heap erstellen. Man darf ruhig eine CButton Variable in den Members der Klasse anlegen. Gerade da CMainFrame als Klasse auf dem Heap angelegt wird soweit ich weiss. Wie auch die CView Klasse usw.

    Also ich bleib aber mal bei deinem Beispiel. Dann müsste das so aussehen:

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        // ...
    
        if(!m_pButton->Create(_T("Button-Name"), WS_CHILD | WS_VISIBLE, CRect(X, Y, X + Breite, Y + Hoehe), this, IDC_BUTTON))
        {
            TRACE(_T("Couldn't create the Button!\n"));
            return -1;
        }
    
        // ...
    }
    

    Und wenn immer noch ein Problem besteht, bitte sagen was für eins. Also gibt der Compiter ein Fehler aus? Wenn ja welchen? Oder gibt es einen Laufzeitfehler? Angaben? usw.
    Geht nicht, gibts nicht! 😉

    Grüssli



  • Nur eine Button erstellen bringt nicht viel. Man muss ihn auch anzeigen.
    Siehe member von CButton. (ShowWindow() oder so ähnlich)


  • Mod

    ShowWindow wird nicht benötigt, wenn WS_VISIBLE gesetzt ist!



  • ich habe hier was gefunden, vielleicht hilft Dir weiter:

    1-Button anlegen

    CButton neu_button;
    
    neu_button.Create( "Button-Name", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rect, this,CButton neu_button);
    

    2-Nachricht vom Button verarbeiten

    class CMainWindow : public CFrameWnd
    {
      public:
         CMainWindow();
         CButton neu_button;
    
      protected:
         afx_msg void OnPaint();
         afx_msg void OnSize( UINT nType, int cx, int cy );
         afx_msg void OnNeuButtonClicked();
         DECLARE_MESSAGE_MAP()
    };
    
    #include <afxwin.h>
    #include „CMainWindow.h“
    
    BEGIN_MESSAGE_MAP(CMainWindow, CFrameWindow)
       ON_WM_PAINT()
       ON_WM_SIZE()
       ON_BN_CLICKED(IDC_BUTTON_START, OnNeuButtonClicked)
    END_MESSAGE_MAP()
    
    CMainWindow::CMainWindow()
           :
           :
    


  • ups, ich habe mich beim letzten Parameter vertippt

    CButton neu_button;
    
    neu_button.Create( "Button-Name", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rect, this, IDC_neu_button);
    


  • @Nixet: Schwachsin. In deinem Code sind soooo viele Fehler...

    @Pox: Am besten ließt du beim start die Anzahl an Buttons aus und erstellst dann einen Array mit der Größe... und rufst dem enstprechend dann auch die Create Function jeweils auf...



  • Hallo,

    Die Anwendung habe ich neu erstellt, danach ging 1. Methode und konnte einen Button erstellen.
    @Draverse: Deine Schreibweise ging auch.

    Dravere schrieb:

    Also erstens ist mir ein wenig ein Rätsel was du mit dem Button im Mainframe machen willst, aber ok, ich meine das geht auch.
    ...

    Wie macht man das sonst?

    (D)Evil schrieb:

    Öffne die Datei... geh bis zum 1. [Button] guck dann ob darunter der Name: kommt... wenn nicht brichst de ab und suchst nach dem nächsten [Button] usw...

    Einen wietern Button kann ich leider nicht erstellen.
    Es geht nur mit dem ersten defenierten Button.
    Ich habe's mit xml und tinyxml probiert, aber leider ohne Erfolg... ich kriege das einfach nicht hin. Ich bin echt am verzweifeln. 😕



  • Dann zeig deinen Code... da wird der Fehler sein 😃


  • Administrator

    Pox schrieb:

    Hallo,

    Die Anwendung habe ich neu erstellt, danach ging 1. Methode und konnte einen Button erstellen.
    @Draverse: Deine Schreibweise ging auch.

    Dravere schrieb:

    Also erstens ist mir ein wenig ein Rätsel was du mit dem Button im Mainframe machen willst, aber ok, ich meine das geht auch.
    ...

    Wie macht man das sonst?

    Es geht nicht darum, dass dies falsch ist. Es geht darum, wo du deine Buttons haben willst. Es kann natürlich schon sein, dass du deine Buttons im Mainframe haben willst. Aber wenn du sie in der View haben willst, dann ist das erstellen im Mainframe natürlich komplett falsch. Und gerade weil du dem Benutzer die Möglichkeit geben willst, selber die Koordinaten und co der Buttons zu definieren, sehe ich das Mainframe irgendwie gar nicht als korrekte Stelle. Denn entweder ist am Ende kein Platz mehr für das View oder das View versteckt die Buttons, da es über ihnen gezeichnet wird. Also es kommt halt eben drauf an, was du am Ende willst.

    Pox schrieb:

    Einen wietern Button kann ich leider nicht erstellen.
    Es geht nur mit dem ersten defenierten Button.
    Ich habe's mit xml und tinyxml probiert, aber leider ohne Erfolg... ich kriege das einfach nicht hin. Ich bin echt am verzweifeln. 😕

    (D)Evil schrieb:

    Dann zeig deinen Code... da wird der Fehler sein 😃

    Grüssli



  • Meine Antwort kommt jetzt wieder ein bißchen spät, da ich nach einem totalen Absturtz meines PC's alles neu installieren mußte...

    XML-Datei:

    <Steuerelemente>
       <Button>
         <Name> Test </Name>
         <Position_X> 10 </Position_X>
         <Position_Y> 20 </Position_Y>
         <Hoehe> 60 </Hoehe>
         <Breite> 100 </Breite>
       </Button>
    
       <Button>
        .
        .
    
    </Steuerelemente>
    

    Um die Attribute eines Eelements (Button) auszulesen habe ich folgendes geschrieben: (Code ohne Errorhandling)

    TiXmlElement* root = doc.RotEelement();  //Steuerelemente
    TiXmlElement* elem;
    const char button_name;
    int pos_X, pos_Y, h, b;
    
    elem = root->FirstChildElement("Button");
    elem->Attribute("Name", &button_name);
    elem->Attribute("Position_X", &pos_X);
    elem->Attribute("Position_Y", &pos_Y);
    elem->Attribute("Heohe", &h);
    elem->Attribue("Breite", &b);
    

    Um alle Child Elemente durchzulaufen habe ich folgendes geschrieben

    for( elem = root->FirstChildElement("Button"); elem; elem = elem->NextSiblingElement("Button")  )
    {
    .
    .
    }
    


  • Kennt sich hier keiner mit TinyXml aus, der mir weiter helfen könnte?
    Danke im Voraus.

    Grüsse, Pox



  • Hallo,

    mit dem folgendem Code kann ich mittlerweile alle Buttons durchlaufen:

    .
    .
    TiXmlElement* root = doc.RootElement();  
    
    if (strcmp(root->Value(), "Steuerelemente")!=0)  
    { throw runtime_error(string("falsches Wurzel:") + root->Value()); }  
    
    for (TiXmlElement* button = root->FirstChildElement();  
         button;  
         button = button->NextSiblingElement() )  
    {  
         Start_Fenster.push_back(nodeToButton(button));  
    }
    

    Mein Problem ist, dass ich leider nicht genau weiß, wie ich eine Objectlist aufbauen soll, in denen Referenz auf alle Elemente (Objekte) gesetzt werden sollen. Dann durch die Liste gehen, nach Namen suchen und entsprechende Details setzen.

    Danke



  • Hallo,

    mit dem folgendem Code kann ich mittlerweile alle Buttons durchlaufen:

    .
    .
    TiXmlElement* root = doc.RootElement();  
    
    if (strcmp(root->Value(), "Steuerelemente")!=0)  
    { throw runtime_error(string("falsches Wurzel:") + root->Value()); }  
    
    for (TiXmlElement* button = root->FirstChildElement();  
         button;  
         button = button->NextSiblingElement() )  
    {  
         Start_Fenster.push_back(nodeToButton(button));  
    }
    

    Mein Problem ist, dass ich leider nicht genau weiß, wie ich eine Objectlist aufbauen soll, in denen Referenz auf alle Elemente (Objekte) gesetzt werden sollen. Dann durch die Liste gehen, nach Namen suchen und entsprechende Details setzen.

    Danke


Anmelden zum Antworten