Problem z If w WinApi C++

Problem z If w WinApi C++
arekadiusz
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 11 lat
  • Postów:36
0

Dzień dobry!
Od rana męczę się już z instrukcją if. :( Mój problem polega na tym że odczytuję dane z wskazanego pliku ini w którym znajduje się sekcja [sekcja] oraz klucz klucz o wartości wiadomosc. Otwieram ten plik, sprawdzam przy użyciu if czy dany klucz istnieje w danym pliku i jeżeli tak to go odczytuję. Jeżeli otworzyłem dobry plik z podaną sekcją i kluczem wszystko jest pięknie - pokazuje się komunikat że wszystko w porządku. Gorzej jest jeżeli wskaże całkowicie inny plik lub plik ini bez wskazanej sekcji czy klucza. Wtedy program powinien wyświetlić błąd a pokazuje że wszystko w porządku. Dodatkowo stworzyłem pole w którym wyświetla się error czyli plik błędny lub treść klucza jeżeli to poprawny plik. Gdy wybiorę błędny plik w polu wyświetla się error ale z if pokazuje się komunikat że wszystko jest dobrze. Nie mam pojęcia co robię źle. Kod źródłowy z problemem można znaleźć tutaj: http://db.tt/5TOMkU9R (archiwum zip). Z góry dziękuje za każdą pomoc!!

RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
2

if (Bufor==Blad)

Porównujesz tutaj wskaźniki, a nie napisy. Napisy trzeba porównać np. funkcją strcmp. W naszym przypadku - makrem _tcscmp, które dobierze odpowiednią wersję w zależności od ustawionego makra UNICODE. Twój kod nie skompiluje się nawet, gdy będzie ono ustawione. Część kodu, który skopiowałeś z internetu był pisany z myślą o kompatybilności z tymi dwoma trybami, część pisana przez ciebie tylko z ANSI.

Generalnie zasada jest taka: jeżeli chcesz wspierać systemy przed Windows XP to warto wersję ANSI również przygotować. Dobrą sprawą jest pisać kod, który skompiluje się (i będzie działać poprawnie) niezależnie od tego czy będzie ANSI czy Unicode. Trzeb tylko pamiętać, żeby w kwestii napisów nie używać char, a TCHAR; wszystkie literały tekstowe otaczać makrem TEXT, a funkcjom ze standardowej biblioteki C zmienić przedrostek na _tcs i dołączyć nagłówek tchar.h.

Więc zamieniamy tamtą linijkę na if(_tcscmp(Bufor, Blad) == 0).

Natomiast kod dalej nie jest idealny, bo wystarczy, że w pliku ini zamienimy tekst "wiadomosc" na "error". Plik będzie poprawny, ale dostaniemy komunikat o błędzie. Znajdź sobie jakiś inny parser. Te funkcje od obsługi ini są reliktem.

ps. mam wrażenie, że korzystasz z Dev-C++: wywal ten bubel.

edytowany 1x, ostatnio: Rev
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
2

Jeśli piszemy kod WinAPI'owy to raczej polecałbym korzystać z funkcji WinAPI:
Shell String Handling Functions
StrCmp function

Kopiuj
#include <Shlwapi.h>
/* ... */
if(StrCmp(Bufor, Blad) == 0)
edytowany 2x, ostatnio: adf88
arekadiusz
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 11 lat
  • Postów:36
0

Wielkie dzięki! Teraz już rozumiem i działa :D
Tak używam Dev-C++ wiem że jest on lekko przestarzały więc co innego byście polecili? Code::Blocks? Chodzi mi oczywiście o programy darmowe.

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

Code::Blocks, Visual Studio czy nawet Vim.
Wyborów jest mnóstwo.


Spine
...ale wartych polecenia jest niewiele :D
arekadiusz
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 11 lat
  • Postów:36
0

Ok dzięki bardzo. Wybrałem Code::Blocks i mam nadzieje że będzie dobrze.

arekadiusz
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 11 lat
  • Postów:36
0

Mam jeszcze jedno małe pytanko a nie chcę zakładać nowego tematu żeby nie zaśmiecać forum więc mam nadzieję że nikt się nie obrazi jak zapytam w tym temacie. Zainstalowałem Code::Blocks i zacząłem się trochę bawić ale nie mogę wywołać okienka dialogowego. W Dev-C++ używałem funkcji:

Kopiuj
int dialog = DialogBox( GetModuleHandle( NULL ), MAKEINTRESOURCE( 200 ), hwnd, DlgProc );

W Code::Blocks ta funkcja chyba niestety nie działa. Dodam jeszcze że to okienko dialogowe mam napisane w pliku .rc, jego ID jest przechowywane przy pomocy pliku dialog.h w którym mam linijkę: #define ID_MOJDIALOG 200

Kopiuj
.
edytowany 1x, ostatnio: arekadiusz
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Ale co dokładnie nie działa?


arekadiusz
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 11 lat
  • Postów:36
0

Dokładnie dialog mi się nie pokazuje.
Mam przycisk który wywołuje ten dialog po kliknięciu. Klikam więc i dialog się nie pokazuje. Dopisuję tuż przed poleceniem wywołującym dialog instrukcję MessageBox która ma pokazać komunikat przed dialogiem w celu sprawdzenia. Ponownie kompiluję, klikam na przycisk no i małe okienko się pokazuje a dużego okna dialogowego ani śladu. W Dev-C++ dokładnie ten sam kod działał.

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
1

Sprawdź co zwraca funkcja DialogBox i jaki jest kod błędu (GetLastError). Kod błędu możesz zamienić na komunikat tekstowy. Pod poniższym linkiem jest pokazane jak się to robi:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680582.aspx
Możesz przekleić całą funkcję ErrorExit do swojego projektu i wywołać ją zaraz po DialogBox.

Najprawdopodobniej plik zasobów .rc nie został wkompilowany w exe'ka. Masz w ogóle ten .rc dołączony do projektu? Podczas kompilacji w oknie komunikatów kompilatora powinno się wyświetlić compiling plik_zasobow.rc czy coś takiego.

edytowany 7x, ostatnio: adf88
arekadiusz
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 11 lat
  • Postów:36
0

Skopiowałem kod z MSDN, potem po DialogBox wywołałem tą funkcje i po wciśnięciu przycisku wywołującego okienko pojawia mi się takie coś: http://db.tt/X6aDMSjd . A i podczas kompilacji pojawia się compiling: okienko1.rc więc ja już nie wiem co może być nie tak... :(

Ok już jest w porządku :) Dziękuje za pomoc!

edytowany 1x, ostatnio: arekadiusz
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)