Objekt muss zur ges. Laufzeit gültig sein

PPatrickFfm

Grünschnabel
Hallo zusammen!

Habe da ein kleines Problem, weiß aber nicht wie ich das Lösen kann.

Erstelle gerade eine dialogfeldbasierende Anwendung die über den Com-Port mit einem Interface kommunziert. So habe ich in das Projekt meine eigene, selbst erstellte Klasse, die die Schnittstelle bedient, hinzugefügt.

Das Problem liegt nun darin, dass das Objekt für den Port zur gesmten Laufzeit Gültigkeit haben soll, aber das kriege ich irgendwie nicht hin; denn immer (und ist ja auch logisch) wird das Objekt nach Verlassen der Funktion für den Button zerstört.

Wie kann ich denn das Objekt "global" erzeugen? Wenn ich es im Hauptfenster erzeuge so bekomme ich immer die Fehlermeldung:
"C4291" ... "Kein zugehoeriger delete-Operator gefunden; Speicher wird nicht freigegeben, wenn die Initialisierung eine Ausnahme ausloes"

*grübel*

Kann jemand helfen ... anbei ein Code-Snipsel, wenn's hilft.

Code:
// CELMDlg Dialogfeld

class CELMDlg : public CDialog
{
// Konstruktion
public:
	CELMDlg(CWnd* pParent = NULL);	// Standard-Konstruktor

// Dialogfelddaten
	//{{AFX_DATA(CELMDlg)
	enum { IDD = IDD_ELM_DIALOG };
	CButtonXP m_btnHelp;
	CComboBoxXP m_cboName;
	CButtonXP m_btnOk;
	CButtonXP m_btnCancel;
	CButtonXP m_Connect;
	CImageList m_imgList;
	DLC_Interface *Port;
	//Port = new DLC_Interface; geht nicht! Wohin sonst?
	//}}AFX_DATA

	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
	//{{AFX_VIRTUAL(CELMDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV-Unterstützung
	//}}AFX_VIRTUAL

// Implementierung
protected:
	HICON m_hIcon;
	CButtonXP m_btnOK;
...

void CELMDlg::OnConnect() 
{
	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
	char wert [20];
	Port = new DLC_Interface;
	do
	{		
		itoa(Port->Port_No,wert,10);
		MessageBox(wert, "Guarding ...", MB_SYSTEMMODAL);
		Port->Port_No ++;
		Port->ComHandle = Port->Open_Comport (Port->Port_No, 9600);
	}
	while(!Port->ComHandle && Port->Port_No <= 5);
	
	if (!Port->ComHandle)
	{
		MessageBox("Unable to open port", "Guarding ...", MB_SYSTEMMODAL);
		Port->Connected = FALSE;
	}
	else
	{
		MessageBox("Connected", "Guarding ...", MB_ICONINFORMATION);
		Port->Connected = TRUE;
	}
}

Thanks in advance! :)

Pit
 
CELMDlg.h:

Code:
class DLC_Interface;
class CELMDlg : public CDialog
{
// Konstruktion
public:
	CELMDlg(CWnd* pParent = NULL);	// Standard-Konstruktor
         ~CELMDlg();
private:
         DLC_Interface *Port;
         ...
};

Wie wäre es wenn du es in die Implementierung deines DE/Konstruktors einbaust?
CELMDlg.cpp:
Code:
#include "CELMDlg.h"
...
CELMDlg::CELMDlg(CWnd* pParent = NULL){
  ...
  Port = new DLC_Interface();
  ...
}

Und im Detruktor wieder freigeben:
Code:
CELMDlg::~CELMDlg(CWnd* pParent = NULL){
  ...
  delete Port;
  ...
}
Gruß

RedWing
 
Gude!

Super, vielen Dank! Hat auf anhieb geklappt! :)

War mir da nicht sicher, wo's genau hin gehört. Im nachhinein betrachtet total simpel!

Also, danke nochmals

Pit
 
Zurück