Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Eigenschaftsblatt, Werte übergeben

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 < [ 2 ] [ 3 ]
000
22.01.2003, 08:37 Uhr
~Tom
Gast


Hallo ihr guten Leuts.

Bin dabei mir C++ selber beizubringen und habe nach ca 2 Monaten mein erstes richtiges Problem.
Ich denke mal das mir wer helfen kann, weil es ein altägliches Problem sein dürfte.
ALSO

Ich habe eine Anwendung gebaut mit Visual C++ mit dem Assistenten. (mfc)
habe 2 Propertypage seiten engefügt, habe die seiten eingerichte, habe ein CPropertySheet element gebaut und habe dieses alles in mein Hauptdialogfeld eingebaut das es jetzt in der OnInitDialog steht und bei jedem start gleich ausgefürt wird.
Soweit so gut. Mein Problem nu.

wie bekomme ich die werte die ich auf dem einen Eigenschaftenblatt in ein Textfeld schreibe in das nächste Eigenschaftenblatt übertragen (in ein Textfeld). Beide Textfelder haben Membervariablen.
Der übertrag soll erfolgen, wenn ich den Reiter oben wechsele.
Habe auch keine Ahnung welche Nachricht er dabei aufruft. Habe also noch keine Funktion die ausgelöst wird sobalt ich den Reiter wechsle.

Bitte helft mir, kämpfe schon ca 2 Wochen drann.

Danke im vorraus.
Tom
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.01.2003, 10:06 Uhr
~mike
Gast


Hi!
Irgendwo gibt es die genau Antwort im MFC Forum. Konnte sie leider nicht mehr finden. Lautete aber ca. so: Du bekommst mit mit SendMessage(hEdit, WM_GETTEXT) den Text der jeweilig anderen Page.

mfg mike
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.01.2003, 10:34 Uhr
~Tom
Gast


Vielen Dank für die Info.
Habe fast alle Posts durchgesehen und habe mich dafür entschieden, das nix davon auf mich zutrift.
Alle fragen wie man die Eigenschaftsblätter baut. Aber keiner fragt nach Werte übergeben.

Tut mir leid, mit "SendMessage(hEdit, WM_GETTEXT) " kann ich leider nix anfangen. Bin ebend erst neu in C++.
Trotsdem Danke.
Tom
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.01.2003, 11:43 Uhr
Volle



Hi,

ein Beispiel, wie man das recht einfach lösen kann...

Der Grundgedanke ist, dass du das in deiner Sheetklasse lösen tust, weil dort zur Laufzeit die Instanzen der einzelnen Pages "bekannt" sind.

Du übergibst jeder deiner Pages per Konstruktor einen Pointer auf das Sheet. In deiner Sheetklasse schreibst du ein Funktion, die Variablen von der einen Page liest und auf die andere Page überträgt. Das kannst du ganz einfach mit Set- bzw. GetDlgItemText usw. machen.
Diese Funktion rufst du auf, wenn die Page gewechselt wird. Dazu musst du die Funktion OnKillActive in deiner Pageklasse überschreiben. Diese Funktion wird aufgerufen, wenn eine PropertyPage den Fokus verliert. Von dort rufst du dann über den Sheetpointer deine Funktion in der Sheetklasse zum Kopieren der Daten auf.

Grüße, Volle.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.01.2003, 12:27 Uhr
~Tom
Gast


Vielen Dank für den Tip,

ABER *dummausderWäscheguckt*

Mit der Aufruffunktion ist alles klar, mit dem KillActive auch,
aber mit dem Pointer üebrgeben net.
Kannst du mir das bitte nochmal langsam zum mitmeisseln erklären?

Wo erstelle ich den Pointer? Im Konstruktor meiner Page Klasse.
Hast du bitte ein Stück Syntax wie ich das schreibe und wie ich das übergebe?

In meiner Hauptklasse habe ich schon ein Sheet Objekt (CPropertySheet m_sheet)und "Variablen" auf meine Tabs (CTab m_pageMyPage, CTab1 m_pageMyPage1, CTab2 m_pageMyPage2) erstellt. (Brauche ich zum anzeigen in der OnInitDlg) Die sind doch aber nur im Hauptdialog gültig, oder? Kann ich mit dennen was anfangen?

THX, Tom
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.01.2003, 15:30 Uhr
Volle



Hallo Tom,

ich habe ein Beispiel. Aber das finde ich gerade nicht. Deshab nochmal eine Erklärung...

Du musst den (oder die) Konstruktor(en) deiner PageKlassen wie folgt abändern oder überladen:

CDeinePage1::CDeinePage1(CDeinSheet* pSheet);

Dann rufst du den Konstruktor der Page in deiner Sheetklasse so auf:

Im Header der Sheetklasse steht vermutlich irgendwo

CDeinePage1* page1;

dann heißt es irgendwo

page1 = new CDeinePage1;

und da machst du dann

page1 = new CDeinePage1(this); draus.

Jetzt hast du in deiner Page1 einen Pointer auf das Sheet und kannst die Funktion zum Handlen der Daten in OnKill.. aufrufen:

pSheet->DataHandler();

Der Rest in der Implementierung in dem Handler sollte kein Thema mehr sein. Die Daten aus der einen Page holen und in die andere reinschreiben. Dafür nimmst du die Pointer aus deinem Hauptdialog (Sheetklasse). Die sind dafür genau richtig. Also die selben, die du auch für AddPage benutzt hast. Mit einem Text aus einem Editfeld würde das etwa so aussehen:

page1->GetDlgItemText(IDD_EDITBOX, stringVar); //lesen
page2->SetDlgItemText(IDD_EDITBOX, stringVar); //schreiben

Alles klar?

Ich schau mal nach dem Beispiel. Aber wird etwas später.

Grüße, Volle.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.01.2003, 15:50 Uhr
~Tom
Gast


Vielen Danke, ich werde es mal mit deiner Weise probieren.
Aber die Situation die ich jetzt habe, ist anders als die die du jetzt beschrieben hast.

In dem Header meines Sheets steht garnix.
In dem Header meines Hauptdialoges steht

C++:
     CTab m_pageMyPage;
    CTab2 m_pageMyPage2;
    CTab1 m_pageMyPage1;
    CPropertySheet m_sheet;

als Public deklariert.

und das, steht im Hauptdialog in der OnInitDialog()

C++:
    m_sheet.AddPage (&m_pageMyPage);
    m_sheet.AddPage (&m_pageMyPage1);
    m_sheet.AddPage (&m_pageMyPage2);
    
    m_sheet.Create (this,WS_CHILD|WS_VISIBLE,0);
    m_sheet.ModifyStyleEx (0,WS_EX_CONTROLPARENT);
    m_sheet.ModifyStyle (0,WS_TABSTOP);
    CRect rect;
    GetDlgItem(IDC_TAB1/*mein tabsteuerelement*/)->GetWindowRect(&rect);
    ScreenToClient(&rect);
    m_sheet.SetWindowPos(NULL,rect.left -7,rect.top-7,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE);



Damit, rufe ich das auf und es geht.
Kannst du damit was anfangen? Oder habe ich jetzt schon völlig daneben gehauen?

gruss
Tom
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.01.2003, 18:13 Uhr
Volle



Hi,

ich gehe mal davon aus, dass du deine Gründe haben wirst. Aber eigentlich gehören die Pages zum Sheet, und nicht zum aufrufenden Dialog. So sieht es das Framework zumindest vor. Was natürlich nicht heißt, dass man es nicht auch anders machen kann, falls das sinnvoll ist.

Wenn du es ändern willst, brauchst am Code selbst gar nicht viel machen.

Diese Zeilen

C++:
    CTab m_pageMyPage;
    CTab2 m_pageMyPage2;
    CTab1 m_pageMyPage1;


nimmst aus dem Header des Dialoges raus und kopierst sie in das Header des Sheets.

Diese 3 Zeilen verschiebst

C++:
    m_sheet.AddPage (&m_pageMyPage);
    m_sheet.AddPage (&m_pageMyPage1);
    m_sheet.AddPage (&m_pageMyPage2);


du in den Konstruktor (am beste in beide, die Sheetklasse har 2) der Sheetklasse und läßt das

C++:
m_sheet.

einfach weg.

Den Rest solltest eigentlich so lassen können, wie er ist. Du hast es dann etwas einfacher mit den Pointern.

Wenn du deinen Code so lassen willst, wie er ist, dann musst du entweder dafür sorgen, dass du die benötigten Page- Pointer an die Sheetklasse übergibst, z.B. wieder über den Konstruktor analog zu den Pages, oder du setzt den Handler in die Klasse des aufrufenden Dialoges. Ich kenne gerade jedenfalls keine Member- Funktion von CPropertySheet, die dir die Pointer auf die einzelnen Pages zurückliefert. Vielleicht gibt es sowas aber trotzdem. Das kann schon sein. Aber eigentlich "kennt" die Sheet- Klasse die Pointer ja, weil die Instanzen normalerweise dort gebildet werden.

Grüße, Volle.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.01.2003, 20:15 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Tom,
siehe auch:
showtopic.php?threadid=1202
Ist eigentlich das selbe Problem.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 28.04.2014 um 08:54 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
24.01.2003, 08:56 Uhr
Tom



Vielen Dank für die Tips.
@Volle habe es so umgebaut wie du gesagt hast, (hatte nämlich keinen Grund es so zu bauen weil ich mir das selber ausgedacht habe, bin ebend erst seid kurzem bei) er macht auch keinen Fehler mehr. Erst zur Laufzeit macht er Fehler.
Beim initialisieren des Sheets.

C++:
    m_sheet.Create (this,WS_CHILD|WS_VISIBLE,0);
    m_sheet.ModifyStyleEx (0,WS_EX_CONTROLPARENT);
    m_sheet.ModifyStyle (0,WS_TABSTOP);
    CRect rect;
    GetDlgItem(IDC_TAB1)->GetWindowRect(&rect);
    ScreenToClient(&rect);
    m_sheet.SetWindowPos(NULL,rect.left -7,rect.top-7,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE);

wenn ich das so in der OnInitialDialog mache, macht er bei ModifyStyleEx, ModifyStyle und SetWindowPos ein Problem.
Ich weis aber net, wie ich das anders Initialisieren kann.
Ich würde mich über ein Beispiel Prog freuen. Habe schon viele zu dem Thema downgeloadet, aber keins bei für mein Problem

THX
Tom
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: