Datenübertragung zwischen Fenstern
-
Hi,
folgende Problem:
ich versuche momentan einen sehr spezialisierten Rechner bzw. Teschenrechner für Chemie zu implementieren. Ich verwende dabei wxWidgets. Vom Design her wollte ich ein Hauptfenster machen, in dem nach einer spezieller Syntax verschiedene Dinge eingetragen werden können. Die Verarbeitung der Eingabe und Berechnung ist auch bereits fertig unf funktioniert einwandfrei. Allerdings wollte ich neben diesem Hauptfenster einige Nebenfenster machen. Ein Beispiel wäre einen mit einem Periodensystem. Ich hatte mir gedacht, ich könne dort ein Bild des PSE einfügen und bei einem Mausklick die Position berechnen und auf das angeklickte Element schließen. Nun zum Kern des Problems: Ich weiß leider nicht, wie ich dafür sorgen kann, dass durch diesen Klick eine Reaktion im Hauptfenster ausgelöst werden kann, wodurch das angeklickte Element zur Eingabe hinzugefügt wird.
Ich würde euch bitten mir bei der Lösung dieses Problems zu helfen.Danke SpiGAndromeda
P.S. ich freue mich schon auf viele schöne Lösungen.
achso und die Nebenfenster haben das Hauptfenster nicht als Parent
wenn jemand nicht weiß was ich für ein Design meine: Paint.NET verwendet ein ähnliches bei den Farbpaletten etc.
-
Du solltest das Hauptfenster global machen (falls du das nicht bereits getan hast).
1. Das Event selbst in deinem Eventhandler verarbeiten.
2. Falls du für das Hauptfenster eine eigene Klasse von wxFrame abgeleitet hast, kannst du dort eine Funktion für die Verarbeitung eines Klicks machen, die von deiner Eventfunktion aufgerufen wird.Wobei hast du denn genau Probleme?
-
Das habe ich jetzt auch alle gemacht.
Es tauchen dabei allerdings mehrere Problem auf:
1. Ich arbeite mit wxDEvC++. Dort wird in einem TopWindow (Name des PRogramms +App) immer das erste Fenster aufgerufen. Dort habe ich in der Cpp Datei außerhalb der Methoden den Zeiger auf das erste Fentster (Hauptframe) dklrariert. Jetzt habe ich das Probelm, dass ich diese Deklaration in alle Nobenfenster noch bekommen muss. Ich hab versucht alle globalen Fariablen in eine Header Datei zu bekommen, und die dann zu includieren, aber da bekomme ich immer die Fhlermeldung einer invaliden Präprozeesor direktive von #include.
2. Ich habe leider noch keine Möglichkeit gefunden, einen Mausklick auf einem wxStaticBitmap abzufangen. Der EVENT_TABLE der automatisch angelegt wird, geilt ja nur für den Dialog an sich.Es wäre schön, wenn ihr mir auch bei diesen Problemen noch helfen könntet.
mfg
SpiGAndromeda
-
Schau dir mal das MVC Pattern an, da geht es auch um dein Problem.
Grundsätzlich wäre dein Problem auch mit einer Art Observer lösbar, so das dein Hauptfenster entsprechend benachrichtigt wird, wenn sich im Nebenfenster etwas tut.
Mit Boost::function kannst du sowas recht einfach umsetzen, dann hält dein Periodenfenster einfach eine liste aus Boost::function objekten, welche jeweils bei einer Änderung aufgerufen werden.
Wenn dann dein Hauptfenster das Periodenfenster erstellt, kannst du auch gleich ein boost::function objekt übergeben, welches auf eine Methode in deinem Hauptfenster zeigt:struct PeriodWindow : public wxPanel { std::vector<boost::function<void(Element*)> > observers; PeriodWindow(wxWindow* p,boost::function<void(Element*)>& func):wxPanel(p){observers.push_back(func);} void OnClick(){Element* x = getElement(pos);//periode ermitteln for(size_t i=0; i < observers.size(); ++i) observers[i](x); } }; ... MainWindow Constructor... boost::function<void(Element*)> func = boost::bind(this,&MainWindow::UpdateElement,_1); periodwindow = new PeriodWindow(this,func);
Und wechsel die IDE, damit wirst du sonst nämlich nicht weit kommen, CodeBlocks würde ich für wxWidgets heute verwenden.
phlox
-
1. Poste mal bitte die Präprozessordirektive und den Fehler.
2. Hast du es schon mal mit wxEvtHandler::Connect() oder PaintEvent versucht? (oder statt der StaticBitmap ein DC nehmen, bin dort aber noch unerfahren)
-
danke erstmal für den Rat mit Code Blocks, aber ich hab das mal ausprobiert und ich hab mich zum einen an wxDevC++ gewöhnt und ich fand Code::blocks irgendwie nicht wirlich toll.
Das was du geschrieben hast, verstehe ich leider absolut nicht...ich programmier zwar schon seit 3 Jahren C++, aber nur in meiner Freizeit.
Ich wollte das eig relativ einfach machen:
Das sind die ...App Datein (die sind ja bei Dev bei nem Projekt immer ganz oben):App.h
#ifndef __MASSENBERECHNUNG_FRAMEApp_h__ #define __MASSENBERECHNUNG_FRAMEApp_h__ #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include <wx/wx.h> #else #include <wx/wxprec.h> #endif class Massenberechnung_FrameApp : public wxApp { public: bool OnInit(); int OnExit(); }; #endif
App.cpp
#include "Massenberechnung_FrameApp.h" #include "Nukleinsaeure_Basen_Dlg.h" IMPLEMENT_APP(Massenberechnung_FrameApp) bool Massenberechnung_FrameApp::OnInit() { SetTopWindow(Massenberechnung_Frame1); Massenberechnung_Frame1->Show(); Nukleinsaeure_Basen_Dlg* Nukleinsaeuren_Dlg = new Nukleinsaeure_Basen_Dlg(NULL); Nukleinsaeuren_Dlg->Show(); return true; } int Massenberechnung_FrameApp::OnExit() { return 0; }
über Nukleinsaeure_Basen_Dlg.h werden auch globale Variablen includiert:
globale_variablen.h#include "Massenberechnung_Frame.h" extern Massenberechnung_Frame* Massenberechnung_Frame1;
globale_Variablen.cpp
#include "globale_Variablen.h" Massenberechnung_Frame* Massenberechnung_Frame1 = new Massenberechnung_Frame(NULL);
ich dachte mir, wenn ich das Hauptfenster global mache, dann könnte ich ja einfach in einem der Nebenfenster eine Methode des Hauptfenster aufrufen und die daten als Argument übergeben.
Compilieren lässt sich das Programm, aber jetzt arbeitet der Rechner nur kurz und dann wird der PRozess wieder bebendet. Es werden also keine Fenster aufgerufen.wäre schon wenn ohr mir wieterhelfen könntet
mfg
SpiGAndromeda
-
Also das mit den globalen Variablen solltest du dir mal abgewöhnen, das macht man nicht.
Wenn es unbedingt global sein soll, dann nimm einen Singleton.Und evtl. schaust du dir mal die beiden Tutorials zu wxWidgets im C++ Magazin an.