IDC_EDIT und (for)?
-
Hallo ich hoffe ihr könnt mir helfen.
und zwar möchte ich gerne die Eingabefelder einer dialogb. Anwendung in str auslesen.
18 Felder sind es insgesamt und die sollen dann zusammen in einem .csv(eigentlich egal oder auch .txt)File stehen(der stream stell jetzt auch nicht das Problem dar)!Ist es mölich, basierend auf GetDlgItemText(IDC_EDIT, str) und einer Schleife die Eingabefelder nacheinander auszulesen und zusammen in den Stream zu übergeben?
Wenn ja wär ich für einen "ausführlicheren" Codeschnipsel dankbar.
Gibt es effektivere Möglichkeiten als eine for schleife bei den MFC?P.S. Wie lautet den das MFC-Pendant zur strtok-Anweisung ?
-
Ja, dies kannst du in einer schleife machen. Du musst nur die Namen in einem Array speichern.
UINT testfield[3] = {IDC_TEST1, IDC_TEST2, IDC_TEST3}; for(int i=0; i < 3; i++) GetDlgItemText(testfield[i]);
-
*/ CString strstring; UINT tfeld[3] = {IDC_EDIT1, IDC_EDIT2}; for(int i=1; i < 2; i++) GetDlgItemText(tfeld[i],strstring); //tfeld--->strstring??????????? oder nicht UpdateData(true); CStdioFile OutFile; if (OutFile.Open("C:\\data.txt",CFile::modeCreate | CFile::modeWrite)) { OutFile.WriteString(strstring); OutFile.Close(); } }
Warum steht denn dann nur der Inhalt der EDIT2 in data.txt?
-
weil du strstring immer überschreibst...
Außerdem musste dein Array tfeld[2] und nicht tfeld[3] weil du nur 2 Werten hast...
-
eine möglichkeit wäre (achtung nicht getestet und weiß nicht ob optimiert)...
CString strstring; UINT tfeld[2] = {IDC_EDIT1, IDC_EDIT2}; CStdioFile OutFile; for(int i=1; i < 2; i++) { if (OutFile.Open("C:\\data.txt",CFile::modeCreate | CFile::modeWrite)) { GetDlgItemText(tfeld[i],strstring); OutFile.SeekToEnd(); OutFile.WriteString(strstring); OutFile.Close(); } }
-
egal schrieb:
eine möglichkeit wäre (achtung nicht getestet und weiß nicht ob optimiert)...
CString strstring; UINT tfeld[2] = {IDC_EDIT1, IDC_EDIT2}; CStdioFile OutFile; for(int i=0; i < 2; i++) // hier war auch falsch { if (OutFile.Open("C:\\data.txt",CFile::modeCreate | CFile::modeWrite)) { GetDlgItemText(tfeld[i],strstring); OutFile.SeekToEnd(); OutFile.WriteString(strstring); OutFile.Close(); } }
-
na da überschreib ich doch den strstring genauso
-
CISI schrieb:
na da überschreib ich doch den strstring genauso
ja, aber du schreibst den Wert vorher in dein Textdatei...
Du kannst es natürlich auch anders machen, z.B. so:[cpp]
CString strstring;
CString sTemp;
UINT tfeld[2] = {IDC_EDIT1, IDC_EDIT2};for(int i=0; i < 2; i++)
{
GetDlgItemText(tfeld[i],sTemp); //tfeld--->strstring??????????? oder nicht
strstring += sTemp;
}CStdioFile OutFile;
if (OutFile.Open("C:\\data.txt",CFile::modeCreate | CFile::modeWrite))
{
OutFile.WriteString(strstring);
OutFile.Close();
}
-
letzterer Funktioniert....
aber wo ein Problem ist, is dat nexte nich weit...
Ich habe nun meine n Werte durch ein semikolon getrennt in die Datei geschrieben und möchte nun wieder auf dem umgekehrten Weg die einzelnen Werte separieren und den EDIT feldern zuweisen...
In c++ gabs ja die Möglichkeit über strtok etc. den String zu zerlegen...aber geht das so unter den MFC?
-
guck dir mal CString::Find(...), SCtring::Left(...), CString::Mid(...) und CString::Right(...) an...
-
ich hab das bisher für Konsolenanwendungen immer so gemacht:
ifstream indat("test.csv"); char line[255]; indat.getline(line, 255); str1 = strtok(line, ";"); strw1 = strtok(NULL, ";"); cout<<str1<<";"<<strw1<<endl; indat.getline(line, 255); str2 = strtok(line, ";"); strw2 = strtok(NULL, ";"); cout<<str2<<";"<<strw2<<endl
versuch das jetzt schon geraume Zeit zu adaptieren...aber nuja
-
Versuch mal mit
CStdioFile flDatei; unsigned int iOld, iPos; CStringArray arInhalt; CString sZeile; flDatei.Open( "test.csv" ,CFile::modeRead | CFile::typeText ); while (m_DB_flDatei.ReadString(sZeile)) { while(-1 != (iPos = sZeile.Find(";",iPos))) { arInhalt.Add(sZeile.Mid(iOld,iPos - iOld)); iOld = ++iPos; } if(iOld < sZeile.GetLength()) arInhalt.Add(m_DB_sDateiZeileNeu.Mid(iOld,sZeile.GetLength()-iOld)); }
Die einzelne Werten stehen dann im Array arInhalt...
-
Sorry, bin total durch den Wind... beim adaptieren des Beispiels, sind mir einige Fehler unterlaufen...
Hier nochmal richtig...
CStdioFile flDatei; unsigned int iOld, iPos; CStringArray arInhalt; CString sZeile; flDatei.Open( "test.csv" ,CFile::modeRead | CFile::typeText ); while (flDatei.ReadString(sZeile)) { while(-1 != (iPos = sZeile.Find(";",iPos))) { arInhalt.Add(sZeile.Mid(iOld,iPos - iOld)); iOld = ++iPos; } if(iOld < sZeile.GetLength()) arInhalt.Add(sZeile.Mid(iOld,sZeile.GetLength()-iOld)); }
-
vielen Dank erstmal
ich glaub mit dem semikolon in der .find kommt er nicht zurecht.
while(-1 != (iPos = sZeile.Find(";",iPos)))
syntaktisch ist er wohl korrekt aber beim Ausführen der Anwendung konnte der Vorgang read nicht auf dem Speicher durchgeführt werden
-
sorry, du musst iPos mit 0 initializieren...
also unsigned int iPos = 0;
-
und bei iOld genauso...
-
sorry, dass du mir alles vorkauen musst blind wie ich bin
-
Erstmal vorweg...Code funktioniert ohne Probleme bis auf eine Ausnahme.
Und zwar bekomm ich "Debug assertion failed (File:fgets.h Line:60)" wenn ich während der Anwendung den "open as"-Dialog einfach abbreche(button oder Alt+F4...etc).Sieht jemand wos hängen könnte?
CStdioFile flDatei; unsigned int iOld=0, iPos=0; CStringArray arInhalt; CString sZeile; CString FileName; CString sTemp; BOOLEAN Lesestatus=FALSE; UINT tfeld[18] = {IDC_EDIT1, IDC_EDIT2, IDC_EDIT3, IDC_EDIT4, IDC_EDIT5, IDC_EDIT6, IDC_EDIT7, IDC_EDIT8, IDC_EDIT9, IDC_EDIT10, IDC_EDIT11, IDC_EDIT12, IDC_EDIT13, IDC_EDIT14, IDC_EDIT15, IDC_EDIT16, IDC_EDIT17, IDC_EDIT18}; CString m_strDateiname; // Objekt der Klasse CFileDialog erstellen CFileDialog m_File(TRUE, "", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Text-Dateien (*.txt)|*.txt||"); // Startverzeichnis initialisieren m_File.m_ofn.lpstrInitialDir = "C:\\WINNT\\"; // Dialogfeld öffnen und Ergebnis auffangen if(m_File.DoModal()==IDOK) { // Gewählten Dateinamen ermitteln m_strDateiname = m_File.GetFileName(); // Ausgewählte Datei öffnen ShellExecute(NULL, "open", m_strDateiname, NULL, NULL, SW_SHOW); } //Name der Datei vom Objekt der Klasse CFileDialog übernehmen FileName=m_File.GetPathName(); flDatei.Open(FileName,CFile::modeRead | CFile::typeText ); int i=0; while (flDatei.ReadString(sZeile)) { if (sZeile.Find("Beginn Messung",0)!=-1) Lesestatus=TRUE; if (sZeile.Find("Ende Messung",0)!=-1) Lesestatus=FALSE; while( (-1!=(iPos = sZeile.Find(";",iPos)))&&(Lesestatus==TRUE)) { arInhalt.Add(sZeile.Mid(iOld,iPos - iOld)); iOld = ++iPos; i++; } iPos=0; iOld=0; } for (int j=0;j<i;j++) { //MessageBox(arInhalt[j]); iPos=arInhalt[j].Find(":",0); sTemp=arInhalt[j].Mid(iPos+1); SetDlgItemText(tfeld[j],sTemp); //sTemp--->tfeld } }
-
Expression: str!=NULL
-
was für ein Wert hat FileName wenn du einfach den "open as" Dialog abbrichst???
bei "if(m_File.DoModal()==IDOK)" fängst du es nur ab wenn der benutzer auf OK klickt. Wenn er auf abbrechen klickt, versucht das Programm "C:\\WINNT\" zu öffnen und auszulesen, was kein Datei ist und deshalb ein Fehler... schätze ich jetzt mal...