Pomocy przy błędzie !

dział ogólny

Pomocy przy błędzie !

Nowy postprzez Pitek » środa, 14 października 2009, 15:02

Witam wszystkich to mój pierwszy post na forum !
Mam problem z kawałkiem kodu który pozyskałem z poradnika na tronce :
Kod: Zaznacz cały
void __fastcall TForm1::Button8Click(TObject *Sender)
{
FindCells fc;
fc = FindInGrid(StringGrid1, Edit2->Text);
if(fc.Col < 0)
{
  Application->MessageBox(("Nie można odnaleźć „" + Edit2->Text + "”").c_str(),
   "Znajdź", MB_OK | MB_ICONINFORMATION);
  return;
}
StringGrid1->Col = fc.Col;
StringGrid1->Row = fc.Row;
StringGrid1->SetFocus();
}

wyskakują mi takie błedy
Kod: Zaznacz cały
[BCC32 Error] Unit1.cpp(421): E2034 Cannot convert 'const char *' to 'const wchar_t *'
[BCC32 Error] Unit1.cpp(421): E2342 Type mismatch in parameter 'Caption' (wanted 'const wchar_t *', got 'const char *')

Bardzo proszę pomoc z góry dziękuję !



Pozdrawiam pitek3010
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Pomocy przy błędzie !

Nowy postprzez Cyfrowy Baron » środa, 14 października 2009, 15:09

Prawdopodobnie korzystasz ze środowiska C++ Builder 2009, a w tym środowisku zamiast typu AnsiString jest chyba WideString (nie jestem pewien, gdyż jeszcze nie korzystam), więc ten fragment kodu:

Kod: Zaznacz cały
  Application->MessageBox(("Nie można odnaleźć „" + Edit2->Text + "”").c_str(),
   "Znajdź", MB_OK | MB_ICONINFORMATION);


Powinien wyglądać tak:

Kod: Zaznacz cały
  Application->MessageBox(("Nie można odnaleźć „" + Edit2->Text + "”").c_bstr(),
   "Znajdź", MB_OK | MB_ICONINFORMATION);


zamieniłem funkcję c_str() na c_bstr(). Jeżeli to rozwiązuje problem i korzystasz z C++ Builder 2009 to w przyszłości miej na uwadze, że zamiast konwersji z AnsiString do char musisz konwertować z WideString do char, czyli zamiast c_str(), używasz c_bstr().
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Pomocy przy błędzie !

Nowy postprzez Pitek » środa, 14 października 2009, 15:20

Niestety to nie pomogło, tak żeczywiście korzystam z RAD Studio 2010
Jeszcze przy okazji mam problem z wyczyszczenie komponentu StringGrid1 w zakresie od 1-18 kolumny i od 1 do 40 wiersza.
Dzięki !

Pozdrawiam pitek3010
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Pomocy przy błędzie !

Nowy postprzez Cyfrowy Baron » środa, 14 października 2009, 15:28

Na które linie kompilator wskazuje błąd (dokładnie).

Dobrze, żeby się tutaj wypowiedziała osoba korzystająca ze środowiska C++ Builder 2010.



Daj sobie spokój z tym Pozdrawiam pitek3010, bo to nie e-mail tylko forum.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Pomocy przy błędzie !

Nowy postprzez Pitek » środa, 14 października 2009, 15:49

Rozumie że chodzi o pomoc przy MessageBox a co z czyszczeniem StringGrid'a ?
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Pomocy przy błędzie !

Nowy postprzez Cyfrowy Baron » środa, 14 października 2009, 16:29

Jeżeli nie radzisz sobie z czyszczeniem zawartości obiektu StringGrid, to będziesz miał problem z napisaniem tego programu.


Kod: Zaznacz cały
for(int i = 1; i <= 18l i++)
{
  for(int j = 1; j <= 40; j++)
  {
    StringGrid1->Cells[i][j] = "";
  }
}
 
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Pomocy przy błędzie !

Nowy postprzez Witold » środa, 14 października 2009, 23:22

pitek3010 napisał(a):wyskakują mi takie błedy
Kod: Zaznacz cały
[BCC32 Error] Unit1.cpp(421): E2034 Cannot convert 'const char *' to 'const wchar_t *'
[BCC32 Error] Unit1.cpp(421): E2342 Type mismatch in parameter 'Caption' (wanted 'const wchar_t *', got 'const char *')



Nie mam teraz zainstalowanego środowiska z UnicodeString, wiec nie wiem na pewno, ale chyba wystarczy dodać L przed "Znajdz":

Kod: Zaznacz cały
Application->MessageBox(("Nie można odnaleźć „" + Edit2->Text + "”").c_str(),  L"Znajdź", MB_OK | MB_ICONINFORMATION);
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Pomocy przy błędzie !

Nowy postprzez Cyfrowy Baron » czwartek, 15 października 2009, 10:47

Znak L można dodać tylko gdy podajesz tekst jawnie, ale gdy chcesz podać zawartość jakiejś zmiennej typy AnsiString to trzeba chyba użyć WideString:

Kod: Zaznacz cały
  Application->MessageBox(
(WideString)("Nie można odnaleźć „" + Edit2->Text + "”"),
   "Znajdź", MB_OK | MB_ICONINFORMATION
                                       );


Nie jestem jednak pewien, czy nie powinno być tak:

Kod: Zaznacz cały
  Application->MessageBox(
(WideString)("Nie można odnaleźć „" + Edit2->Text + "”").c_bstr(),
   "Znajdź", MB_OK | MB_ICONINFORMATION
                                       );


A tak wogóle to czy w środowisku C++ Builder 2010 nie ma możliwości włączenia w opcjach obsługi AnsiString, bo co zrobić jeżeli projekt został napisany w starszej wersji i zostanie przeniesiony do tej nowszej, wtedy trzeba by go gruntownie przerabiać, żeby wogóle się kompilował. Wydaje mis ie więc, że musi być jakaś opcja umożliwiająca włączenie obsługi AnsiString. Oczywiście nowe projekty, lepiej jest tworzyć z obsługą WideString, w pomocy na pewno jest podane jak dokonać konwersji z AnsiString do WideString.

Odniosę się jeszcze do wypowiedzi Witolda. Jeżeli C++ Builder 2010 domyślnie działa na zmiennej typu WideString, to podając tekst jawnie nie potrzeba chyba konwersji, gdyż powinien go traktować od razu jako WideString, a nie AnsiString. Mogę się oczywiście co do tego mylić.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Pomocy przy błędzie !

Nowy postprzez Witold » czwartek, 15 października 2009, 11:31

Cyfrowy Baron napisał(a):Odniosę się jeszcze do wypowiedzi Witolda. Jeżeli C++ Builder 2010 domyślnie działa na zmiennej typu WideString, to podając tekst jawnie nie potrzeba chyba konwersji, gdyż powinien go traktować od razu jako WideString, a nie AnsiString. Mogę się oczywiście co do tego mylić.


ZTCW od bc2009+ jako String używa się UnicodeString nie WideString.

Co do AnsiString, jest on dostępny ,ale skoro kontrolki używają UnicodeString to po co się ograniczać i dodawać niepotrzebne konwersje ?

Co do "tekstu jawnego" jak nie dodasz przed niego L będzie traktowany jako znaki 1 bajtowe, a z tego co pamiętam niektóre funkcje w BC2009+ oczekują szerokich znaków.

(
Kod: Zaznacz cały
"Nie można odnaleźć „" + Edit2->Text + "”").c_str()

Myślę że to jest dobrze, właściwość Edit2->Text jest typu UnicodeString, a c_str() zwróci wchar_t*
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Pomocy przy błędzie !

Nowy postprzez Cyfrowy Baron » czwartek, 15 października 2009, 12:13

Myślę że to jest dobrze, właściwość Edit2->Text jest typu UnicodeString, a c_str() zwróci wchar_t*


Może i dobrze, ale to właśnie nie działa.

Pytanie: jakiego typu argumentów oczekuje funkcja Application->MessageBox w C++ Builder 2009. W C++ Builder 2007 dwa pierwsze argumenty są typu char, dlatego podając np. komunikat:

Kod: Zaznacz cały
Application->MessageBox("treść komunikatu", "Tytuł", MB_OK | MB_ICONSTOP);


nie trzeba stosować konwersji, gdyż treści przekazane jako argumenty mogą być (zależnie gdzie zostaną użyte) być traktowane zarówno jako char jak i String, tutaj domyślnie są traktowane jako char.

Ale taki kod:

Kod: Zaznacz cały
Application->MessageBox( ("treść komunikatu" + Edit1->Text).c_str(), "Tytuł", MB_OK | MB_ICONSTOP);


wymaga już konwersji, gdyż właściwość Text obiektu TEdit jest typu AnsiString, więc całość jest traktowana jako AnsiString, a więc konieczna jest konwersja do char.

Jeżeli jednak w C++Builder 2009 zarówno tekst jawny jak i właściwość Text obiektu TEdit są typu UnicodeString i funkcja MessageBox oczekuje typu UnicodeString to dodając je nie trzeba niczego konwertować, czyli wystarczyć powinno:

Kod: Zaznacz cały
Application->MessageBox("treść komunikatu" + Edit1->Text, "Tytuł", MB_OK | MB_ICONSTOP);


Jeżeli jednak funkcja MessageBox oczekuje typu AnsiString to trzeba dokonać konwersji z UnicodeString do AnsiString, ale nie da się tego załatwić operatorem c_str().

Przeprowadziłem eksperyment w C++Builder 2007:

Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
wchar_t tekst[255] = L"treść komunikatu";

Application->MessageBox( ( (String)tekst ).c_str(), "Komunikat", MB_OK);
}
//---------------------------------------------------------------------------


To zadziała, ale przecież w C++Builder 2009 i 2010 to nie może być tak skomplikowane

Poza tym z treści komunikatów błędu jasno wynika, że funkcja oczekuje typu wchar_t, więc żadna konwersja nie powinna być potrzebna, gdyż środowisko samo powinno dostosować wprowadzony tekst do potrzeb, czyli wprowadzamy treść komunikatu dodajemy wartość Text obiektu Edit1.

Mam w związku z tym dwa pytania:
Jak środowisko C++Builder 2009 traktuje jawnie wprowadzony tekst, czy jako AnsiString, char, wchar_t, czy może w zależności od tego gdzie jest użyte jako
jedno z tych trzech?

Jakiego typu jest właściwość Text obiektu TEdit w środowisku C++Builder 2009?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Pomocy przy błędzie !

Nowy postprzez banita » czwartek, 15 października 2009, 12:31

domyslny typ w VCL (bcb 2009 i 2010) to UnicodeString. czyli wszystkie text, caption itd...
zapis:

edit->Text = "abc";
powoduje niejawna konwersje do UnicodeString.


co do funnkcji messagebox to nie widze problemu. funkcja przyjmuje wchar_t* wiec np edit->Text ktore jest UnicodeString ma odpowiednie metody aby zwrocic wchar_t* lub char* wystarczy sprawdzic (ctrl+space) i zobaczyc co ktora metoda zwraca.

autor postu powinien zapoznac sie z podstawami programowania, z obiektowoscia i klasami. musi posiadac wiedze na temat klas i tego ze obiekt klasy moze posiadac metody itd...
wtedy taki problem w ogolnie nie bedzie istanial

EDIT:

edit->Text = "abc";

tu "abc" jest char* ale zachodzi niejawna konwersja char* -> UnicodeString bo obiekty UnicodeString posaidaja odpowiedni operator konwersji, natomiast:

Application->MessageBox("treść komunikatu", "Tytuł", MB_OK | MB_ICONSTOP);

to juz nie przejdzie bo funkcja wymaga wcha_t* a dostaje char* a taka konwersja nie moze zajsc niejawnie.
tzreba albo napisac L"komunikat" albo UnicodeString("komunikat").c_str(); <-- to zwraca wchar_t*
aby zmienna UnicodeString zwrocil char* nalezy uzyc metody t_str() albo jakos tak, nie pamietam ale to chyba nie problem klepnac ctrl+space i zobaczyc samemu...?

autor postu powinien wykazac odrobine samodzielnosci a jesli nie posiada podstawowej wiedzy na temat programowania obiektowego powinien odstawic potezne srodowisko programistyczne, wziasc notatnik i nauczyc sie podstaw programowania.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: Pomocy przy błędzie !

Nowy postprzez Pitek » czwartek, 15 października 2009, 22:12

Bardzo dziękuję za zaangażowanie się w rozwiązywanie mojego problemu.
Wystarczyło wstawić "L" przed "Znajdź" i wszystko zagrało.
Chcę sie odnieść do komentarzy w sensie że "nic nie umię" podkreślam że jestem młodym i początkującym programistą i z niektórymi żeczami nie daje=ę sobie rady. W internecie jest stosunkowo mało informacji a jak już są to w niezrozumiałym dla mnie języku. Cały czas staram się kształcić aby być lepszym w temacie C++ ale mam na głowie równierz szkołę. Tak więc jeszcze raz dziękuję i bardzo proszę o wyrozumiałość i chęć dzielenia się wiedzą z takimi jak ja.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Pomocy przy błędzie !

Nowy postprzez banita » czwartek, 15 października 2009, 22:28

wiec szlifuj sam jezyk c++ a nie startuj w srodowisku RAD i VCL
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 9 gości