Forum PCLab.pl: mały programik w DEV-C++ szukam pomocy - Forum PCLab.pl

Skocz do zawartości

Uwaga! Uwaga! Lubisz gry w klimatach fantasy? Zmierz się z tysiącami graczy, zagraj za darmo w grę Fragoria!

Otwarty

Ikona Ostatnio dodane tematy

Ikona Najnowsze pliki

Strona 1 z 1
  • Nie możesz rozpocząć nowego tematu
  • Nie możesz odpowiadać w tym temacie

mały programik w DEV-C++ szukam pomocy Oceń temat: -----

#1 Użytkownik jest niedostępny   Keeny Ikona

  • Małomówny
  • Pip
  • Grupa: Forumowicze
  • Postów: 4
  • Dołączył: Wed, 08 Lut 12

Napisany 08 Luty 2012 - 16:15

Witam serdecznie
Stawiam pierwsze kroki w DEV-C++ i postanowiłem zrobić sobie programik - usprawnienie.
Chodzi o modyfikację pliku txt (tak na prawdę to ini) powiedzmy las.ini.
Zrobiłem już sobie okienko, na nim przyciski i tekst ale utknąłem na obsłudze plików.
Czytałem dość sporo ale nie potrafię poskładac tego do kupy :/ i potrzebowałbym pomocy.
Obrabiany plik ma postać:
[brzoza]
drzewo = 1
krzak = jakiś tekst
trawa = 1988
glon = 0

i w praktyce może występować w 4 postaciach. (pos1, pos2, pos3 i posinna)
dogrzebałem się nawet do funkcji GetPrivatePrifileString i Write.... ale:
1. z góry nie wiem w jakim katalogu będzie ten exe i nie mogę ujarzmić getcurrentdirectory
2. writePrivatProfileString działa jak wpiszę na sztywno ścieżkę ale getPrivatProfileString szuka domyślnie tylko w katalogu windows

Zatem porzuciłem ten trop i kombinuję jak:
- przypisać te 5 linijek do zmiennych lin1, lin2, lin3, lin4, lin5
- poddać analizie porównawczej części lin3 i lin4 które znajdują się po ostatniej spacji ("jakiś tekst" oraz "1988")
- przypisać zmiennej X wartość pos1 lub pos2 lub po3 aby ją wyświetlić w oknie.
- w zależności od wciśniętego przycisku stworzyć w miejsce pliku nowy z liniami odpowiadającymi w/w postaciom pliku i wyświetlić nową nową wartość X w tym oknie.

Zagrzebałem się chyba w tłumaczeniu trochę (tak samo jak w moich próbach od paru dni)ale może ktoś z uprzejmych forumowiczów pomógłby dobrnąć do końca projektu? Nie chcę się poddawać ;)

#2 Użytkownik jest niedostępny   ..::DAN::.. Ikona

  • Uzależniony od forum
  • PipPipPipPipPip
  • Grupa: Forumowicze
  • Postów: 1343
  • Dołączył: Cz, 26 Mar 09

Napisany 08 Luty 2012 - 16:53

jak możesz to wytłumacz jeszcze raz jak komuś kto Cie nie zna bez Twoich skrótów myślowych jakich dużo użyłeś.

#3 Użytkownik jest niedostępny   Keeny Ikona

  • Małomówny
  • Pip
  • Grupa: Forumowicze
  • Postów: 4
  • Dołączył: Wed, 08 Lut 12

Napisany 08 Luty 2012 - 19:51

Oczywiście, spróbuję.
Mój program docelowo ma odczytywać, modyfikować i/lub tworzyć pliki las.ini
Przykład takiego pliku jest powyżej.
W praktyce interesuje mnie tylko 5 możliwości takich plików (nazwałem je wyżej postaciami).
Cztery różniące się w 2 i/lub 3 linijce i piąta postać która nie jest żadną z tych trzech.

Występujące postacie takiego pliku:
postać pos_1 zawartość pliku:
[brzoza]
Drzewo = 1
Krzak = abc
Trawa = 1998
Glon = 0

postać pos_2 zawartość pliku:
[brzoza]
Drzewo = 1
Krzak = bcd
Trawa = 1999
Glon = 0

postać pos_3 zawartość pliku:
[brzoza]
Drzewo = 1
Krzak = cde
Trawa = 2000
Glon = 0

postać pos_4 zawartość pliku:
[brzoza]
Drzewo = 1
Krzak = def
Trawa = 2001
Glon = 0

postać pos_inna zawartość pliku:
[brzoza]
Drzewo = 1
Krzak = xxxxx   /* cokolwiek innego niż abc lub bcd lub cde lub def
Trawa = yyyyy   /* cokolwiek innego niż 1998, 1999, 2000, 2001
Glon = 0


I teraz tak. Mam napisany już program który tworzy okno z przyciskami i stałym tekstem.
Kończąc rysować to okno program miałby otwierać aktualnie znajdujący się w bieżącym katalogu plik las.ini
Jeżeli rozpozna postać 1-szą stałym tekstem na oknie napisze "pos_1"
jeżeli rozpozna postać 2-gą stałym tekstem na oknie napisze "pos_2"
.....
jeżeli rozpozna postać inną stałym tekstem na oknie napisze "pos_inna"

Czyli okno byłoby do końca narysowane.
Są na nim 4 przyciski które zapiszą w pliku las.ini odpowiednie linie.
Przycisk 1 nadpisze las.ini do postaci 1
Przycisk 2 nadpisze las.ini do postaci 2
....
Przycisk 4 nadpisze las.ini do postaci 4

Po takim kliknięciu oprócz nadpisania pliku ma zmienić ten jeden wyraz wypisany stałym tekstem w oknie.
Program czeka na zamknięcie, ewentualnie na kolejną zmianę.

Uff..
Może najlepiej jak wkleję obecny kod:
#include <windows.h>
#include <iostream>
#include <conio.h>
#include <sstream>
#include <fstream>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = GetSysColorBrush(15);
    
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "bla bla bla",       /* Title Text */
           WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           300,                 /* The programs width */
           400,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
			/* tu co się ma dziać przy otwieraniu okna, np textboxes itd */
			/* Teksty stałe w oknie */
			CreateWindow(TEXT("STATIC"), TEXT("Manager pozwala skonfigurować ustawienia dfg dfg dfg dfg dfg dfg dgf dsgf dsgf dfg dfg "),
			  WS_VISIBLE | WS_CHILD | SS_CENTER,
			  5, 20, 275, 100,
			  hwnd, (HMENU) NULL, NULL, NULL );
			CreateWindow(TEXT("STATIC"), TEXT("Aktualne ustawienie : "),
			  WS_VISIBLE | WS_CHILD | SS_LEFT,
			  45, 100, 200, 20,
			  hwnd, (HMENU) NULL, NULL, NULL );
			CreateWindow(TEXT("STATIC"), TEXT("Nastaw     pos1"),
			  WS_VISIBLE | WS_CHILD | SS_LEFT,
			  45, 130, 130, 20,
			  hwnd, (HMENU) NULL, NULL, NULL );
			CreateWindow(TEXT("STATIC"), TEXT("Nastaw     pos2"),
			  WS_VISIBLE | WS_CHILD | SS_LEFT,
			  45, 160, 130, 20,
			  hwnd, (HMENU) NULL, NULL, NULL );
			CreateWindow(TEXT("STATIC"), TEXT("Nastaw     pos3"),
			  WS_VISIBLE | WS_CHILD | SS_LEFT,
			  45, 190, 130, 20,
			  hwnd, (HMENU) NULL, NULL, NULL );
			CreateWindow(TEXT("STATIC"), TEXT("Nastaw     pos4"),
			  WS_VISIBLE | WS_CHILD | SS_LEFT,
			  45, 220, 130, 20,
			  hwnd, (HMENU) NULL, NULL, NULL );
			/* Przyciski */
			CreateWindowEx(0, "BUTTON", "ustaw", WS_CHILD | WS_VISIBLE,
			190, 130, 60, 20, hwnd, (HMENU) 1, NULL, NULL );
			CreateWindowEx(0, "BUTTON", "ustaw", WS_CHILD | WS_VISIBLE,
			190, 160, 60, 20, hwnd, (HMENU) 2, NULL, NULL );
			CreateWindowEx(0, "BUTTON", "ustaw", WS_CHILD | WS_VISIBLE,
			190, 190, 60, 20, hwnd, (HMENU) 3, NULL, NULL );
			CreateWindowEx(0, "BUTTON", "ustaw", WS_CHILD | WS_VISIBLE,
			190, 220, 60, 20, hwnd, (HMENU) 4, NULL, NULL );
			CreateWindowEx(0, "BUTTON", "Przywróć inną konfigurację", WS_CHILD | WS_VISIBLE,
			45, 280, 210, 20, hwnd, (HMENU) 5, NULL, NULL );
			CreateWindowEx(0, "BUTTON", "Info", WS_CHILD | WS_VISIBLE,
			45, 320, 100, 20, hwnd, (HMENU) 6, NULL, NULL );
			CreateWindowEx(0, "BUTTON", "Zamknij", WS_CHILD | WS_VISIBLE,
			155, 320, 100, 20, hwnd, (HMENU) 7, NULL, NULL );
			/* NAJPIERW ZROBIĘ SOBIE KOPIE AKTUALNEGO PLIKU do las.sol*/
			CopyFile("las.ini", "las.sol", FALSE);
		
			
			/* *** TU CHCIAŁEM DZIAŁAĆ DALEJ ALE SIĘ ZAWIĄZAŁEM  ***** */



		break;
		
		case WM_COMMAND:
			/* cała akcja programu*/
			
			/* akcje po wybraniu odpowiedniego przycisku*/
			if (LOWORD(wParam) == 1){
				/* NADPISUJE LAS.INI WARTOŚCIAMI POSTACI POS_1 */
			}
			
			if (LOWORD(wParam) == 2){
				/* NADPISUJE LAS.INI WARTOŚCIAMI POSTACI POS_2 */
			}
			
			if (LOWORD(wParam) == 3){
				/* NADPISUJE LAS.INI WARTOŚCIAMI POSTACI POS_3 */
			}
			
			if (LOWORD(wParam) == 4){
				/* NADPISUJE LAS.INI WARTOŚCIAMI POSTACI POS_4 */
			}
			
			if (LOWORD(wParam) == 5){
				/* pRZYWRACA POSTAĆ POS_INNA */
				CopyFile("las.sol", "las.ini", FALSE);
			}
			
			if (LOWORD(wParam) == 6){
				MessageBox(hwnd, "bla bla bla", "bla bla bla v1.0", MB_ICONINFORMATION );
			}
			
			if (LOWORD(wParam) == 7){
				PostQuitMessage (0);
			}
		break;

        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}



Ten dopisany tekst stały ("pos1" lub "pos2" .... "pos_inna") miałby być po zdaniu "Aktualna konfiguracja:", najlepiej innym kolorem.
Myślę że teraz jaśniej choć dłużej.
pozdrawiam

Ten post był edytowany przez Keeny dnia: 08 Luty 2012 - 19:54


#4 Użytkownik jest niedostępny   ..::DAN::.. Ikona

  • Uzależniony od forum
  • PipPipPipPipPip
  • Grupa: Forumowicze
  • Postów: 1343
  • Dołączył: Cz, 26 Mar 09

Napisany 08 Luty 2012 - 21:34

Wiem i rozumiem o co Ci chodzi i znalazłem gotowa obsługę ini przez winapi.

http://lublin.webd.p.../winapi8_1.html

To Ci pomoże. jak rozumiem to w zależności od co będzie wartościami kluczy to chcesz wykonać jakaś akcje. Z tym będzie prościej bo masz gotowa funkcje do tego.

#5 Użytkownik jest niedostępny   Keeny Ikona

  • Małomówny
  • Pip
  • Grupa: Forumowicze
  • Postów: 4
  • Dołączył: Wed, 08 Lut 12

Napisany 08 Luty 2012 - 22:41

dziękuję za odpowiedź. Jak wspomniałem w pierwszym poście siedzę nad tym któryś dzień niestety.
Na podanej przez Ciebie stronie też byłem. Nie mówiąc o tej link.
Sęk w tym że ostatnim parametrem tych funkcji jest fullpath, a mój program z założenia nie wie gdzie będzie wykonywany. Plik ini zawsze ma w swoim folderze. Nie potrafię ujarzmić funkcji GetCurrentDirectory aby przypisała jakiejś zmiennej string tę ścieżkę. Zmienną tą wówczas mógłbym chyba umieszczać jako ostatni parametr w fullpath+"las.ini".
Poza tym któraś z tych funkcji o których teraz rozmawiamy, o ile się nie mylę, co byśmy nie wpisali odnosi się tylko i wyłącznie do folderu windows więc ...
skoro zagubiłem się we mgle C++, to odważyłem się tu zwrócić o pomoc ;)

#6 Użytkownik jest niedostępny   BlackBishop Ikona

  • Uzależniony od forum
  • PipPipPipPipPip
  • Grupa: Forumowicze
  • Postów: 2810
  • Dołączył: Nd, 14 Wrz 08

Napisany 08 Luty 2012 - 23:30

Zobacz postKeeny, o 08 Luty 2012 - 22:41, napisał(a):

skoro zagubiłem się we mgle C++


nie mgle C++ ale WinApi - jeśli jesteś początkujący to chyba najszybsza droga do zniechęcenia się do programowania

jaki błąd masz z GetCurrentDirectory? podaj kawałek kodu

#7 Użytkownik jest niedostępny   mejt Ikona

  • Gaduła
  • PipPipPip
  • Grupa: Forumowicze
  • Postów: 175
  • Dołączył: Cz, 16 Wrz 10

Napisany 09 Luty 2012 - 08:30

W jaki sposób wołasz tę funkcję do odczytania CWD? Ja zrobiłem taki test jak poniżej i u mnie to działa. Jedyna różnica to to, że kompilowane w Visual Studio 2010 Express.

CHAR buffer[1000];
GetCurrentDirectory(1000, buffer);
MessageBox(hwnd, buffer, "CWD", MB_ICONINFORMATION );


#8 Użytkownik jest niedostępny   Keeny Ikona

  • Małomówny
  • Pip
  • Grupa: Forumowicze
  • Postów: 4
  • Dołączył: Wed, 08 Lut 12

Napisany 11 Luty 2012 - 10:57

Zobacz postmejt, o 09 Luty 2012 - 08:30, napisał(a):

W jaki sposób wołasz tę funkcję do odczytania CWD? Ja zrobiłem taki test jak poniżej i u mnie to działa. Jedyna różnica to to, że kompilowane w Visual Studio 2010 Express.

CHAR buffer[1000];
GetCurrentDirectory(1000, buffer);
MessageBox(hwnd, buffer, "CWD", MB_ICONINFORMATION );



O wielkie dzięki majt wyświetla mi ścieżkę do bieżącego folderu.
Utknąłem jednak na chyba najprostrzych rzeczach. Moje doświadczenie (też wątpliwe) sięga TurboPascala5.5 i ciężko mi wyczytać z poradników potrzebnych rzeczy bo tam są same bardziej zaawansowane :D
zatem mam już swoją ścieżkę w zmiennej buffer typu char. A chciałbym to pociągnąć dalej w tym sensie (wyrażenia niefachowe z góry przepraszam):
buffer = buffer + "\ini.ini"
/* abym miał pełną ścieżkę do pliku ini.ini w zmiennej buffer, którą następnie mógłbym używać w funkcjach GetPrivatProfileString() i WritePrivatProfileString()
ale buffer jest typu char i pomijając że w c++ tak się stringów nie łączy to chyba mam tu konflikt typów.
Jak te początkowe znaki z buffer (cała ścieżka do katalogu) przypisać jakiejś zmiennej typu string? Chyba byłoby mi wtedy łatwiej.
pozdrawiam

#9 Użytkownik jest dostępny   d2uriel Ikona

  • Orator
  • PipPipPipPip
  • Grupa: Forumowicze
  • Postów: 718
  • Dołączył: Pt, 21 Wrz 07

Napisany 11 Luty 2012 - 12:40

Skorzystaj z strcpy() do konkatenacji tekstu. Ewentualnie zamiast tego, skorzystaj z bibliotek, które mają wbudowaną obsługę łańcuchów znakowych (ja polecam Qt). Dzięki nim będziesz mógł również zbudować łatwo, szybko i przyjemnie całe GUI i osiągnąć to, co planujesz. Aaa, parser .ini też posiadają :D.

Dodatkowym plusem będzie fakt, że korzystanie z Qt wymusi na Tobie opuszczenie złego Dev-C++ na rzecz chociażby Qt Designera czy Netbeans'ów.

Ten post był edytowany przez d2uriel dnia: 11 Luty 2012 - 12:41


Strona 1 z 1
  • Nie możesz rozpocząć nowego tematu
  • Nie możesz odpowiadać w tym temacie

1 Użytkowników czyta ten temat
0 użytkowników, 1 gości, 0 anonimowych