Dateiauswahl, Pfad in Variable halten
-
Hi
was ist destSize?? Das ist doch gar nicht initialisiert!!!
Versuchs mal mitCReg1Seite1::CReg1Seite1() : CPropertyPage(CReg1Seite1::IDD) { test = GetPrivateProfileString("common","EinPfad","NULL",EinPfad,500,"test.ini"); //{{AFX_DATA_INIT(CReg1Seite1) m_sResults = _T(test); //}}AFX_DATA_INIT }
Grüße Rapha
-
Hmmm..
danke DIr, docj leider kein erfolg.
Es erscheint eine Eckige 0.Was muß man den includen ??
Gruß
andy_mann
-
Ohhhh mann,
ich habe es heraus bekommen.GetPrivateProfileString("common","EinPfad","NULL",EinPfad,500,"test.ini");
//{{AFX_DATA_INIT(CReg1Seite1)
m_sResults = _T(EinPfad);Ist die Lösung und die ini muß anscheinend im Pfad vom Betribssystem unter Windows liegen.
Weis jemand wie man dass Ändert ??
Ich möchte gerne, dass die .ini dort liegen muß von wo aus meine .exe aufgerufen wird.Gruß
andy_mann
-
Servus,
/////////// Pfad erfassen ///////// CString strPath = GetCommandLine();// Pfad + Name der Exe holen int pos = strPath.ReverseFind( '\\'); // letztes '\' finden strPath = strPath.Mid(1, pos-1); // Name der Exe abtrennen, so dass nur noch der Pfad übrig bleibt //////////////////////////////////
dann hast du dein aktuelles Verzeichnis indem deine *.exe liegt. Im strPath steht der komplette Pfad. Den kannst du ja dann weiterverwenden indem du z.B.
CString strIni = strPath + "\\Test.ini";
machst. Dann weiss er das die Test.ini in dein Verzeichnis zu liegen hat.
*winke*
Hellsgore
-
Ich Danke Dir,
dass Funzt ja super.
Aber noch einmal eine Frage.....
Ich möchte jetzt nicht in jeder .cpp den Pfad suchen lassen, sondern eine art Globale Variable Deklarieren.
In welchen File erstelle ich denn dies Variable ??
Habe zur Auswahl:
file.cpp
fileDoc.cpp
fileView.cpp
MainFrm.cpp
Reg1.cpp
Reg1Seite1.cpp
StdAfx.cppsorry für diese Frage, bin noch ziemlich neu in der MFC.
Gruß und Danke
andy_mann
-
Globale Variablen sind Gift in dier OOP
Machs anderes: Füge eine CString Variable in deiner Applikationklasse ein (die Klasse, die auf App endet und von CWinApp abgeleitet ist). Diese kannst du dann
in InitInstance mit dem Pfad füllen.Du kannst nun von überall aus auf diese Variable zugreifen:
(Angenommen deine App Klasse heißt CMyApp):CMyApp* pApp = (CMyApp*) AfxGetApp(); pApp->DeineVariable;
Grüße Rapha
-
Ich Danke Dir vielmals,
wie fülle ich denn nun die Variable ??
So sieht es jetzt bei mir aus..
BOOL CFileApp::InitInstance()
{
AfxEnableControlContainer();
pApp = "test.ini";
...
...
..
.funzt aber nicht..
Gruß und Danke
andy_mann
-
Hi,
angenommen du hast folgendes in deiner App "gemacht":
class CMyApp : public CWinApp { //blablabla public: CString m_strIniFileName }
Dann ist m_strIniFileName eine stinknormale Membervariable
, auf die du in InitInstance einfach über m_strIniFile = "IniFile.ini" zugreifen kannst.
Irgendwo anders in deinem Programm schreibst du dann:
(CMyApp*) pApp = (CMyApp*) AfxGetApp(); pApp->m_strIniFileName = "AnderesIniFile.ini";
Grüße Rapha
-
Oh vilen Dank,
Du hilfst mir sehr, dass klappt ja schon recht gut.
Jetzt muß ich aber trotzdem Nerven, mir ist noch ein fehler aufgefallen.
Wenn ich den Dialog aufrufe, eine Datei aufrufe, dies auf öffnen, dann auf ok Drücke, speichert er mir dieses in die ini datei.
Wehle ich nun nochmals neu eine Datei aus, sage aber anschließend Abrechen, speichert er mir trotzdem den so eben ausgewählten string in die ini Datei...
Ich habe ein Dialogfenster mit mehreren Dialogen intern.
Hier der Source:
void CReg1Seite1::OnFileopen()
{
CFileDialog m_ldFile(TRUE,
"txt""csv",
NULL, //".txt",
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Textdateien (.txt)|.txt|Textdateien (.csv)|.csv|Alle Dateien (.)|.*||");// Dialogfeld Öffnen zeigen und Ergebnis auffangen
if (m_ldFile.DoModal() == IDOK)
{
// Gewählten Dateinamen ermitteln
m_sResults = m_ldFile.GetPathName();
CFileApp* pApp = (CFileApp*) AfxGetApp();
WritePrivateProfileString("common","EinPfad",m_sResults,fPfadZurExe(pApp->m_strIniFile));// Dialogfeld aktualisieren
UpdateData(FALSE);
}}
Gruß und Danke....
andy_mann
-
Hi
speichere den Wert in dem Eingabefeld des Dialoges halt erst, wenn der Dialog beendet wurde (d.h. DoModal in InitInstance) und überprüfe vorher, ob DoModal (in InitInstance) IDOK zurückgegeben hat (wenn ja, speichere den Inhalt mit WritePrivateProfileString ansonsten tu nichts).
Grüße Rapha
-
danke,
ich finde nur nirgends einen hinweis, indem ich eine if Schleiffe einbringen kann.
Ich habe kein einfaches Dialog sondern ein Dialog indem mehrere Dialoge beinhaltet sind. (CPropertySheet).
Dies wird doch vom System erzeugt und ich weiss nicht wo meine ok abrechen und übernehmen butten sind.
Mein Übernehmen Button ist auch nicht aktiv.
Gruß
andy_mann
-
Hi,
du rufst den Dialog doch trotzdem in InitInstance mit DoModal auf, oder?
Diesen Rückgabewert kannst du prüfen, z.B. so:
int nRet = DeinDialog.DoModal(); if(nRet == IDCANCEL) // der User hat auf Abbrechen geklickt if(nReg == IDOK) // der User hat auf OK geklickt
Grüße Rapha
-
Mmmhh...
ich rufe den Dialog mitvoid CFileView::OnTest()
{
CReg1 Eigenschaftsseite1(_T("Optionen"));
Eigenschaftsseite1.DoModal();
}in der fileView.cpp auf // file ist der Verzeichnisname...
Dort gibt es keine InitInstance, diese gibt es nur in der file.cpp mit:
BOOL CFileApp::InitInstance()
{
AfxEnableControlContainer();
m_strIniFile = "test.ini";#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endifSetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Load standard INI file options (including MRU)
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CFileDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CFileView));
AddDocTemplate(pDocTemplate);// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();return TRUE;
}trja und dort weis ich momentan nicht mehr weiter..
Gruß
andy_mann
-
Achso, du hast ein SDI-Programm, sags doch gleich
Mach die Abfrage doch einfach in CFileView::OnTest und speichere den String in der Ini Datei, wenn IDOK zurückgegeben wird.
void CFileView::OnTest() { CReg1 Eigenschaftsseite1(_T("Optionen")); int nRet = Eigenschaftsseite1.DoModal(); if(nRet==IDOK) // blabla }
Grüße Rapha
-
Hallo,
ok....
habe jetzt folgendes getan,
void CFileView::OnTest()
{
CReg1 Eigenschaftsseite1(_T("Optionen"));
int nRet = Eigenschaftsseite1.DoModal();
if(nRet==IDOK)
{
CFileApp* pApp = (CFileApp*) AfxGetApp();
WritePrivateProfileString("common","EinPfad",m_sResults,fPfadZurExe(pApp->m_strIniFile));
}
}jetzt gibt es allerdings einen fehler, error C2065: 'm_sResults' : undeclared identifier.
habe schon die Reg1Seite1 includet, trotzdem selben fehler.
Gruß
andy_mann
-
Hi,
okok, Schritt für Schritt.Füge jetzt eine Membervariablevariable Namens m_strData in die Klasse CReg1 ein und achte dabei, dass sie im public Bereich steht (nicht im private oder friend-Bericht!!!) (also unter public:).
Diese Variable willst du jetzt beim Verlassen des Dialogs mit demmit dem Inhalt des Textfeldes wie folgt:
Füge eine Funktion hinzu, die die Nachricht WM_DESTROY abfängt.
In diese schreibst du folgenden Code:void CDestDlg::OnDestroy() { GetDlgItemText(IDC_EDIT1, m_strData); CDialog::OnDestroy(); }
wobei du anstatt IDC_EDIT1 den Namen deines Editfeldes einfügst.
Jetzt änderst du OnTest wie folgt ab:
void CFileView::OnTest() { CReg1 Eigenschaftsseite1(_T("Optionen")); int nRet = Eigenschaftsseite1.DoModal(); if(nRet==IDOK) { CFileApp* pApp = (CFileApp*) AfxGetApp(); WritePrivateProfileString("common","EinPfad",Eigenschaftsseite1.m_strData,fPfadZurExe(pApp->m_strIniFile)); } }
Außerdem änderst du die OnFileopen Funktion wie folgt ab (IDC_EDIT1 wieder mit dem Namen deines Editfeldes, das den Namen zu der Datei anzeigt, ersetzten)
void CReg1Seite1::OnFileopen() { CFileDialog m_ldFile(TRUE, "txt""csv", NULL, //"*.txt", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Textdateien (*.txt)|*.txt|Textdateien (*.csv)|*.csv|Alle Dateien (*.*)|*.*||"); // Dialogfeld Öffnen zeigen und Ergebnis auffangen if (m_ldFile.DoModal() == IDOK) { // Gewählten Dateinamen ermitteln m_strData = m_ldFile.GetPathName(); SetDlgItemText(IDC_EDIT1, m_strData); } }
Grüße Rapha
-
Hallo Rapha,
vielen vielen Dank für dein Bemühen,
leider haut es nicht so hin wie Du es beschreibst.In welchen File muß den jetzt die Funktion
void CDestDlg::OnDestroy()
{
GetDlgItemText(IDC_RESULTS, m_strData);
CDialog::OnDestroy();
}stehen ??
Gruß
andy_mann
-
Äh verzeihung, es natürlich CReg1::OnDestroy bzw CReg1Seite1 sein (die Klasse, die das Edit Control "beinhaltet") (ich komme bei deinen Klassen durcheinander
).
Grüße Rapha