Variable in allen Cpp bekannt machen ( quasi global!)



  • Hi zusammen,

    werde langsam mal wieder so richtig wahnsinning. Ich habe eine SDI Anwendung mit mehreren Dialogen. Nun will ich unter meinen Cpp s werte (int) von einer Klasse an die andere bekannt machen. Habe da schon die wildesten Dinge im Auge aber klapp nix.
    Am liebste wäre mir eine Lösung mit

    extern int m_Variable
    

    gewesen, aber das bekomme ich nicht hin. Habe da schon einige Bsp. mir in Foren angeschaut. Also einem int m_variable = 3; in einer Cpp. Und dann in der nächsten, diese als extern zu deklariren. Leider funktioniert das nicht.

    Freu mich über Hilfeee! 🕶



  • SDI mit DOC/VIEW

    Variablen haben da in Klassen sowieso nicht verloren. Deshalb DOC/VIEW

    DOC speicher die Daten und View zeigt sie nur an.
    Eine Zeiger auf dein DOC mit GetDocument();



  • Hi Unix Tom,
    danke für den Hinweis, hatte schon mal von der Lösung über Doc und View gehört.Ich kenn mich ja nicht so aus, aber ist glaube ich normal, wie du das beschrieben hast oder? Also Variablen übers Doc übergeben.

    Allerdings, fände ich es schöner, es ohne diese Doc Klasse zu machen. Ich habe bisher meine Variablen, die ich brauche in meiner Dialog Klasse deklariert.

    A)Nun würde ich auch gerne dieser direkt an einen anderen Dialog senden. Wie gesagt, habe es erst klassisch (OOP) mit get und set einer privaten statischen Variablen aus einer Klasse versucht. (Geht wohl nicht in Visual C++).

    B)Dann noch mit "extern", was glaube ich funktionieren kann, bei mir aufgrund 😮 auch nicht funktioniert hat.

    C)Eine weitere viel versprechende methode wäre noch WM_COPYDATA, womit ich dann über SendMessage meine Nachricht verschicken könnte.

    Habe da so einige Ideen, könnte ihr mir evtl. Helfen, den Überblick zu behalten?
    So wie ich es bisher verstanden habe, müßte mein Problem über 😎 C) und DOC / VIew Klassen zu lösen sein.
    Wie habt Ihr das normalerweise bewältigt.
    Vielen Dank für eure Hilfe 👍



  • Du hast keine Dialog in einer SDI. Du kannst hier nur von ForView ableiten. Ist zwar auch ein Dialog aber wir wollen ja bei den Bezeichnungen bleiben die richtig sind.
    Ich mache sowas entweder über die Mainfrage welche eine Instanz einer Datenhalter-Klasse hat und alle Darauf zugreifen können oder über DOC/View was ählich dem ersteren ist oder übergib dem anderen Dialog/Formviewklasse eine Zeiger auf den ersten Dialog



  • HI
    hatte heute mal was Hilfe, haben eine Zeigen auf die Doc Klasse hinbekommen. Ist aber echt sehr kompliziert.
    Werde es mal mit diesem WM_COPYDATA versuchen. Müßte eigentlich auch gehen. Mal sehen.
    Habe schon ein paar Beispiele aus dem Netz aber die Umsetzung wird bestimmt noch haarig. 👍



  • meine persönliche meinung: dieses dokument-ansicht mag ja ganz sinnvoll sein, dennoch speichere ich in der dokumentenklasse absolut garnix (was nicht heissen soll, dass es keine fälle gibt, in denen man CDocument nicht braucht). ist meines erachtens auch nicht sehr sinnvoll, alle möglichen werte in die dokumentenklasse wild durcheinander reinzuklatschen. normalerweise werden die einzelnen werte in den einzelnen klassen berechnet/gespeichert, sie dann nochmal in CDocument abzulegen halte ich nicht für sinnvoll und erhöht die datenintegrität bestimmt nicht... . desweiteren holt man sich mit afxgetdocument usw auch nur ein globales objekt. nicht gerade im sinne des erfinders... .

    zur frage: mir fallen 2 möglichkeiten ein:
    mit extern: du belegst einfach eine theApp-variable mit deinem wert. theApp müsstest du dann problemlos einbinden können und den gewünschten wert abfragen können.
    per übergabe: es ist doch relativ simpel, jedem dialog einfach eine variable, bzw einen pointer auf diese zu übergeben, dann kannste dir das mit global sparen... .

    Esco



  • Hi,

    ich habe mich entschlossen, erstmal den weg, den ich eigentlich nicht so mag zu gehen. Also Variablen über mein Doc zu übergeben.

    CMai *pMainDlg;
    	pMai = new CMai;
    	pMai->Create(IDC_DIALOG, this);//Feher kann const int nicth in const Char* konvertiren
    	pMai->ShowWindow(SW_SHOW);
    	m_Flag = pMai->m_Flag;
    

    Habe diesen Funktionsaufruf in meiner Document klasse gemacht. Funktioniert nicht. In meiner View Klasse hat es geklappt. Habt ihr da mal einen Tip?
    👍



  • hi noch ein Nachtrag,

    habe auch einen Ähnlichen Fehler in dem Dialog, den ich aufrufen will. Will einen thread in OnInitial erzeugen. Klappt aber auch nicht.

    CWinThread* pThread = AfxBeginThread (thrFuncCheckParameter, this);//eine der 2 Ueberladungen kann Parameter 1 vom Typ 'unsigned int (void *)' konvertiert werden
    

    Naja weiß gerade auch nicht so recht weiter. Evtl. hat von euch ja einer ne Idee.
    Danke für nen Tip



  • Hallo.
    Korrigiert mich, wenn ich falsch liege, aber kann ich eine globale Variable nicht einfach ein der stdafx.h deklarieren? 😕 😕 😕



  • Esco schrieb:

    meine persönliche meinung: dieses dokument-ansicht mag ja ganz sinnvoll sein, dennoch speichere ich in der dokumentenklasse absolut garnix. ist meines erachtens auch nicht sehr sinnvoll, alle möglichen werte in die dokumentenklasse wild durcheinander reinzuklatschen. normalerweise werden die einzelnen werte in den einzelnen klassen berechnet/gespeichert, sie dann nochmal in CDocument abzulegen halte ich nicht für sinnvoll und erhöht die datenintegrität bestimmt nicht... . desweiteren holt man sich mit afxgetdocument usw auch nur ein globales objekt. nicht gerade im sinne des erfinders... .

    Wie du meinst!

    Hastt du schomal nachgezählt wieviele Funktionen es in der API gibt welche dir einen Zeiger auf eine Klasseninstanz zurückgeben.

    Wenn es das nicht gebe dann könnte man nie etwas ordentliches Programmieren und kapselung in Klassen würde so auch nicht funktionieren wenn man keine Zeiger auf diese Klassen bekommt.

    Wennn du Werte in einer DOC

    wild durcheinander reinzuklatschen

    dann solltest du dir nochmals Bücher über OOP bzw. Grundlagen besorgen.
    Diese Daten legt man auch Zielführend ab. Also auch wieder in Klassen wobei DOC dann die Klasseninstanz hält.
    Dies hat auch den Vorteil das man mit Serialize und wenigen Codezeilen den kompleten Inhlat dieser Klassen speichern kann.

    DOC/VIEW ist eben so definiert und hat auch seinen Sinn da es von einem DOC mehrere verschiedenen VIEW geben kann. Wenn Du diesen Sinn nicht verstehst dann verwende nur Dialoge oder du überzeugst mich vom Gegenteil.

    Einen Zeiger auf ein DOC ist übrigens nur eine Codezeile.

    MyDoc *pmydoc = GetDocument();



  • Das hat sich erledigt, ich habe diese Sache in Doc eingebaut, da brauche ich diese this nicht, da ein this auf das aktuelle Doc zeigt. hier nun nur NULL reinschreiben.

    CMai *pMainDlg;
        pMai = new CMai;
        pMai->Create(IDC_DIALOG, this);//Feher kann const int nicth in const Char* konvertiren
        pMai->ShowWindow(SW_SHOW);
        m_Flag = pMai->m_Flag;
    

    und hier hatte ich einen Fehler in der Funktionsdelaration gemacht. der Funktion "thrFuncCheckParameter"

    CWinThread* pThread = AfxBeginThread (thrFuncCheckParameter, this);
    

    Danke fürs drüber schauen 😉


Anmelden zum Antworten