Brauche Hilfe bei Button und INI Datei



  • Hy @ all!
    Entwickle ein Programm auf Visual C++ ohne MFC, das den beim einem Button druck der Key Wert in einer ini Datei sich erhöht und beim anderen Button Druck das er mir die Strings hineinschreibt. Jetzt bin ich schon so weit das er mir das in der ini Datei ausgibt. Jetzt hab ich das Problem das er immer wieder bei 1 anfängt. Beim Debuggen des Programm bin ich darauf gekommen das er den Wert "i" immer mit 0 Initialisiert. So nun meine Frage. Kann man durch einen Buttondruck den Wert um 1 erhöhen? Ich Schicke euch dazu noch den Source Code. Bin noch einbisschen Anfänger in der Programmierung mit C++. Aber ich habe bereits einbisschen Kenntnisse.

    switch (LOWORD (wParam))
    {
    case ID_LOOPBUTTON:
    	i = 0;  // <-- Hier wird der Wert immer auf 0 gesetzt
        sprintf (buffer, "%d", i);
    	GetPrivateProfileString ("EDC", buffer, "NONE", szStrings, sizeof (szStrings), "c:\\utm.ini");
    	if ((i == i) && (szStrings == "NONE"))   // <-- und Hier springt er überhaupt nicht rein
    	{
    	     i++;
    	}
    	sprintf (buffer, "%d", i);
    
    	WritePrivateProfileString ("EDC", buffer, NULL, "c:\\utm.ini");
    
    	break;
    

    Brauche unbedingt eure Hilfe. Danke im Voraus BlackFalcon



  • Hi,
    was bitte bedeutet in deinem Code der Ausdruck
    if(i==i) ??? i ist doch immer i 🙄



  • ...außerdem kann man ein Char-Feld nicht mit == vergleichen. Du benötigst dafür eine Funktion mit dem Namen lstrcmp(bufA,bufB), bei Gleichheit wird der Wert NULL zurückgegeben...



  • Erstens: Der Ausdruck "i=0;" ist eine Zuweisung, da brauchst du dich nicht wundern, wenn die etwas zuweist 😉 (wenn du bei jedem Tastendruck von der bisherigen Position weiterzählen willst, verschieb die Anweisung vor deine Nachrichtenschleife, damit i einmal auf 0 gesetzt werden kann)

    Zweitens: "i==i" ist sinnlos (kannst du aus der Bedingung rausnehmen) und "szStrings=="None"" vergleicht zwei char-Pointer miteinander (einer davon zeigt auf den Programmstack, der andere ins "weiß-nicht"-Segment, also sind sie bestimmt verschieden) - die String-Inhalte vergleichst du besser mit strcmp().

    Drittens: Da du ohne MFC arbeiten willst, bist du im WinAPI-Board besser aufgehoben *schiebt*



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum MFC (Visual C++) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • So hab jetzt das "i==i" weggetan und den Befehl eingefügt und er springt auch hinein in die Abfrage! Jetzt hab ich i zugewissen. Das funktioniert auch schon prechtig. Aber immer wenn ich das Programm neu starte dann kann ich wieder bei 2 eingeben. Die Ini Datei sollte aber bei drei weitermachen. Denn die Datei wird immer wieder aufgerufen. würde es mit so einem Aufruf gehen

    char variable;
    while (variable != '\0')
    {
        // um 1 hinaufzählen
    }
    

    Ich bitte um Rat! Danke im Voraus!



  • Ich weiß nicht, ob ich das jetzt richtig verstanden habe, aber ich denke so könnte es das machen was du willst:

    do
    {
     sprintf (buffer, "%d", i);
     GetPrivateProfileString ("EDC", buffer, "NONE", szStrings, sizeof (szStrings), "c:\\utm.ini");
     i++
    }
    while(lstrcmp(szStrings,"NONE") != 0)
    

    Danach sollte dann in i der erste noch unbelegte Index stehen...



  • Danke genau das hab ich gesucht! Jetzt Funtzt!



  • Hallo wollte für meine Frage keinen neuen Thread aufmachen. Wollte nur wissen wie man die Daten in ein Listenfenster bekommt. Hab nämlich keinen Plan wie das gehen sollte. Mit GetWindowText kann man den Text ermitteln. Ist das die Funktion die ich brauche oder gibt es für so was eine andere Funktion. Oder muss ich mir die Funktion selber zusammen basteln.

    Könnt ihr mir da etwas weiter Helfen. Danke im Voraus! BlackFalcon





  • Danke aber das Hilft mir auch nicht gerade weiter. Mein Englisch ist nämlich nicht so gut. Ich kann schon Englisch aber dieses Englisch versteh ich fast nicht. Ich muss wohl erstmal Computer Fach Englisch lernen wenn ich Programmieren möchte. Kannst du mir es nicht einbisschen Erklären ListView_EditLabel heißt so viel wie Schau im Listenfeld nach oder Irre ich mich jetzt? Danke erstmal für die Unterstützung Mfg. BlackFalcon



  • Wenn du mit einem ListView arbeitest, dann gibt es hier passenden Beispielcode...

    Du solltest auf jeden Fall über mit der MSDN-Library umzugehen und dich ein wenig zurecht zu finden, denn dort findest du eigentlich fast alles, was du brauchst (naja vielleicht nicht alles, aber auf jeden Fall eine ganze Menge) 🙂



  • Was wäre denn der Einfachere Weg? Hab mir die MSDN schon min. 2 mal angeschaut und werde einfach nicht daraus schlau! Derjenige der mir den Auftrag gegeben hat, hat gemeint ich könnte es mal mit einem Edit Fenster ausprobieren. Noch eine Bemerkung. Ich bin noch ziemlicher Anfänger in der Windowsprogrammierung. MFG. BlackFalcon



  • Um dir zu sagen, welches Control wohl am besten geeignet wäre, müsste man erstmal wissen, was genau du überhaupt vorhast bzw. was das Control leisten soll...



  • Oh sorry! Also das Controll soll folgendes leisten: Er soll die Daten die ich Eingeben habe mir in diesem Feld wieder ausgeben. In etwar so

    ------------
    | [EDC] |
    | 1=xyz |
    | 2=abc |
    ------------

    Verstehst du jetzt was ich meine!
    MFG BlackFalcon



  • OK, wenn du einfach nur deine Datei dort ausgeben willst, nimmst du am besten ein EDIT-Control und setzt ES_MULTILINE
    Du kannst entweder deinen ganzen Text auf einmal einfügen (WM_SETTEXT bzw. SetWindowText), oder stückweise (wie du das anstellst, findest du hier).



  • Habe mir für die 1. Methode entschieden alles auf einmal Auszugeben. Jetzt das Edit Feld so Definiert das im Edit Feld jetzt die Variable ES_MULTILINE Drinnensteht. und mit dem ID_READ eine neue case gestartet habe und mit SetWindowText() in das Edit Feld eintrage. So jetzt kommt aber immer nur 1. Hyroglyp "ζ" so ein ähnliches Zeichen und das glaub ich so viel wie in dem Array szString platz haben. Was ist noch zu tun ich schicke euch (dir) vielleicht mal den Source Code mit.

    hEdit1 = CreateWindow ("edit", NULL, 
    				WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_MULTILINE, 
    				180, cxClient / cyClient + 30, cxClient, cyClient * 10, hwnd, 
    				(HMENU) ID_LIST, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
    
    TCHAR szString[1024];
    
    case ID_READ:
    			ShowWindow (hEdit1, TRUE);
    			SetWindowText (hEdit1, szString);
    			break;
    

    Mfg. BlackFalcon



  • Da fehlt aber zwischendrin noch ein Befehl, der deine Daten liest und in szString einträgt. (das Array ist noch unberührt, also steht dort irgendwelcher Datenmüll drin)



  • szString wird eingelesen und zwar mit dem Befehl WritePrivateProfileString() und mit GetPrivateProfileString() in die Datei eingetragen. Jetzt steht immer wenn ich auf Lesen Drücke diese kommische Zeichen und dahinter noch ein Text das mit einer anderen Variable vereinbart hab. Mfg. BlackFalcon



  • Ich dachte, du willst einfach die ganze ini-Datei in deinem Edit ausgeben? Also müsstest du sie ganz normal mit den Datei-Funktionen (z.B. ReadFile) einlesen und nicht mit GetPrivateProfileString (das brauchst du nur, wenn du sie parsen lassen willst) 🙄


Anmelden zum Antworten