Jak wyświetlić zmienną LPSTR za pomocą MessageBox::Show?

0

mam zmienną

LPSTR phonetype;

i potrzebuje wrzucić ją w okienko ale

System::Windows::Forms::MessageBox::Show(phonetype);

daje mi
Error 1 error C2665: 'System::Windows::Forms::MessageBox::Show' : none of the 21 overloads could convert all the argument types
Próbowałem na próbę zminić LPSTR na LPCSTR ale efekt jest dalej ten sam
Oczywiście

System::Windows::Forms::MessageBox::Show(L"test");

działa ok

Proszę o pomoc.
Uczę się OOP w c++ od mniej więcej dwóch lat i od pół roku próbuje przeskoczyć na Visual C++, platformę .net i programowanie pod windows ale co zacznę to takie kwiatki z typami danych mnie zniechęcają.

PS Niektórzy radzą c# bo prostszy ale jakoś nie widzi mi się wykorzenianie z siebie nawyków c++ i wbijanie do głowy tych z c#- czy to błąd?

PS2 Jeżeli ktoś miałby ochotę i czas to szukam "mentora"(ale to głupio brzmi). Po prostu kogoś kto już przebił ten mur z którym walczę, komu mógł bym czasami głupotami d*** pozawracać, kto podsunął by mi jakieś ćwiczenia, coś do poczytania. Zatrudniłem się nawet kiedyś na uczelni informatycznej by się czegoś nauczyć ale dziekan wydziału ledwo "bawił się" PHP i okazało się że w praktyce to jestem tam jedynym informatykiem,

0

PS Niektórzy radzą c# bo prostszy ale jakoś nie widzi mi się wykorzenianie z siebie nawyków c++ i wbijanie do głowy tych z c#- czy to błąd? - kiedyś się chyba trzeba jakiegoś nowego języka nauczyć. Te języki mają na pierwszy rzut oka wiele wspólnego, chociaż tak naprawdę bardzo się różnią.
Być może pomogłoby ci jednak chociaż próba napisania kilku średniołatwych programów w C# - po 1) może się okazać że ten język bardziej ci odpowiada ;). Po 2) - przy pomocy C# łatwo zrozumiesz mniej-więcej jak działa .NET, i jeśli wybierzesz C++\CLI, będziesz w stanie opanować jego zawiłości.

Tak naprawdę sygnatura metody MessageBox.Show wygląda tak:

public:
static DialogResult Show(
	String^ text
)

To ^ to jest .NETowa referencja - można powiedzieć że to taki zarządzany wskaźnik (różniący się od wskaźnika zwykłego, czyli String*). Żeby twój kod zadziałał, musisz stworzyć zarządzany obiekt typu String, i przekazać go tej metodzie.

0

Nie jest to dla mnie jedyny język. Zarobkowo piszę w php, zaczynałem od pascala trochę też pisałem w javie.
A wracając do przykładu, czy da się to zrobić przez rzutowanie?

MessageBox::Show((String^)phonetype);

Edit: niestety się nie da...
zrobiłem tak :

String^ temp = phonetype;
	Windows::Forms::MessageBox::Show(temp);

ale w dalszym ciągu rozbija się o to samo czyli
cannot convert from 'LPSTR' to System::String^
Interesuje mnie w tej chwili już nie jak to przeskoczyć tylko jak to należy zrobić.
Może powinienem od początku używać String^?

0

Na początku zaznaczę że na C++\CLI znam się pobieżnie (ale planuję się zapoznać dokładnie bo język ma naprawdę duże możliwości), za to ogólnie .NET znam całkiem nieźle (rzecz względna, bo są tutaj tacy co mnie na śniadanie zjadają) właśnie dzięki C#.

String ma konstruktor przyjmujący wskaźnik na tablicę znaków - trzeba po prostu stworzyć jego obiekt:

Na pewno zadziała klasyczny, .NETowy sposób, czyli utworzenie obiektu (o zwalnianie się nie musisz martwić):

String^ s = gcnew String(phonetype);

Aczkolwiek programiści C++ chyba nie lubią takiego kodu, więc działa jeszcze coś takiego:

String^ a = %String(phonetype);
  • ale to jest rzecz niemożliwa do uzyskania w C# i, przyznam szczerze, nie mam pojęcia jakie są implikacje takiego zapisu (stworzenie lokalnego obiektu i pobranie adresu).

Pozdrawiam i mam nadzieję że uda ci się rozwiązać problem :)

0

Dla pewności - String^ nie jest stałą, mogę zmieniać jego wartość?

Offtop: Jakie publikację polecacie by zacząć pisanie w C#? (mogą być po angielsku)

aaaaa i może ktoś mi powie jaka jest różnica między "new" a "gcnew"

0

Dla pewności - String^ nie jest stałą, mogę zmieniać jego wartość
W pewnym sensie jest - można traktować go jak const *T a czyli wskaźnik przez który nie można zmienić wartości wskazywanego obiektu.
Przykładowo kod mógłby wyglądać tak:

LPSTR asdf = "asdf";
LPSTR phonetype = "ala ma kota";
String^ s = gcnew String(asdf);
s = gcnew String(phonetype);
s = s->Replace("ala", "sierotka");
s = s->Substring(0, 12) + "rysia";

i może ktoś mi powie jaka jest różnica między "new" a "gcnew"
gcnew to (w C++\CLI) zarządzany odpowiednik new. Tworzy obiekt na zarządzanej stercie.

0
MessageBox::Show(gcnew String(napis));

Dla pewności - String^ nie jest stałą, mogę zmieniać jego wartość?

System::String jest niezmienniczy. Wszystkie funkcje które udają że go zmieniają, tak naprawdę tworzą nowego Stringa, kopiują do niego całą zawartość (ze zmianami) i zapominają o starym.

0

Wielkie dzięki. Rozjaśniło mi to nie tylko String'i ale w ogóle zaczynam powoli rozumieć .net'owy sposób przechowywania danych. Czas zanurkować trochę w dokumentację na msdn.

1 użytkowników online, w tym zalogowanych: 0, gości: 1