Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [c++MFC]logica dialogo

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++MFC]logica dialogo

    ciao.
    Ho una mappa di configurazione per un dialogo del tipo:

    codice:
    m_MapDescriptionControls[IDC_ID] = new tagEntityInsProperties(IDC_ID, ElementID, -1, NULL, &m_nID, GetDlgItem(IDC_ID), IDC_HAND_ID);
    	m_MapDescriptionControls[IDC_X] = new tagEntityInsProperties(IDC_X, ElementX, 0, &m_X, NULL, GetDlgItem(IDC_X), IDC_HAND_X);
    	m_MapDescriptionControls[IDC_Y] = new tagEntityInsProperties(IDC_Y, ElementY, 1, &m_Y, NULL, GetDlgItem(IDC_Y), IDC_HAND_Y);
    	m_MapDescriptionControls[IDC_Z] = new tagEntityInsProperties(IDC_Z, ElementZ, 2, &m_Z, NULL, GetDlgItem(IDC_Z), IDC_HAND_Z);
    ogni valore di tagEntityInsProperties:

    codice:
    struct tagEntityInsProperties
    {
    	tagEntityInsProperties(int nId,int ntype,int nfocus, CLength* pdata, int* pintval,CWnd* pwnd, UINT ncursor)
    	{
    		nID= nId;
    		nType = ntype;
    		nFocus = nfocus;
    		pData = pdata;
    		nCursor = ncursor;
    		pIntVal = pintval;
    		pWnd = pwnd;
    	}
    	int nID;//il valore dell' ID del controllo
    	int nType;//tipo controllo , ovvero Leggi X , Leggi Y, Leggi Z , leggi ID ecc...
    	int nFocus;//VValore del focus proprio del controllo
    	//int OnElement; per adesso è sempre joint , ma considero l'eventualita' di una modifica
    	CLength* pData;//la variabile del controllo su cui vengono scritti i valori
    	int* pIntVal;
    	CWnd* pWnd;
    	UINT nCursor;//variabile del tipo di cursore
    };
    posso selezionare vari oggetti con un click sullo schermo , ogni oggetto alla fine è un punto 3d.
    alla fine dopo aver ottenuto il punto devo poterlo andare ad assegnare alla variabile pData contenuta nella mappa all'indice che sto elaborando.
    una volta assegnato al puntatore della variabile relativa pData il valore esiste una procedura che non posto perchè non è rilevante che assegna questi valori x,y,z ai controlli nel dialogo

    in questo modo configuro i controlli nel dialogo a miopiacimento.

    la procedura con cui ho dei problemi è questa:
    codice:
    int CManagerInsEntityBase::SetValueEdit(C3DPoint* pVal, int ID){ 
    
    	map<UINT, tagEntityInsProperties*>::iterator it;
    	int nIdFirst = 0;
    	int nID = 0;
    	bool bID = false;
    	
    	for(it = m_MapDescriptionControls.begin(); it != m_MapDescriptionControls.end(); it++){
    		if(it->second->nType == ElementID )
    			bID = true;
    	}
    	
    	for(it = m_MapDescriptionControls.begin(); it != m_MapDescriptionControls.end(); it++){
    
    		if(it->second->nType == ElementID && m_nFocus == -1){
    			int * pId = m_MapDescriptionControls[it->second->nID]->pIntVal;
    			*pId =ID;
    			bID = true;
    			/*it->second->pData->SetIntValue(pVal->y, m_pView->GetGenUnits());
    			it->second->pData->SetIntValue(pVal->z, m_pView->GetGenUnits());*/
    			nID = GetNextIdMap(it->second->nType);	
    			m_nFocus = 1;
    			return nID;
    		}
    		
    		if(it->second->nType == ElementX && it->second->nFocus == m_nFocus || bID){
    			it->second->pData->SetIntValue(pVal->x, m_pView->GetGenUnits());
    			nIdFirst = it->second->nID;
    			nID = GetNextIdMap(it->second->nType);	
    			m_nFocus = 1;
    			return nID;
    		}
    		if(it->second->nType == ElementY && it->second->nFocus == m_nFocus || bID){
    			it->second->pData->SetIntValue(pVal->y, m_pView->GetGenUnits());
    			nID = GetNextIdMap(it->second->nType);	
    			m_nFocus = 1;
    			return nID;
    		}
    		if(it->second->nType == ElementZ && it->second->nFocus == m_nFocus || bID){
    			it->second->pData->SetIntValue(pVal->z, m_pView->GetGenUnits());
    			nID = GetNextIdMap(nIdFirst -1);		
    			m_nFocus = 0;
    			return nID;	
    		}
    		
    
    	}return nID;	
    }
    scorro la mappa e assegno di volta in volta i valori alla variabile relativa.alla fine ritorno l'id che è l'id del controllo processato successivo, su cui viene impostato il focus.
    Premendo gli oggetti sullo schermo ogni valore del punto si visualizza nel dialogo(non modale chiaramente) nel controllo "giusto" pre configurato.

    questo ciclo per me non è una buona implementazione , in quanto rende eccessivamente complicata la gestione della logica.
    mettiamo ad es che premendo un oggetto ElementID devo recuperare l'id che è passato nei parametri della funzione , ma devoanche copiare tutti i valori delle altre 3( x,y,z )variabili nei controlli .
    avete una soluzione migliore di quella postata?
    grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ho pensato di utilizzare una classe di configurazione , anzichè una mappa , ma non so bene come impostarla.
    grazie.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ho creato un oggetto per la configurazione del tipo:

    codice:
    #pragma once
    #include "length.h"
    #include <map>
    
    using namespace std;
    struct tagGeneric
    {
    	int m_nCursorSelected;
    	//focus a cui corrisponde l' elemento della struttura
    	int m_nFocus;
    	//tipo elemento
    	int m_nType;
    	//l'id dell' elemento
    	int m_nID;
    };
    
    struct tagID : tagGeneric{
    
    	//setta l'indirizzo della variabile che ospiterà il valore della variabile
    	void SetVarIDAddress(int* pID);
    	//legge l'indirizzo della variabile che ospiterà il valore della variabile
    	int* GetVarIDAddress();
    	//funzione che imposta il comportamento di popolazione e inserimento X,Y e Z quando
    	//leggo l'id
    	bool bIsFillAutoXYZ(bool bValue, CLength* X, CLength* Y, CLength* Z);
    	//indice cursore da impostare quando seleziono
    	//il tipo
    	
    };
    
    struct tagLengthUnit: tagGeneric{
    	
    	//setta l'indirizzo della variabile che ospiterà il valore della variabile
    	void SetVarAddress(CLength* pX);
    	//legge l'indirizzo della variabile che ospiterà il valore della variabile
    	CLength* GetVarAddress();
    
    	CLength* m_Value;
        //indice cursore da impostare quando seleziono
    	//il tipo
    	int m_nCursorSelected;
    	//focus a cui corrisponde l' elemento della struttura
    	int m_nFocus;
    	//tipo elemento
    	int m_nType;
    	//l'id dell' id
    	int m_nID;
    
    };
    
    class CConfigureDialog
    {
    public:
    	CConfigureDialog(void);
    	~CConfigureDialog(void);
    
    
    public:
    	void DoConfiguration();
    	map<UINT, tagGeneric> m_mapElements;
    	
    	tagLengthUnit X;
    	tagLengthUnit Y;
    	tagLengthUnit Z;
    	tagID ID;
    };
    il mio problema è che dato un id dovrei estrarre il taggeneric relativo
    e dato ad es un m_focus dovrei sempre estrarre il taggeneric corrispondente,
    come puo' essere un buon metodo?
    devo scorrere tutti gli elementi (che pero' sono pochi) e quando trovo la variabile corrispondente ritornare l'indirizzo dell' oggetto trovato ?
    come?
    grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.