Übergabe von Daten aus einer EditBox an ein View.



  • Hi Leute ;),

    ich habe ein kleines SDI Programm geschrieben welches eine EditBox in der ToolBar enthält.
    Die EditBox reagiert auf das drücken der Returntaste indem der eingegebene Wert in einer MessageBox, die in der PreTranslateMessage der EditBox aufgerufen wird, ausgegeben wird.
    Es ist doch aber so, dass Daten im Doc verarbeitet und im Vie dargestellt werden sollen, deshalb würde ich den Wert der in der EditBox an das View übergeben um ihn dann dort in einer MessageBox darzustellen !

    Ich versuch das jetzt schon seit einigen Tagen ung krieg es einfach nicht gebacken 😞
    Ich hab mir auch schon die Finger wund gegoogeld aber zum Thema Conrols in der ToolBar schein es nur ComboBox Beispiele zu geben un die müssen nicht auf Return reagieren oder sonstwas, ich weis nicht wo das Problem ist und was ich noch machen kann ! 😞

    Ich möchte nicht zuviel Code posten aber die MyEdit.cpp und die MyEdit.h sowie die View.h
    werdet Ihr sicher brauchen :

    MyEdit.cpp:

    // MyEdit.cpp
    
    #include "stdafx.h"
    #include "MyEdit.h"
    
    #include "Test.h"
    #include "NEW_cLoadFile.h"
    
    #include "MainFrm.h"
    
    CMyEdit::CMyEdit()
    {
    }
    
    CMyEdit::~CMyEdit()
    {
    }
    
    BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
    END_MESSAGE_MAP()
    
    BOOL CMyEdit::PreTranslateMessage(MSG* pMsg)
    {
    	NEW_cLoadFile mlf;
    	cTest test;
    
        if (pMsg->message == WM_KEYDOWN && VK_RETURN == pMsg->wParam) 
        {
            return TRUE;
        }
        else if (pMsg->message == WM_KEYUP && VK_RETURN == pMsg->wParam) 
        {
    		CString cstrNumber;
    		GetWindowText(cstrNumber);
            test.testFunktion(cstrNumber);
    
    		CView* pView = (((CMainFrame*)AfxGetMainWnd())->GetActiveView());
    
            return TRUE;
        }
    
        return CEdit::PreTranslateMessage(pMsg);
    }
    

    MyEdit.h:

    // MyEdit.h
    #pragma once
    
    class CMyEdit : public CEdit // Ableiten von CMyEdit von CEdit
    {   
    	public:
    		CMyEdit();
    		~CMyEdit();
    
    		 BOOL PreTranslateMessage(MSG* pMsg);
    
    		 CString m_MyEditAusgabe;
    
    	protected:
    		DECLARE_MESSAGE_MAP()
    };
    

    View.cpp:

    // NonButton Ctrl in ToolBar 1View.cpp 
    #include "stdafx.h"
    #include "NonButton Ctrl in ToolBar 1.h"
    
    #include "MyEdit.h"
    
    #include "NonButton Ctrl in ToolBar 1Doc.h"
    #include "NonButton Ctrl in ToolBar 1View.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    IMPLEMENT_DYNCREATE(CNonButtonCtrlinToolBar1View, CView)
    
    BEGIN_MESSAGE_MAP(CNonButtonCtrlinToolBar1View, CView)
    	//{{AFX_MSG_MAP(CNonButtonCtrlinToolBar1View)
    
    	//}}AFX_MSG_MAP
    	// Standard-Druckbefehle
    	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
    END_MESSAGE_MAP()
    
    CNonButtonCtrlinToolBar1View::CNonButtonCtrlinToolBar1View()
    {
    }
    
    CNonButtonCtrlinToolBar1View::~CNonButtonCtrlinToolBar1View()
    {
    }
    
    BOOL CNonButtonCtrlinToolBar1View::PreCreateWindow(CREATESTRUCT& cs)
    {
    	return CView::PreCreateWindow(cs);
    }
    
    void CNonButtonCtrlinToolBar1View::OnDraw(CDC* pDC)
    {
    	CNonButtonCtrlinToolBar1Doc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    }
    
    BOOL CNonButtonCtrlinToolBar1View::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	// Standardvorbereitung
    	return DoPreparePrinting(pInfo);
    }
    
    void CNonButtonCtrlinToolBar1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    
    }
    
    void CNonButtonCtrlinToolBar1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    }
    
    #ifdef _DEBUG
    void CNonButtonCtrlinToolBar1View::AssertValid() const
    {
    	CView::AssertValid();
    }
    
    void CNonButtonCtrlinToolBar1View::Dump(CDumpContext& dc) const
    {
    	CView::Dump(dc);
    }
    
    CNonButtonCtrlinToolBar1Doc* CNonButtonCtrlinToolBar1View::
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CNonButtonCtrlinToolBar1Doc)));
    	return (CNonButtonCtrlinToolBar1Doc*)m_pDocument;
    }
    #endif //_DEBUG
    
    void CNonButtonCtrlinToolBar1View::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
    {
    		CString text;
    
                    //?????????????????????????????????????????
    
    		MessageBox(text,text,MB_OK);
    
    }
    

    Es ist wie verhext 😡
    Hoffentlich könnt Ihr mir helfen !

    Vielen Dank für Eure Mühe und Hilfe vorab
    Gruß, hoffnungsvoll 😉
    ShadowEater

    P.S.: Ein kleines SampleProjekt mit dem gleichen Problem könnt Ihr bei Bedarf hier runterladen:
    http://www.filehosting.at/files/download.php?file=be2dd28431f7924453796eb53193f345



  • Weis denn wirklich niemand wie das geht ? 😕 🙄 😞

    Gruß
    ShadowEater 😉



  • ShadowEater schrieb:

    Weis denn wirklich niemand wie das geht ? 😕 🙄 😞
    Oder hab ich irgendwie falsch geposted ?

    Gruß
    ShadowEater 😉



  • Hi,

    ist meine Frage zu dämlich , zu kompliziert oder hab ich falsch gepostet ?

    Gruß
    ShadowEater


  • Mod

    Wie soll der Ablauf sein? Wen die Eingabetaste gedrückt wird, soll das Document benachrichtigt werden, doder der View?

    Wenn das Handling über den View geschieht mach es so:
    Im Toolbar (wenn die Eingabetaste gedrückt wird) besorge Dir den aktiven View (GetActiveView), dann besorge Dir das Document (GetDocument), dann rufe UpdateAlViews auf!
    Nun wird es spannend, UpdateAllViews kann Parameter mitbekommen. So genannte Hints, mit denen man Infos weitergeben kann. Du kanst damit z.B. einen Zeiger auf ein COBject mitgeben das hier die entsprechenden Daten enthält...

    Oder Du rufst direkt eine Methode im Dokument auf, wenn der Toolbar sowieso nur mit einem Dokumenten Typ auskommen muss.



  • Hi Martin 😉 ,

    ja genau, wenn die Eingabetaste gedrückt wir soll der Wert der in der TextBox in das Sdi View geschrieben werden, zu Testzwecken.
    Im fertigen Programm wird nachdem die Eingabetaste gedrück wurde eine Funktion aufgerufen die den Wert in der Textbox braucht um eine eine Textdatei zu laden, deren Inhalt wird in einen CString geschrieben, dieser wird dann an das View weiergereicht. Das Aufrufen der "LadeDatei" ist kein Prob. aber ich schaffe es nicht den Wert der in der Textbox steht in da View zu schreiben 😞

    Ich hab das MessageHandling hier mal versucht MyEdit.cpp:

    // MyEdit.cpp
    
    #include "stdafx.h"
    #include "MyEdit.h"
    
    #include "Test.h"
    #include "NEW_cLoadFile.h"
    
    #include "MainFrm.h"
    
    CMyEdit::CMyEdit()
    {
    }
    
    CMyEdit::~CMyEdit()
    {
    }
    
    BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
    END_MESSAGE_MAP()
    
    BOOL CMyEdit::PreTranslateMessage(MSG* pMsg)
    {
    	NEW_cLoadFile mlf;
    	cTest test;
    
        if (pMsg->message == WM_KEYDOWN && VK_RETURN == pMsg->wParam) 
        {
            return TRUE;
        }
        else if (pMsg->message == WM_KEYUP && VK_RETURN == pMsg->wParam) 
        {
    //test ist der TestText
    		CView* pView = (((CMainFrame*)AfxGetMainWnd())->GetActiveView());
    	 	pView->SendMessage(WM_SETTEXT,0,'test');
    
            return TRUE;
    
     }
    
        return CEdit::PreTranslateMessage(pMsg);
    }
    

    View.cpp:

    void CNonButtonCtrlinToolBar1View::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
    {
    
    		CString text;
    
    }
    

    Wäre klasse wenn Du da korrigierend 💡 eingeifen könntest. 😕 😕 😕
    Ich seh da einfach kein Land, muss aber auch sagen dass ich bisher ausschließlich mit "normalen" Dingen also Dlgs, verschiedenen Views, SDI's und MDI's gelernt und das Messagehandling hab ich bisher so noch überhaupt nich gemacht nur über den Assistenten.
    Werd das aber schkeunigst nachholen wenn ich das Prg. abgegeben hab !

    Vielen dank für Deine / Eure Hilfe und Mühe
    Mfg
    Shadoweater 😉


  • Mod

    Würdest Du einfach noch mal mein Postinglesen! Wäre nett..., denn was Du hier gemacht hast hat nichts mit dem zu tun was ich geschrieben habe.

    1. Verwende nicht PreTRanslateMessge Deiner privaten CEdit Klasse sondern Deines Toolbars.
    2. Verwende nicht SendMessage WM_SETTEXT sondern UpdateAlViews wie ich geasgt habe. Oder rufe direkt eine Methode des Dokumentes auf, wenn Du schon so brutal castest.
    3. Warum denkst Du, dss bei OnUpdate as ankommt, wenn Du WM_SETTEXT sendest. OnUpdate wird nur durch UpdateAlViews bedent.



  • 😕



  • Hi Martin,;)

    danke für Deine Anwort, tut mit leid dass ich mich erst jetzt melde war aber leider früher nicht möglich !

    Ich habe es jetzt so gemacht wie Du gesagt hast (hoff ich) !
    Wenn dem nicht so sein sollte liegt es daran dass ich Dich nicht ganz verstanden habe.

    Die MxEdit habe ich rausgeworfen.
    PreTranslateMessage wird nun in der NEW_ToolBar verwendet.
    In New_ToolBar habe ich außerdem noch

    #include "MainFrm.h"
    

    eingepflegt !

    Der Code in der NEW_ToolBar.cpp sieht nun wie folgt aus:

    #include "stdafx.h"
    #include "NonButton Ctrl in ToolBar 1.h"
    
    #include "MainFrm.h"
    
    #include "NEW_cToolBar.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    //***********************************************************************************************************************
    #define  EDITLEN 80 
    #define  EDITPOS 3 
    //*********************************************************************************************************************** 
    
    NEW_cToolBar::NEW_cToolBar()
    {
    }
    
    NEW_cToolBar::~NEW_cToolBar()
    {
    }
    
    BEGIN_MESSAGE_MAP(NEW_cToolBar, CToolBar)
    	//{{AFX_MSG_MAP(NEW_cToolBar)
    		// HINWEIS - Der Klassen-Assistent fügt hier Zuordnungsmakros ein und entfernt diese.
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // Behandlungsroutinen für Nachrichten LBE_cToolBar 
    //*********************************************************************************************************************** 
    BOOL NEW_cToolBar::LoadToolBarEx (UINT id)
    {
    
    	bool bReturn;
    	bReturn = NEW_cToolBar::LoadToolBar (id);
    
    	int iPosition = CommandToIndex (ID_nEDIT);
    
    	SetButtonInfo (iPosition,ID_nEDIT,TBBS_SEPARATOR,EDITLEN);
    
    	CRect rect;
    	GetItemRect (iPosition, &rect);
    	rect.bottom = 20;
    
    	DWORD dwStyle = WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL;/*ES_NUMBER|*/
    	m_Ctrl_EDIT.CreateEx(WS_EX_CLIENTEDGE,_T("EDIT"),NULL, dwStyle, rect, this, ID_nEDIT);
    
    	return bReturn;
    }
    //*********************************************************************************************************************** 
    BOOL NEW_cToolBar::PreTranslateMessage(MSG* pMsg)
    {
        if (pMsg->message == WM_KEYDOWN && VK_RETURN == pMsg->wParam) 
        {
            return TRUE;
        }
        else if (pMsg->message == WM_KEYUP && VK_RETURN == pMsg->wParam) 
        {
    
    		// MessageBox("funktioniert","funktioniert",MB_OK);
    		// UpdateAllViews(NULL);
    		// CView* pView = 
    	   (((CMainFrame*)AfxGetMainWnd())->GetActiveView()->GetDocument()->UpdateAllViews(NULL));
            return TRUE;
        }
    
        return NEW_cToolBar::PreTranslateMessage(pMsg);
    }
    

    In der View.cpp habe ich nur :

    void CNonButtonCtrlinToolBar1View::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
    {
    	// TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
    	CString cstrAusgabe;
    	SetWindowText(cstrAusgabe);
    
    }
    

    hinzugefügt, da ich durch das ganze ausprobieren wahrsch. den Wald vor lauter Bäumen nicht mehr seh habe 😞 ich alles aus der Funktion geworfen was falsch war !!!

    Ich bekomme jetzt zwar keine Fehlermeldung mehr aber sobald ich das Projekt starte blitzt es nur kurz auf und verschwindet dann wieder ! 😞
    Ich habe das geänderte CodeSnippet angehängt falls mehr source gebraucht wird !
    Wäre klasse wenn Du das irgendwie korrigieren könntest. Ich bin total festgefahren . 😞

    Vielen Dank für Deine / Eure Hilfe und Mühe 🙂
    Gruß
    ShadowEater

    http://www.filehosting.at/files/download.php?file=2f9b38164cbd0bfc403d37107c26cea4

    Übrigens habe ich selbstverständlich Deinen Post gelesen, da aber nicht geklappt hat was ich versucht habe hat das Ausprobieren angefangen, war ein Fehler !



  • Hi,

    das aufblitzen hat sich erledigt, ich hatte den falschen ReturnWert aus meinem eigenen Control übernommen, jetzt sieht das ganze so aus:

    BOOL LBE_cToolBar::PreTranslateMessage(MSG* pMsg)
    {
    
        if (pMsg->message == WM_KEYDOWN && VK_RETURN == pMsg->wParam) 
        {
            return TRUE;
        }
        else if (pMsg->message == WM_KEYUP && VK_RETURN == pMsg->wParam) 
        {	
    
           (((CMainFrame*)AfxGetMainWnd())->GetActiveView()->GetDocument()->UpdateAllViews(NULL));
            return TRUE;
        }
    	return false;
    }
    

    Aber die Übergabe des Wertes auds der EditBox klappt immer noch nicht 😞

    Könnt Ihr mir weiterhelfen 😕
    Vielen Dank für eure Mühe und Hilfe
    Gruß
    ShadowEater


  • Mod

    Und warum übergibst Du nicht einfach den Zeiger auf den Text aus dem Toolbar Control heraus an UpdateAllViews?
    Einfach den LPARAM nutzen und casten!

    Dann hast Du eine direkte Interaktion zwischen Toolbar und View!



  • Hi Martin 🙂 ,

    danke für Deine schnelle Antwort, könntest Du mir mit ein paar Zeilen Code zeigen wie Du das meinst 😕 , irgendwie dreh ich mich im Kreis.
    Ich weis wie man Zeiger übergibt, eigentlich, aber irgendwie wills nicht klappen ! 😞
    Und die direkte Interaktion zwischen Toolbar und View ist mit Sicherheit der beste Weg !

    Vielen Dank für Deine Mühe und Hilfe
    nägelkauend
    ShadowEater 😉



  • Hi,

    kannst Du mir da nicht weiterhelfen ?

    Gruß
    ShadowEater


  • Mod

    Haben wir doch schon in einem anderen Thread gehabt... warst das nicht Du?

    Such doch mal nach UpdateAllViews hier im Forum in den letzten beiden Wochen...



  • Hi Martin,

    ne ich war das nicht der das gefragt hat in den letzten beiden Wochen, dieser Thread ist mein erster seit mehr als 4 Wochen.
    Ich hab geszcht aber nur einen Beitrag von Dir zu einer Frage von Guzz gefunden vom 11:50:33 05.05.2006, der hat aber mit meiner Frage nichts zu tun !

    Bei mir sieht das jetzt so aus:

    BOOL New_cToolBar::PreTranslateMessage(MSG* pMsg)
    {
    	if (pMsg->message == WM_KEYDOWN && VK_RETURN == pMsg->wParam) 
        {
            return TRUE;
        }
        else if (pMsg->message == WM_KEYUP && VK_RETURN == pMsg->wParam) 
        {	
    
    		CString chrBuf;
    		m_Ctrl_EDIT.GetWindowText(chrBuf);
    	// 	MessageBox(chrBuf, chrBuf ,MB_OK);
    
    		 ((CMainFrame*)AfxGetMainWnd())->GetActiveView()->GetDocument()->UpdateAllViews(NULL);
    
            return TRUE;
        }
    	return false;
    }
    
    void CTheReaderView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
    {
    	CTheReaderDoc	 *pDoc	= GetDocument ();
    	CRichEditCtrl	 &rCtrl = GetRichEditCtrl();			// Pointer auf das RichEditControl erstellen um dessen Funktionen zu nutzen
    	//	CHARFORMAT		 cfm;	;// Struktur die die Aktionen der Selektion enthält
    	rCtrl.SetWindowText (pDoc->m_cstrAusgabe);
    
    	rCtrl.SetFont(pDoc->m_ptrFont);
    	rCtrl.SetModify(TRUE);		
    
    }
    

    Ich bekommzwar keine Fehlermeldung aber es klappt nicht und ich steig nicht mehr durch !
    Könntest Du's nicht aktiv korrigieren ?
    Oder ist da so viel falsch ?

    Gruß
    ShadowEater



  • 😉



  • ShadowEater schrieb:

    P.S.:
    Wenn es einfacher ist, dann isses mir auch recht das View über sein Doc zu updaten !

    Gruß
    ShadowEater



  • Übrigens:

    Such doch mal nach UpdateAllViews hier im Forum in den letzten beiden Wochen...

    Was soll das jetzt, klingt als hättest Du keine Lust mehr 😕

    ShadowEater



  • 😕 😕 😕 isses denn so aussichtslos 😕 😕 😕

    Gruß
    ShadowEater


  • Mod

    Nein! Ich habe keine Lust immer das selbe zu schreiben...


Anmelden zum Antworten