globaler MainWindow-Zeiger



  • Hallo,

    ich bin auf der Suche nach einer Funktion, die mir von jedem Programmpunkt aus das Hauptfenster zurück liefert (alternative Lösung mittels globalem Zeiger). Hintergrund ist, dass mein MyWindow (von Form abgeleitet) eine ImageList enthält, auf deren Bilder ich in der Klasse MyPaintBox (von PictureBox abgeleitet) zugreifen will. Dabei will ich nicht mit einem Übergabeparameter arbeiten.

    Im Ergebnis so was wie "MyPaintBox.Image = Application::MainWindow->ImageList.Images[0]"

    Frage Eins : Gibt es eine fertige Funktion, die (header-)dateiübergreifend aufgerufen werden kann (quasi ein globales "FindControl") ?

    Frage Zwei: Wie würde es als globaler Zeiger realisiert werden ?
    Mein bisheriger Versuch... (halloWindow wurde benutzt, damit keine Kollision mit evtl. bestehender MainWindow-Variablen auftritt)

    aus 1. Datei (globals.h)
    // globale Variablen
    ref class MyWindow; // forward-Deklaration, von Form abgeleitet.
    ref class MyPaintBox; // forward-Deklaration, von PictureBox abgeleitet.
    extern public gcroot<MyWindow^> halloWindow; // gcroot, weil verwalteter Typ.

    aus 2. Datei (Main.cpp)
    int main(array<System::String ^> ^args)
    ...
    Form^ halloWindow = gcnew MyWindow(); // zurück in Form umwandeln, da "Run" sonst nicht läuft.
    Application::Run(halloWindow);
    return 0;

    aus 3. Datei (PaintBox.h)
    // Konstruktor
    MyPaintBox::MyPaintBox (usw...)
    this->Image = ::halloWindow->ImageList1.Images[0]; // (Fehler) "::halloWindow" scheint zu klappen, aber wie weiter ??

    Bonusfrage : Weshalb taucht "halloWindow" im Objektbrowser nicht unter "Globale Funktionen und Variablen" auf, wo es doch als "extern public" angegeben wurde ?

    Schon mal Danke im Voraus



  • Das Hauptfenster kannst du als statisches Klassenmember deklarieren
    und vor

    Application::Run(halloWindow);
    

    initialisieren.

    Alex



  • Hmm, es will nicht so recht. Was meinst Du konkret ?

    in globals.h habe ich nunmehr
    static gcroot<MyWindow^> halloWindow;

    in Main.cpp
    halloWindow = gcnew MyWindow();
    Application::Run(halloWindow);

    Ergibt Fehler beim Compilieren:
    Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ '::MyWindow ^' akzeptiert (oder keine geeignete Konvertierung möglich)

    --------------------
    ALTERNATIV
    in globals.h keine Definition mehr.

    in MyWindow.h
    public ref class MyWindow : public Form {
    static MyWindow^ halloWindow; // als Klassenmember in MyWindow
    ...
    Konstruktor
    halloWindow = this; // klappt

    in PaintBox.h kann ich nicht mehr darauf zugreifen, da es jetzt eine Variable von MyWindow.h ist, auf die in PaintBox.h nicht mehr zugegriffen werden kann und ein globaler Zeiger nicht mehr existiert.



  • Zu dem Fehler:
    Ist MyWindow in einem Namespace deklariert?

    zur alternativen Möglichkeit:

    tekkin schrieb:

    in PaintBox.h kann ich nicht mehr darauf zugreifen, da es jetzt eine Variable von MyWindow.h ist, auf die in PaintBox.h nicht mehr zugegriffen werden kann und ein globaler Zeiger nicht mehr existiert.

    Warum kannst du auf die statische Referenz nicht zugreifen?
    Du muss doch nur "MyWindow.h" includen...

    Alex



  • Danke Alex, für Deine Mühe.
    Ich habe es nach langem probieren hinbekommen. Es lag an den Namespaces und an der extern-Anweisung.


Anmelden zum Antworten