[Visual C++ .NET 2003] Registerkarten

FlyingHuman

Mitglied
Hallo!

ich bin hier gleich am verzweifeln,
überall wird gesagt das man Registerkarten "ganz einfach" mit dem Assistenten einfügen kann.
z.Bsp. soll man laut Microsoft ein TabControl per Drag & Drop auf das Dialog/Formular/etc. ziehen und dann EINFACH im Eigenschaften-Fenster auf "AddTab" oder so klicken und schon solls gehen.
leider gibts das "addtab" bei mir nicht?
genaues Zitat:
So fügen Sie eine Registerkarte im Designer hinzu
Ziehen Sie eine TabControl von der Registerkarte Windows Forms der Toolbox in den Designer.
Klicken Sie im Fenster Eigenschaften auf den Link Registerkarte hinzufügen.
– oder –
Klicken Sie im Eigenschaftenfenster neben der TabPages-Eigenschaft auf die Schaltfläche mit den Auslassungspunkten (), um den TabPage-Auflistungs-Editor zu öffnen. Klicken Sie auf die Schaltfläche Hinzufügen.
---------------------------
FRAGE: Designer = Ressourceneditor?

----> könnte jemand mal GENAU beschreiben wie man dahin kommt? (das klingt jetzt zwar komisch, aber finde das wirklich nicht! - auch nicht nach mehrstündiges suchen und probieren :( )

Bsp2:
Zitat:
Du kannst dir das zum Ansehen ganz einfach vom Assistenten einbauen lassen. Im Menü wähle Projekt/Zufügen/Komponenten und.../ und dann im Dialog auswählen "Visual C++ Komponenten/Property Sheet". Das fügt dir einen getabbten Dialog (modal oder auch nicht) ins Projekt ein und du kannst dir das in Ruhe ansehen.
--------------------
leider trifft das nicht für MS Visual Studio .NET 2003 zu -> wo finde ich das da?
unter Ressourcen Hinzufügen -> Dialoge -> proberty page small/large/etc? (da gibts allerdings keine Tabs :( )
---

Danke für eventuelle Antworten ;)

ich bin echt bald am verzweifeln, ich muss doch Tomaten auf den Augen haben :confused:
 
Also, ich weiß nicht, ob es mit einem Assistenten einfacher geht, aber ich konstruiere meine Eigenschaftsseiten folgendermaßen:
Hinzufügen einer MFC-Klasse, die abgeleitet ist von CPropertySheet, z.B. CBereich.
Dann definiere ich die nötige Anzahl von Dialogen, abgeleitet von der Klasse CPropertyPage, in meinem Beispiel CBereichDaten, CSGB_V,CSGB_XI. In der Funktion, wo ich diesen Dialog brauche, definiere ich entsprechende Datenelemente und füge die Seiten in das Blatt ein.
Code:
CBereich bereich;
CBereichdaten bereichdaten;
CSGB_V sgb_V;
CSGB_XI sgb_XI;
          //eventuelle Initialisierung ist hier möglich
bereich.AddPage(&bereichdaten);
bereich.AddPage(&sgb_V);
bereich.AddPage(&sgb_XI);
if(bereich.DoModal())
{
          //Steuerelemente auswerten
}

So klappt das bei mir ohnen Probleme. Wie gesagt, Assistenten habe ich nicht ausprobiert.

Mfg

langer
 
Allerdings weiß ich auch nicht, ob wir von derselben Sache reden, denn Windows Forms ist meines Wissens ein Teil von .net, damit hab ich mich noch nie beschäftigt. Ich nutze nur C++.

Mfg

langer
 
hmm, naja ich brauch eigentlich nur paar Tabs, Druck- u. Datenbankunterstützung für mein Programm.
-> im einem Form_View hab ich ein TabControl und da pro Tab ein Dialog, und der muss da halt bei OnTcnSelchange aufgerufen werden. die größe und pos. des Dialogs muss bestimmt werden - mehr ist es ja eig. nicht, oder?
 
Zuletzt bearbeitet:
OK, also das mit den Registerkarten klappt jetzt einwandfrei :)
habs mit PobertyPages/sheets probiert und auch bissl umständlicher, naja.

jetzt hab ich aber ein anderes Problem:

wie erlange ich von einem Dialog zugriff auf die Datenbank?
von der View gehts ohne Probleme!

wenn ich in der Dialogklasse einen zeiger auf eine DBSet (Datenbanklasse) lege, dann kommt beim ausführen ein speicherzugriffsfehler. genauso wenn ich übers Document mach.

ich wäre für jede Antwort dankbar!

MfG
 
genauer:

Dialog.h
Code:
#pragma once
#include "RVSSet.h"
#include "afxwin.h"


// CKundenDlg-Dialogfeld

class CKundenDlg : public CDialog
{
	DECLARE_DYNAMIC(CKundenDlg)

public:
	CKundenDlg(CWnd* pParent = NULL);   // Standardkonstruktor
	virtual ~CKundenDlg();
	
	CRVSSet *m_pSet;

// Dialogfelddaten
	enum { IDD = IDD_Kunden };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung

	DECLARE_MESSAGE_MAP()
public:
	virtual BOOL OnInitDialog();
};

Dialog.cpp
Code:
// KundenDlg.cpp : Implementierungsdatei
//

#include "stdafx.h"
#include "RVS.h"
#include "KundenDlg.h"
#include ".\kundendlg.h"

// CKundenDlg-Dialogfeld

IMPLEMENT_DYNAMIC(CKundenDlg, CDialog)
CKundenDlg::CKundenDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CKundenDlg::IDD, pParent)
{
}

CKundenDlg::~CKundenDlg()
{
}

void CKundenDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CKundenDlg, CDialog)
END_MESSAGE_MAP()


// CKundenDlg-Meldungshandler

BOOL CKundenDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// TODO:  hier zusätzliche Initialisierung hinzufügen.
	if(m_pSet->IsOpen())m_pSet->Close();

	// kein Filter zum testen // m_pSet->m_strFilter = "irgendwas";
	// keine sortierung zum testen // m_pSet->m_strSort="kdn_nr";	
	m_pSet->Open();
	
	CListBox* listbox = (CListBox*)GetDlgItem(IDC_LIST1);
	
	if(m_pSet->IsBOF()) return TRUE;
	m_pSet->MoveFirst();

	while(!m_pSet->IsEOF())
	{
		listbox->AddString(m_pSet->m_kundenkdn_name);
		m_pSet->MoveNext();
	}

	return TRUE;  // return TRUE unless you set the focus to a control
	// AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
}

... und da ist der Fehler:

Code:
BOOL CRecordset::IsOpen() const
	// Note: assumes base class CRecordset::Close called
{
	if (m_hstmt == NULL)
		return FALSE;
...
wobei m_hstmt den Wert hat: "CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden "

help. :confused:
 
Das sieht so aus, als wäre die Variable m_pSet in OnInitDialog nicht initialisiert. Wo weist Du denn dem Zeiger einen Wert zu?
Am sichersten ist es, wenn Du die Initialisierung dieses Zeigers im Konstruktor erledigst, etwa so:
Code:
CKundenDlg::CKundenDlg(CRecordset * pSet, CWnd* pParent /*=NULL*/)
  	: CDialog(CKundenDlg::IDD, pParent)
  {
    m_pSet = pSet;
  }
Dann übergibst Du den Zeiger direkt beim Anlegen des Dialoges.
 
danke für deine Antwort.

ja, da ist wohl der fehler, ich weiß nur nicht so recht wo ich die Klasse übergeben soll, denn der Dialog wird nicht über die View geöffnet, da müsste ich das erst noch an eine andere Klasse übergeben. das kanns doch nicht sein!?

normalerweise mach ich das in der Document-Klasse:
Code:
CRVSSet m_Set;

// Operationen
public:
	CRVSSet* GetpSet(){return &m_Set;}
und dann eben in der View
Code:
m_pSet = GetDocument()->GetpSet();

kann man von einem Dialog nicht auf die Documenten-Klasse zugreifen? geht das irgendwie?
 
Da gibt's keine direkte Verbindung. Entweder Du reichst dem Zeiger m_pSet durch von der View bis zum Dialog oder Du gibst dem Dialog einen Zeiger auf das View und holst dann den Zeiger über
Code:
((CDeinDocument*)((CDeinView*)GetParent())->GetDocument())->GetpSet();
Da ist das erste aber noch einfacher, wie ich finde.
 
Ey cool, das geht. Danke!

nur so zum verständnis:

lönntest du mir kurz erklären was man mit diesem Befehl genau macht?
Zeiger auf die Doc und View legen und das übergeordnete Fenster dieser ermitteln, damit man dann die richtige Doc/View hat?
hab ich das so in etwa richtg verstanden?

MfG
 
Zurück