c++ aus einer klasse auf dialog textfeld zugreifen

SucheUndFinde

Grünschnabel
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 :(
 
Ä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?
 
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...
 
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.
 
Zuletzt bearbeitet:
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
 
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
 
@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:
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.
 
Zuletzt bearbeitet:
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:
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*
 
Zurück