PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c++.net] Labeltext in Mainfunktion bzw. außberhalb der Form1 ändern



litlein
09.04.2010, 12:17
Hallo,
ich will den Text eines Labels außerhalb der Form1 Klasse, z.B. in der main()-Funktion ändern.
Ausgangslage: Ein einfaches label auf der Form. Dann den Modifier des labels auf "Public" gesetzt.

Der Code:
Mainfunktion

// Hauptfenster erstellen und ausführen
Form1 ^f1 = gcnew Form1();
Application::Run(f1);
f1->label1->Text = "Hallo";
f1->setLabel1("Hi");
Dann die Form1:

#pragma once


namespace abc {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

/// <summary>
/// Zusammenfassung für Form1
///
/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
/// die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
/// das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
/// Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
/// arbeiten, die diesem Formular zugewiesen sind.
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: Konstruktorcode hier hinzufügen.
//
}

protected:
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
public: System::Windows::Forms::Label^ label1;
protected:

private:
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
void InitializeComponent(void)
{
this->label1 = (gcnew System::Windows::Forms::Label());
this->SuspendLayout();
//
// label1
//
this->label1->AutoSize = true;
this->label1->Location = System::Drawing::Point(109, 84);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(35, 13);
this->label1->TabIndex = 0;
this->label1->Text = L"label1";
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 273);
this->Controls->Add(this->label1);
this->Name = L"Form1";
this->Text = L"Form1";
this->ResumeLayout(false);
this->PerformLayout();

}


//Die eigene Funktion zum verändern des Labels, der rest ist unverändert
public: void setLabel1(System::String ^abcde)
{
this->label1->Text = abcde;
}
#pragma endregion
};
}



Bei dem ganzen Code kommen keine Fehlermeldungen. Das label bleibt nur auf dem Standartwert "label1" stehen, also es verändert sich nicht.

Laut googlesuche sollte beides, einmal die Möglichkeit mit der funktion und das publik setzen und direkte Aufrufen funktionieren...


Gibt es noch andere Möglichkeiten?

cookie-exploit
06.05.2010, 14:04
Bei dem ganzen Code kommen keine Fehlermeldungen. Das label bleibt nur auf dem Standartwert "label1" stehen, also es verändert sich nicht.
Das ist eigentlich relativ logisch, da wenn du die Form aufrufst dich nciht mehr im main befindest, doch die ganze Zeit in der Form bist, die andern Befehler werden erst ausgeführt, wenn du die Form bereits geschlossen hast.

Effekt: es passiert ncihts.




Gibt es noch andere Möglichkeiten?

Packe es einfach in das Form_load rein^^, oder mach halt eine Funktion, die das macht, oder halt einen Button der das Label ändert...es gibt viele Möglichkeiten.
Doch es muss sich alles in der Form abspielen.

Man kann natürlich auch in einer 2. Form, die die erste aufruft, das Label von der ersten ändern, dann muss man den Construktor aber die Referenz oder Adresse der ersten Form zur verfügung stellen.