tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
1548
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    SucheUndFinde SucheUndFinde ist offline Rookie
    Registriert seit
    May 2004
    Beiträge
    7
    hi zusammen! ich probier da nu wirklich ne Woche drann rum und stricke das Programm dauernd um, in der Hoffnung mein Problem umgehen zu können... (und ja, ich habe meinen Namen alle Ehre gemacht *g*)

    Ich arbeite unter WinXP MVStudio 6. Seit neuestem mit der MFC.

    Problem:

    Ich lass über ein Menübefehl ein Dialog anzeigen:
    ChildView.cpp
    Cdaten dlg;
    dlg.DoModal();

    und habe über den Klassenassistenten eine neue allgemeine Klasse angelegt. (also eine extra cpp und h datei). Die Headerdatei hab ich in Cdaten.cpp inkludiert.
    Nun sollen Funktionen dieser Klasse auf Dialogelemente (Textfeld,button etc.) zugreifen und verändern können (gerne auch auf Funktionen in dieser Dialogklasse - aber das müsste ja der selbe Weg des ansprechens sein)


    Ist bestimmt banal, aber mein schickes bhv-taschenbuch weigert sich standhaft mir die Lösung zu verraten
     

  2. #2
    Registriert seit
    May 2004
    Beiträge
    287
    Ähm, soll Cdaten von CDialog abgeleitet sein und du die Klasse Cdaten soll auf Dialogelemente zugreifen? Da brauchst du nur mit dem Klassenassistenten Variablen für deine Dialogelemente erstellen und dann kannst du ganz einfach mit ihnen arbeiten. Um aus der Klasse heraus Methoden aufzurufen, brauchst du dir Methoden einfach nur schreiben (à la printf(...). Oder verstehe ich hier was falsch?
     

  3. #3
    SucheUndFinde SucheUndFinde ist offline Rookie
    Registriert seit
    May 2004
    Beiträge
    7
    ob das davon abgeleitet is, weiß ich net so wirklich, hab halt das gemacht was in meinem schlauen Buch steht:

    hab mfc programm erstellt und da dann erstmal n neuen Dialog eingefügt, da dann verschiedene Textboxen usw. reingeklickt. Im Klassenassistent hab ich mir dann dafür die Klasse Cdaten erstellen lassen.
    Dort kann ich ja jetzt z.b.

    void Cdaten::OnCheck1()
    {
    }

    verarbeiten.

    Dann hab ich über den Klassenassistenten eine neue (allgemeine) Klasse zum Projekt hinzugefügt. Funktionen dieser Klasse sollen jetzt eben auf Schaltflächen usw. des Dialoges zugreifen.
    mit
    Cdaten.SetItemText
    geht das ja 'scheints nich...
     

  4. #4
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Also eine andere Klasse soll auf die Kontrollelemente einer Instanz deiner Dialogklasse zugreifen können, richtig?

    Ich war schon dabei, dir eine genaue Erklärung zu schreiben, als mir auffiel, dass dein Dialog ja modal ist. Es gibt eigentlich keine sinnvolle Möglichkeit, von aussen auf die Kontrollelemente eines modalen Dialoges zuzugreifen. So einen Dialog fütterst du vor dem Öffnen mit Daten und liest die Resultate nach dem Schliessen aus. Dazwischen ruht die aufrufende Anwendung. Man kann das zwar auf verschiedene Weise umgehen, aber es ist keine gute Idee. Ein modaler Dialog sollte sich einfach so verhalten. Falls das aus irgendeinem Grund nicht möglich ist, verwende lieber einen nichtmodalen Dialog.

    Jedenfalls, eine gute Möglichkeit wäre es, die Kontrollelemente mit dem Assistenten mit Membervariablen versehen zu lassen (z.B. CEdit m_ctlMeinEdit). Wenn du diese in der Headerdatei deines Dialoges public machst, falls sie es nicht schon sind, kannst du an den Stelle, wo du Instanzen deiner Dialogklasse verwendest, auf diese Controls zugreifen. Im Falle eines modalen Dialoges allerdings nur vor und nach Öffnen und Schliessen des Dialoges. An die eigentlichen Controls kommst du allerdings nicht heran, weil die entweder noch nicht erzeugt oder schon zerstört sind. SetItemText() kannst du da vergessen.

    Ich hoffe, ich konnte dir einen Schubs in die richtige Richtung geben -- falls nicht, frag bitte noch mal nach.
    Geändert von Kachelator (14.06.04 um 20:54 Uhr)
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  5. #5
    SucheUndFinde SucheUndFinde ist offline Rookie
    Registriert seit
    May 2004
    Beiträge
    7
    Danke für diese einleuchtende Erklärung !
    das bedeutet, ich muss alle Funktionen, die ein Button auslösen könnte auch in selbiger Dialogklasse unterbringen ?
    das is ärgerlich.. mmh dann probier ichs über einen anderen Weg:
    ich strukturier das Programm dann mal wieder um .. und komm dann wieder auf dieses topic zurück

    wenn ich grad schon mal den Meister (ja, ich les öfters hier im Forum *g*) an der Strippe hab:
    wie übergeb ich denn ein dynamisches Array an eine Funktion als Referenz ?
    ...
    matrix = new int[zeilen][20];
    ...
    void verarbeiten( matrix) {

    }
    was erwartet der compiler bei den Fragezeichen ?

    thx
     

  6. #6
    Registriert seit
    Jan 2002
    Ort
    Bayern
    Beiträge
    1.390
    das bedeutet, ich muss alle Funktionen, die ein Button auslösen könnte auch in selbiger Dialogklasse unterbringen ?
    Also normalerweise schon, aber wenn du etwas Erfahrung in C++ hast, dann kannst du das auch umgehen, in dem du mit einem CallBack arbeitest, also quasi dei Dialog eine Funktion "auserhalb" aufruft.
    Stichwort Funktionszeiger.

    Gruß Homer
     
    we would change the world if god gave us the source code...
    and remember, science is nothing more than reverse engineering nature...

    Current projects:
    - LdrawConverter

  7. #7
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    @SucheUndFinde:

    Aua, da habe ich jetzt nicht mit gerechnet...

    Ich würde einen std::vector oder ein zweidimensionales boost::multi_array per Referenz übergebn. Wenn du willst, erkläre ich das bei Gelegenheit.

    Aber auf die Schnelle... würde ich es eventuell so etwa machen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    int zeilen = 20;
     
    void verarbeiten( int* irgendeinpointeraufvieleints )
    {
      // hier muss das programm [zeilen * 20] kennen
      int zeile = 7;
      int spalte = 5;
      irgendeinpointeraufvieleints[  zeile +  spalte * zeilen ] = 4711;
    }
     
    int main()
    {
      int*  matrix = new int[zeilen * 20]; // Zugriff ist klar, oder?
     
      verarbeiten( matrix );
     
      return 0;
    }
     
    }

    Das mit dem "[ zeile + spalte * zeilen ]" ist eine immer wieder irreführende Definitionssache. Keine Ahnung, ob ich mich jetzt vertan habe. Jedenfalls ist es eine Möglichkeit, die geforderten zwei Dimensionen mit einem eindimensionalen Array zu simulieren. Ich rate dennoch heftig zu boost::multiarray.

    ---
    @Daniel:
    Also normalerweise schon, aber wenn du etwas Erfahrung in C++ hast, dann kannst du das auch umgehen, in dem du mit einem CallBack arbeitest, also quasi dei Dialog eine Funktion "auserhalb" aufruft.
    Über Callbacks stolpert man zwar alle zwei Schritte, wenn man sich mit Windows beschäftigt, aber man sollte sie vermeiden. Callbacks sind pures, bösartiges Ur-C. Sie stehen im direkten Widerspruch zur Objektorientierung.
    Ist ja schon schlimm genug, wenn man sich mit SendMessage() rumärgern muss.
    Geändert von Kachelator (14.06.04 um 21:13 Uhr)
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  8. #8
    SucheUndFinde SucheUndFinde ist offline Rookie
    Registriert seit
    May 2004
    Beiträge
    7
    mmh ?
    na, das mit dem Erstellen des Arrays is kein Problem.. das geht ja alles - ich weiß nur nich wie ich es an eine Funktion übergeben kann...

    Code :
    1
    2
    3
    4
    5
    6
    7
    
    headerdatei:
    enum { elemente=27};
    int (* matrix)[elemente];
     
    source:
    cin >> zeilen;
    matrix = new int[zeilen][elemente];
    void verarbeiten (&matrix) {

    }
    geht ja net..


    P.S. warum wird hier das neudeutsche Wort "f-u-n-z-t" gefiltert ? *g*
     

  9. #9
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    ich weiß nur nich wie ich es an eine Funktion übergeben kann...
    Übergib nur den Zeiger auf's Array, so wie ich im letzten Post.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  10. #10
    SucheUndFinde SucheUndFinde ist offline Rookie
    Registriert seit
    May 2004
    Beiträge
    7
    ah ok danke

    ist diese Art von Array wohl ein wenig uneffektiv?
     

  11. #11
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Eher unpraktisch.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

Ähnliche Themen

  1. Aus einer Klasse auf die Form zugreifen...
    Von thespecialx im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 21.02.08, 10:42
  2. Von einer Klasse auf die Form zugreifen
    Von Eroli im Forum .NET Windows Forms
    Antworten: 21
    Letzter Beitrag: 02.04.07, 09:52
  3. Auf Variable einer Klasse zugreifen
    Von Metha im Forum PHP
    Antworten: 7
    Letzter Beitrag: 14.05.06, 15:54
  4. Antworten: 0
    Letzter Beitrag: 21.01.05, 15:31
  5. Antworten: 3
    Letzter Beitrag: 09.04.03, 14:47