Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » aus klasse a ein editbox-feld in klasse b

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.07.2002, 17:34 Uhr
~cristian
Gast


hallo,

ich habe folgendes problem:

ich habe eine klasse CblaView (abgeleitet von CEditView) und eine CblaForm (abgeleitet von CFormView).

Wie kann ich jetzt aus einer methode der CblaView klasse eine editbox in der CblaForm klasse mit einem string füllen?

ich habe es fplgendermaßen probiert (ohne erfolg):

in einer Methode von CblaView mache ich

C++:
CblaForm tmp;
tmp.OnUpdateEditBox();

--


in der Methode OnUpdateEditBox aus der klasse CblaForm

C++:
void CblaForm::OnUpdateEditBox()
{
CblaView var;
// Die Methode OnGetNewString aus der CblaView Klasse gibt mir einen CString zurück.
// Diesen will ich in der editBox anzeigen lassen..
m_editBoxStr = var.OnGetNewString();

// Hier kommt die Fehlermeldung
UpdateData(FALSE);
}




Fehlermeldung lautet
"Es wurde versucht, eine nicht unterstütze Operation auszuführen."
in einer MessageBox mit einem Ausrufezeichen-Symbol.

Kann es sein das ich weil ich ein Objekt der Klasse CblaForm erstellt habe, nicht UpdateData aufrufen kann, sondern nur direkt aus der Klasse selber? Weil wenn ich eine Button neben das editBox-Feld setze der die Gleiche Methode aufruft funktioniert es ohne Probleme..

Hat einer eine Idee oder ienen Vorschlag wie ich es anders machen kann?


Oder wie aktualisiert ihr aus einer klasse a ein feld in klasse b, so das es auch auf dem bildschirm sichtbar wird?

vielen dank und gruß aus bonn,
christian

Dieser Post wurde am 25.07.2002 um 17:36 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.07.2002, 19:28 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Christian,
*nachdenk* ! Du machst mich neugierig! wenn Du ein CEditView hast, wie rufst du den CFormView auf? Ist Dein Objekt (schon/noch) beim Versuch der Übergabe existent?
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.07.2002, 09:17 Uhr
~Christian
Gast


Hallo Uwe,

ersteinmal vielen Dank für das verschieben in das neue Forum hier

Zum Thema:

Zitat:
Uwe postete
wenn Du ein CEditView hast, wie rufst du den CFormView auf?

folgenderweise:

in CblaView (abgel. von CEditView)

C++:
// Auswahl eine Menüeintrages -> OnEingabeTest wird durch Messagehandle aufgerufen.
// In OnEingabeTest erstelle ich ein Objekt der Klasse CblaForm (abgel. von CFormView).
void CblaView::OnEingabeTest()
{
  CblaForm tmp;
  tmp.OnUpdateEditBox();
}[/Code]

in CblaForm (abgel. von CFormView)
[Code]
void CblaForm::OnUpdateEditBox()
{
  // du wirst dich fragen warum ich jetzt wieder ein objekt erstelle..
  // die methode GetString() aus der Klasse CblaView liefert mir einen CString, den ich gerne in dem Textfeld angezeigt haben möchte.
  // das versuche ich folgendermaßen:

  CblaView tmp2;
  m_edtstr = tmp2.GetString();
  // hier passiert es. wenn ich die folgende Zeile auskommentiere, funkioniert es einwandfrei und ich kann bspw. mit MessageBox(m_edtstr) den String auch anzeigen lassen.

  UpdateData(FALSE);
}


wenn ich bspw. aus der CblaForm Klasse die Methode GetString() aufrufe, funktioniert es auch wuderbar.
Der String wird in die m_edtstr Variable geschrieben und die Ansicht wird aktualisiert.


Zitat:
Uwe postete
Ist Dein Objekt (schon/noch) beim Versuch der Übergabe existent?

Ich glaube hier hänge ich gerade fest. da ich ja den menüeintrag und die formview in verschiedenen klassen liegen habe, muss ich ja versuchen diese gegenseitig mit instanzen der jeweiligen klasse aufzurufen.

das heist ich erstelle ein objekt der formview klasse sobald ich den menüeintrag aus der CblaView auswähle und versuche mit diesem das feld zu füllen.

kann es sein das ich ein festes objekt jeder klasse benötige, das die ganze laufzeit über präsent ist? wenn ja wie kann ich das machen? soltle ich grundsätzlich eine instanz für jede klasse parad haben? stichwort: konstruktor?


Kannst Du mir folgen bzw. mir einen Vorschlag geben wie ich dieses Objekt gewirre in den Griff bekomme?

Vielen Dank und viele Grüße aus Bonn,
Christian

Dieser Post wurde am 26.07.2002 um 16:49 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.07.2002, 19:18 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Christian,
Das mit Aufruf war eigentlich anders von mir gemeint. Ein Formview ist doch im Prinzip ein von CDialog abgeleiteter Dialog, welchen ich entweder in einer z.B. SDI Anwendung als Clientbereich nutze oder aber ihn (was eigentlich unüblich ist) als modalen oder nichtmodalen Dialog aufrufe. Da du mit CEditView arbeitest, mußt du doch irgendwie entweder den EditView gegen den FormView austauschen oder ihn auf eine andere Art aufrufen.

Auf alle Fälle solltest du einen Zeiger nutzen etwa so:
((CblaView*) pmyview)-> DeineFunktion();
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 26.07.2002 um 21:26 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.07.2002, 16:07 Uhr
~Christian
Gast


Hallo Uwe,

die FormView habe ich in einer Konsole im MDI-MainFrame verankert. Das sieht vom aufbau her in etwa wie der folgende Bereich des Bildes:
http://codeguru.earthweb.com/docking/mrc_docktest.gif
Für die "Konsole" habe ich eine eigene Klasse "CAForm".


Zitat:
Uwe postete
Auf alle Fälle solltest du einen Zeiger nutzen etwa so:
((CblaView*) pmyview)-> DeineFunktion();



Bei ((CAForm *) pForm)->OnFunktion() kommt eine Speicherzugriffs-Schutzverletzung. Ich habe auch die "AForm.h" inkludiert.

Kann es sein das die Fehlermeldung dadurch zustande kommt das ich aus der Funktion in die ich aufrufe wiederum eine andere Funktion aufrufe und dessen Rückabewert verarbeite? Das Dürfte doch eigentlich nicht weiter schlimm sein oder?


Vielen Dank und viele Grüße aus Bonn,
Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.07.2002, 21:48 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Christian,
ich habe jetzt nicht die Klasse herunter geladen, aber wenn ich mir das so bei Codeguru durchlese: Kannst du deine Anwendung debuggen? Wenn ja wohin springt der Debugger bei F11?
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.07.2002, 09:47 Uhr
~Christian
Gast


Hallo Uwe,

wenn ich F11 drücke, springt er in ../MFC/SRC/APPMODUL.CPP.

Jetzt was anderes. ICh glaube ich habe meinen Fehler gefunden, kann ihn aber nicht lösen. Ich versuche das mal zu umschreiben ...

Ich habe zwei Klassen - CAForm und CBView.
CBView kann mit DDE umgehen. Die andere nicht. Jetzt möchte ich ja oben aus dem Menü (Datei) eine Methode der CBView Klasse aufrufen, die mir einen String über den DDE Kanal von einem anderen Programm holt.
Jetzt habe ich den String. Nun möchte ich diesen String an die CAForm Klasse übergeben um ihn in einem Textfeld anzuzeigen. Hier ist das Problem.

Mir ist beim Debuggen aufgefallen das er an der Stelle stehen bleibt, an der ich versuche die Variable die dem Textfeld zugeordnet ist (m_EditString) mit dem String zu füllen.

Beispiel:

C++:
In CBView, wenn der Menüpunkt ausgewählt wird

CBView::OpenChannel()
{
  // DDE-Kanal öffnen

  ((CAForm *)pForm)->OnUpdateEditBox();
  // pForm ist in der AForm.h als CAForm *pForm deklariert.
}

In CAForm nun ..

CAForm::OnUpdateEditBox()
{
  CBView tmp;
  // OnGetString() ist eine Methode aus CBView, die mir einen CString zurückgibt.
  m_EditString = tmp.OnGetString();

  UpdateData(FALSE);
}


Hier knallt es... (m_EditString = tmp.OnGetString())
Un ich verstehe nicht warum.. Die Variablen auf die ich zugreife, sind public.. Von daher dürfte es auche keine Zugriffsprobleme geben.

Ich versteh es nicht...

Gruß,
Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.07.2002, 21:34 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Christian,
Da können einige Faktoren einspielen und so kommen wir nicht so recht weiter. Eigentlich müsste es nach Deiner beschriebenen Vorgehensweise funktionieren. Wenn Du willst, schick mir mal das Projekt (kann auch eine minimale Version sein.). Macht sich immer besser wenn man so etwas vor sich hat.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
30.07.2002, 22:31 Uhr
~Christian
Gast


Hallo Uwe,

vielen Dank für Deine Mühe. Wenn Du Dir die Zeit nehmen möchtest einmal selber drüber zu schauen, würde ich mich freuen.
Ich werde Dir dann morgen ein Beispielprogramm zuschicken. Ich muss nur schauen wie ich es mit dem anderen Programm hinbekomme, aus dem ich ja den String per DDE hole. Aber das klappt schon irgendwie ...

Vielen Dank schon einmal im voraus

Gruß,
Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
31.07.2002, 17:38 Uhr
~Christian
Gast


Hallo Uwe,

ich habe gerade gesehen das es zu der Klasse die ich da verwende auch eine Online-Hilfe gibt. www.datamekanix.com/sizecbar/

Trotzdem kann ich mein Problem nicht richtig nachvollziehen.. Ich habe Dir übrigens eine Demo an Deine E-Mail Adresse aus dem Profil geschickt..

Viele Grüße,
Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: