Anfängerfrage
-
Hallo,
ich habe da mal ein Problem, das mich schon länger beschäftigt ...
und zwar überwacht mein Programm beim start des Programmes die Festplatten, die dazu nötigen funktionen sthen unter ://---------------------Bei Prog Start ------------------------------------------------- // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
soo, nun habe ich einen timer eingerichtet, der nach einer einstellbaren zeit, diese überwachung erneuert. Nun kann ich das Fenster aber nicht neu initialisieren, also was kann ich tun... ?
Habe es schon mitgoto
und so probiert, obwohl diese Befehle doch wohl eher verhasst sind -unsauber- ...
Bitte helft mir,
vielen Dank im vorraus
-
goto wird dir hier sowieso nicht weiterhelfen.
Was genau meinst du mit neu Initialisieren?
Warum musst du eigentlich neu-initen?
-
Wenn ich das richtig verstehe, dann hast du deine Funktionen zum Überprüfen der Festplatten in der OnInitDialog()-Funktion stehen. Diese Funktion wird nur einmal aufgerufen und zwar beim Start deiner Anwendung. Wenn dies der Fall ist, dann erstelle dir eine Funktion, z.B Pruefe_Festplatte(), füge deine Funktionen die in der OnInitDialog() stehen dort ein und rufe die Funktion in der OnInitDialog()-Funktion auf. Diese Funktion kannst du dann auch in der Funktion für deinen Timer aufrufen.
-
@Panschev genau, das ist mein Problem, ich habe dies schon probiert, nur wird bei der Überprüfung der Platten auf Variablen zugegriffen, die erst im Fenster erstellt werden, jetzt müsste ich die Funktion ja außerhalb des Fenstercodes schreiben und dann kennt er die Variablen nicht...
-
Welcher Fenster-Code.
Dieser Code ist die Klasse für den Dialog.
Wenn du in dieser Klasse Variablen definierst und auch eine Funktion hast dann kann diese Funktion auf die Variablen zugreifen.
IMHO hast du ein Problem mit den Grundlagen der Programmierung.
-
Es ist so wie Unix-Tom geschrieben hat. Zur Zeit erstellst du deine Variablen lokal welche beim Schliessen deines Dialogs(Fenster) nicht mehr vorhanden sind. Erstelle die Variablen für deine Klasse, somit kannst du auch immer auf sie zugreifen
-
@panschev ja, genau das ist das Problem was ich meine, die Variablen sind lokal erstellt ( innherhalb des Fensters ) ...
Also, das ist der Grundaufbau ( extrem verkürzt ) :
// vawsDlg.cpp : Implementierungsdatei // #include "fmod.h" #include ... int m_iCount = 0; int protokoll(CString szBuffer); int ip_aus(); int hdd_ein(); bool geloescht=false; ///////////////////////////////////////////////////////////////////////////// // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info" class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialogfelddaten //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung //}}AFX_VIRTUAL // Implementierung protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // Keine Nachrichten-Handler //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CVawsDlg Dialogfeld CVawsDlg::CVawsDlg(CWnd* pParent /*=NULL*/) : CDialog(CVawsDlg::IDD, pParent) { //{{AFX_DATA_INIT(CVawsDlg) m_netzwerkstatus = _T(""); m_InetStat = _T(""); m_HDDname = _T(""); m_HDDpro = 0; m_HDD = 0; m_HDDname2 = _T(""); m_HDDname4 = _T(""); m_HDDname3 = _T(""); m_HDD2 = 0; m_HDD3 = 0; m_HDD4 = 0; m_HDDpro2 = 0; m_HDDpro3 = 0; m_HDDpro4 = 0; m_WARNING = _T(""); m_sTime = _T(""); m_sCount = _T(""); //}}AFX_DATA_INIT // Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CVawsDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CVawsDlg) DDX_Control(pDX, IDC_PROGRESS1, m_progress); DDX_Text(pDX, IDC_NetzStatus, m_netzwerkstatus); DDX_Text(pDX, IDC_InetStat, m_InetStat); DDX_Text(pDX, IDC_PCstat, m_HDDname); DDX_Text(pDX, IDC_HDDPro, m_HDDpro); DDX_Text(pDX, IDC_Hdd, m_HDD); DDX_Text(pDX, IDC_EDIT4, m_HDDname2); DDX_Text(pDX, IDC_EDIT6, m_HDDname4); DDX_Text(pDX, IDC_EDIT5, m_HDDname3); DDX_Text(pDX, IDC_HDD2, m_HDD2); DDX_Text(pDX, IDC_HDD3, m_HDD3); DDX_Text(pDX, IDC_HDD4, m_HDD4); DDX_Text(pDX, IDC_HDDpro2, m_HDDpro2); DDX_Text(pDX, IDC_HDDpro3, m_HDDpro3); DDX_Text(pDX, IDC_HDDpro4, m_HDDpro4); DDX_Text(pDX, IDC_WARNING, m_WARNING); DDX_Text(pDX, IDC_STATICTIME, m_sTime); DDX_Text(pDX, IDC_STATICCOUNT, m_sCount); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CVawsDlg, CDialog) //{{AFX_MSG_MAP(CVawsDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_COMMAND(ID__ABOUT, OnAbout) ON_BN_CLICKED(IDC_Start, OnStart) ON_COMMAND(ID_DATEI_BEENDEN, OnDateiBeenden) ON_COMMAND(ID_PROTOKOLL_NEU, OnProtokollNeu) ON_COMMAND(ID_OPTIONEN_EINSTELLUNGEN, OnOptionenEinstellungen) ON_WM_TIMER() ON_COMMAND(ID_INFORMATIONEN_PC, OnInformationenPc) ON_BN_CLICKED(IDC_BEREINIGEN, OnBereinigen) ON_BN_CLICKED(IDC_Browser, OnBrowser) ON_COMMAND(ID_OPTIONEN_PROGRAMMPFADE, OnOptionenProgrammpfade) ON_BN_CLICKED(IDC_Mail_open, OnMailopen) ON_BN_CLICKED(IDC_MediaPl, OnMediaPl) ON_BN_CLICKED(IDC_Explorer, OnExplorer) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CVawsDlg Nachrichten-Handler BOOL CVawsDlg::OnInitDialog() { CDialog::OnInitDialog(); // Hinzufügen des Menübefehls "Info..." zum Systemmenü. // IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt // wenn das Hauptfenster der Anwendung kein Dialogfeld ist SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden //---------------------Bei Prog Start ------------------------------------------------- // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen //Variablen erstellen //X Deaktivieren-------------------- CMenu* HandleToSystemMenu = this->GetSystemMenu(FALSE); HandleToSystemMenu->EnableMenuItem( SC_CLOSE, MF_BYCOMMAND|MF_GRAYED); //Timer --------------------- // ... hier ist dann der Code von Timer, dem HDD zugriff usw... // Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie // den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das // Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt. void CVawsDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext für Zeichnen SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Symbol in Client-Rechteck zentrieren int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Symbol zeichnen dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer // das zum Symbol verkleinerte Fenster mit der Maus zieht. HCURSOR CVawsDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } //-------------------Buttons und co //hier folgen jetzt die Behandlung von buttons , usw ..
und jetzt ist mein einzigstes Problem, dass ich auf die Variabeln m_HDD2 = 0;
und m_HDD3 = 0; usw. zugreiffen will, die aber local erstellt sind...
Das man das über funktionen lösen kann, auf die idee bin ich auch schon gekommen aber ich kann wie gesagt auf die Vars nicht zugreifen (logischerweise) nur wie kann ich diese Variablen global erstellen ?
-
Auf die Variablen müsstest du normalerweise problemlos zugreifen können. Weiss jetzt auch nicht woran es hängt
-
Wenn das deine Cpp-Datei ist dann hast du ein Problem.
Was hatint m_iCount = 0;
int protokoll(CString szBuffer);
int ip_aus();
int hdd_ein();
bool geloescht=false;in der verloren?
m_netzwerkstatus = _T(""); m_InetStat = _T(""); m_HDDname = _T(""); m_HDDpro = 0; m_HDD = 0; m_HDDname2 = _T(""); m_HDDname4 = _T(""); m_HDDname3 = _T(""); m_HDD2 = 0; m_HDD3 = 0; m_HDD4 = 0; m_HDDpro2 = 0; m_HDDpro3 = 0; m_HDDpro4 = 0; m_WARNING = _T(""); m_sTime = _T(""); m_sCount = _T("");
Ic gehe davon aus das diese von Assi erstellt wurden und somit sind es Member der Klasse und due kannst darauf zugreifen. Sollltest du jedeoch aus einer der
int protokoll(CString szBuffer);
int ip_aus();
int hdd_ein();zugreifen wollen, denke über dein Design nach.
-
ja, diese Dateien wurden von einem Assistenten ertellt. Auch auf die Gefahr hin , das ich mich jetzt vollkommen blamiere:
Warum gibt es ein Problem mit "int protokoll(CString szBuffer); int ip_aus();
int hdd_ein(); " ?Also im konkreten Fall hab ich folgendes :
eine Funktionint wiederh();
. Fülle ich diese mit folgendem Code :
if(m_HDDname != "") { if(m_HDDpro <=20) { SW = "Achtung auf Laufwerk "+m_HDDname+" ist nur noch wenig Speicherplatz verfügbar!"; old = m_WARNING; m_WARNING = old + "\r\n" + SW; } } if(m_HDDname2 != "") { if(m_HDDpro2 <=20) { SW = "Achtung auf Laufwerk "+m_HDDname2+" ist nur noch wenig Speicherplatz verfügbar!"; old = m_WARNING; m_WARNING = old + "\r\n" + SW; } } if(m_HDDname3 != "") { if(m_HDDpro3 <=20) { SW = "Achtung auf Laufwerk "+m_HDDname3+" ist nur noch wenig Speicherplatz verfügbar!"; old = m_WARNING; m_WARNING = old + "\r\n" + SW; } } if(m_HDDname4 != "") { if(m_HDDpro4 <=20) { SW = "Achtung auf Laufwerk "+m_HDDname4+" ist nur noch wenig Speicherplatz verfügbar!"; old = m_WARNING; m_WARNING = old + "\r\n" + SW; } }
bekomme ich folgende Fehler :
--------------------Konfiguration: vaws - Win32 Debug--------------------
Kompilierung läuft...
vawsDlg.cpp
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(897) : error C2065: 'm_HDDname' : nichtdeklarierter Bezeichner
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(897) : error C2446: '!=' : Keine Konvertierung von 'char *' in 'int'
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(897) : error C2040: '!=' : 'int' unterscheidet sich von 'char [1]' in bezug auf die Anzahl vorgenommener Dereferenzierungen
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(900) : error C2065: 'm_HDDpro' : nichtdeklarierter Bezeichner
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(902) : error C2110: Zwei Zeiger koennen nicht addiert werden
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(903) : error C2065: 'm_WARNING' : nichtdeklarierter Bezeichner
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(904) : error C2679: Binaerer Operator '=' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class CString' akzeptiert (oder keine geeignete Konvertierung moeglich)
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(907) : error C2065: 'm_HDDname2' : nichtdeklarierter Bezeichner
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(907) : error C2446: '!=' : Keine Konvertierung von 'char *' in 'int'
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(907) : error C2040: '!=' : 'int' unterscheidet sich von 'char [1]' in bezug auf die Anzahl vorgenommener Dereferenzierungen
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(909) : error C2065: 'm_HDDpro2' : nichtdeklarierter Bezeichner
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(911) : error C2110: Zwei Zeiger koennen nicht addiert werden
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(913) : error C2679: Binaerer Operator '=' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class CString' akzeptiert (oder keine geeignete Konvertierung moeglich)
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(916) : error C2065: 'm_HDDname3' : nichtdeklarierter Bezeichner
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(916) : error C2446: '!=' : Keine Konvertierung von 'char *' in 'int'
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(916) : error C2040: '!=' : 'int' unterscheidet sich von 'char [1]' in bezug auf die Anzahl vorgenommener Dereferenzierungen
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(918) : error C2065: 'm_HDDpro3' : nichtdeklarierter Bezeichner
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(920) : error C2110: Zwei Zeiger koennen nicht addiert werden
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(922) : error C2679: Binaerer Operator '=' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class CString' akzeptiert (oder keine geeignete Konvertierung moeglich)
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(925) : error C2065: 'm_HDDname4' : nichtdeklarierter Bezeichner
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(925) : error C2446: '!=' : Keine Konvertierung von 'char *' in 'int'
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(925) : error C2040: '!=' : 'int' unterscheidet sich von 'char [1]' in bezug auf die Anzahl vorgenommener Dereferenzierungen
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(927) : error C2065: 'm_HDDpro4' : nichtdeklarierter Bezeichner
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(929) : error C2110: Zwei Zeiger koennen nicht addiert werden
E:\Programme\Microsoft Visual Studio\MyProjects\vaws\vawsDlg.cpp(931) : error C2679: Binaerer Operator '=' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class CString' akzeptiert (oder keine geeignete Konvertierung moeglich)
Fehler beim Ausführen von cl.exe.vaws.exe - 25 Fehler, 0 Warnung(en)
ich denke es wird an dem liegen was Unix-Tom bereits angesprochen hat ...
-
Da es bei dir ein Grundlagenproblem ist kommt es ins Forum C++.
Ich gehe mal davon aus das int wiederh() keine Methode der Dialogklasse ist.
Du kannst nicht auf Member einer Klasse zugreifen wenn du keine Instanz der Klasse hast.
Wie du die bekommst bzw. was an deinem Design falsch ist wird dir in C++ gezeigt.
-
Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum MFC mit dem Visual C++ in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
und wie kann ich "int wiederh()" zu einer Methode der Dialogklasse bekommen ?