Przypisanie liczby poRZądkowej dla buttonu

0

Siemka. Otóż głowię się czy istnieje opcja zastosowania formuły typu:

int lp;
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
			 lp=1;
		 }
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
			 lp=2;
		 }
void user()
{
     buttonlp->Text = "bleble";
}

Kod nie jest dosłowny, ale chodzi mi o zastosowanie. W jaki sposób - jeśli takowy istnieje- mogę to zrobić.
Robiąc kombinację typu:

 button(lp)->Text = "bleble";

Odnajduje zmienną, ale kompilatorowi takie rozwiązanie najwyraźniej nie pasuje ;)

1

Lepiej będzie jak wrzucić swoje przyciski do jakieś tablicy, gdzie indeksem będzie twoja liczba albo mapy, gdzie liczba będzie kluczem.
Jeżeli chcesz to zrobić po nazwie kontrolki (domyślnie designer Visual Studio nazywa pole i jej własność Name na taką samą) to wszystkie one znajdują się w kolekcji Controls twojej formy. Wystarczy przejechać po niej pętlą i sprawdzić ich właściwości Name, które są stringami.

Standardowe pytanie: dlaczego używasz C++/CLI, a nie C#?

0

dodaj pole w klasie:

private: array<Button^> ^buttonlp;

a potem w konstruktorze formy, albo w Form.Load wypełnij tę tablicę:

buttonlp = gcnew array<Button^>(2);
buttonlp[0] = button1;
buttonlp[1] = button2;
0
Rev napisał(a):

Standardowe pytanie: dlaczego używasz C++/CLI, a nie C#?

Nie rozumiem pytania... Przecież to 2 odmienne języki.

Azarien napisał(a):

dodaj pole w klasie:

private: array<Button^> ^buttonlp;

a potem w konstruktorze formy, albo w Form.Load wypełnij tę tablicę:

buttonlp = gcnew array<Button^>(2);
buttonlp[0] = button1;
buttonlp[1] = button2;

Dzięki bardzo :D o to chodziło.
Teraz jeszcze żeby nie zakładać nowego tematu.

std::string pisz;
                 if (kolko == true)
		 {
			 pisz = "O";
		 }
		 else
                { 
			 pisz = "X";
                }
		 buttonlp[lp]->Text = pisz;

Pokazuje komunikat:
error C2664: 'void System::Windows::Forms::Control::Text::set(System::String )' : cannot convert parameter 1 from 'std::string' to 'System::String '
Czy mogę tutaj obejść się jakoś bez konwersji z std::String na System::String?? Na googlach znalazłem sporo sposobów konwersji, więc z tym sobie raczej poradzę, ale zawsze warto mieć kilka alternatyw.

PS. Przepraszam za błąd w nazwie tematu <wstyd mi="mi">

0

No właśnie, sam sobie odpowiedziałeś. C++/CLI jest upierdliwy i wbrew pozorom (książkom typu "wprowadzenie do C++/CLI" z heliona) ten język nie został stworzony do tworzenia interfejsów Windows Forms.
Żeby sprawnie się w C++/CLI poruszać trzeba znać dobrze: C++, .NET oraz to, co wyróżnia samego C++/CLI. Czy jest jakiś powód, dla którego piszesz w tym języku? Jeżeli kazali ci na studiach to pozostaje mi współczuć. Jeżeli chciałeś się nauczyć C++ to.. tak na logikę: powinieneś uczyć się C++, a nie C bądź C++/CLI. Jeżeli chcesz się zapoznać z .NET to naturalnym wyborem będzie C#.
C++/CLI jest używany do pisania wrapperów native <-> .NET. I to nie wszystkich, bo dużą część z nich można wykonać w samym C#.

Niech twój napis będzie typu System::String^. Jeżeli masz jakiś powód, dla którego faktycznie musi być to std::string to skorzystaj z jednej z metod konwersji, które znalazłeś w internecie.

ps. if(kolko == true) -> if(kolko)
ps2. cały ten kod można zamienić na: buttonlp[lp]->Text = (kolko) ? "O" : "X";

0

error C2664: 'void System::Windows::Forms::Control::Text::set(System::String )' : cannot convert parameter 1 from 'std::string' to 'System::String '

W twoim przykładzie po prostu lepiej użyć System::String zamiast std::string i nie konwertować między nimi.

String ^pisz;
if (kolko == true)
{
    pisz = L"O";
}
else
{ 
    pisz = L"X";
}
buttonlp[lp]->Text = pisz;

A jeśli już musisz użyć konwersji, to w C++/CLI robi się to tak:

#include <string>
#include <msclr/marshal_cppstd.h>

using namespace System;
using namespace msclr::interop;

int main()
{
	String ^managed = L"ala ma kota";

	// System::String -> std::string
	std::string native = marshal_as<std::string>(managed);

	// std::string -> System::String
	managed = marshal_as<String^>(native);
}
0
Rev napisał(a):

Czy jest jakiś powód, dla którego piszesz w tym języku? Jeżeli kazali ci na studiach to pozostaje mi współczuć. Jeżeli chciałeś się nauczyć C++ to.. tak na logikę: powinieneś uczyć się C++, a nie C bądź C++/CLI. Jeżeli chcesz się zapoznać z .NET to naturalnym wyborem będzie C#.
C++/CLI jest używany do pisania wrapperów native <-> .NET. I to nie wszystkich, bo dużą część z nich można wykonać w samym C#.

Uczę się z własnej woli. W takim razie powinienem odpuścić sobie VC++ i pisać aplikacje konsolowe ? Zacząłem bawić się w okienka, bo wydaje mi się tutaj większe pole do popisu, ale oczywiście z chęcią przyjmę radę kogoś doświadczonego i bardzo prawdopodobne, że zajdą jakieś zmiany.

PS. à propos studiów to jaki język mógłbym dostać ?

0

Visual C++ to implementacja C++ jako całości, ze wszelkimi rozszerzeniami takimi jak C++/CLI czy C++/CX Microsoftu. Można się nawet pokusić o włączenie C do tego, bo dla kompilatora to tylko kwestia jednego przełącznika. Więc nazwa tego "tworu" pozostaje ta sama.

Jeżeli chcesz się nauczyć C++ to ucz się C++. Tak na dobrą sprawę na sam początek programowanie interfejsu użytkownika w ogóle nie jest potrzebne, ale interfejs konsolowy ma najmniejsze szanse odwrócić uwagę od nauki samego języka.

0

Mnie tam się C++/CLI podoba, również pisanie pod nim programów okienkowych, ale tak już jest że w C# analogiczny program można napisać znacznie szybciej.

po prostu nie jest zalecane, by pisać pod WinForms w C++, bo istnieje do tego bardziej odpowiedni język.

Jeśli chodzi o aplikacje okienkowe w C++, to ostatnio popularne jest Qt. I choć również nie jest to czyste C++, jest tam znacznie mniej magii niż w C++/CLI...

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