Wskaźnik na przycisk CLR C++

0

Hej,
Mam do zrobienia zadanie na studia, grę memory. Postawiłem na projekt w Visual Studio przy użyciu okienek i przycisków. Chciałbym aby moja klasa miała wgląd na to, które przyciski są aktywne (maksymalnie 2 jednocześnie), a następnie aby metoda w klasie mogła je obsłużyć. Niestety wszystko co próbowałem nie działa, a profesorowie są na wakacjach. Chciałbym to zrobić tak:
-są 2 wskaźniki
-na zdarzenie on click, button przekazuje swoje id do wskaźnika, wyświetla tekst i robi się Enabled = false (2 ostatnie funkcje oczywiście już mam)
-klasa zdecyduje czy tekst ma przyciskach się zgadza i za pomocą id przywróci je do stanu pierwotnego (zakrytego), lub zostawi odkryte (nie mogę nawet zaincludować mojej formy do klasy, wyskakują błędy w niezwiązanych na moje oko miejscach, które wcześniej się nie pojawiały, np przy deklaracji obiektu mojej klasy o "^" który tam jest.
Jeśli coś jest niejasne piszcie to wytłumaczę. Proszę o pomoc.

0

Pokaż przynajmniej wiersz który się nie kompiluje.

1

Nie opisuj kodu - choćby błędnego - ale go daj
Eventy maja parametr sender, który identyfikuje np button

ps. nie używaj tego koszmaru C++/CLI, rób w "czystym" .NET C#

0

Jeśli coś jest niejasne piszcie to wytłumaczę. Proszę o pomoc.

Nie tłumacz tylko wrzuć kod.

0
MOJA KLASA:

#pragma once
#include <time.h>
#include <cstdlib>
#include "MyForm.h"

using namespace System;

ref class Memory
{
public:
    Button* pointer1;
    Button* pointer2;

    void logic() {
        *pointer1->Text = " ";
        *pointer1->Enabled = true;
        *pointer2->Text = " ";
        *pointer2->Enabled = true;
    }
};

MOJA FORMA:

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
	game->moves++;
	label2->Text = game->moves.ToString();
	button1->Enabled = false;
	button1->Text = game->board[0];
	button1 = *pointer1;
	game->logic();
}

To jest to co chciałbym zrobić, nie wklejałem tego co działa. Program wykrywa ok 100 błędów, np niezadeklarowanie obiektu klasy, który jest zadeklarowany tak:
Memory^ game = gcnew Memory();
błąd oczywiście wcześniej nie występował.
To jedna z wersji, żadna nie działa, wiem, że jest pewnie całkowicie źle. Dlatego pytam jak zrobić coś takiego co opisałem.

0

Masz "klasyczny": wskaźnik na zarządzany obiekt "Button", nie mam pojęcia czy to w ogóle jest legalne. Dwa style wskaźników to jest jeden z wielu syfów C++/CLI
Błagam Cię, rzuć to, idz na porządny język.

Klaudiusz Sołtysik napisał(a):
> np niezadeklarowanie obiektu klasy, który jest zadeklarowany tak:
> Memory^ game = gcnew Memory();

To nie za bardzo się nazywa deklaracja.

> Program wykrywa ok 100 błędów, 

jeśli po tym stwierdzeniu spodziewasz się, ze ktoś tu coś pomoże, to gratuluję zaufania. Jakie one są i do jakich linii się odnoszą?
0

@J.Muzykant:
Nie nauczę się nowego języka w 3 tygodnie, chciałbym tylko wiedzieć jak zadeklarować wskaźnik na przycisk i go użyć, dalej sobie chyba poradzę.
Błędy odnoszą się do wskaźników i nie mają sensu, bo przykładowo visual chce średnika przed gwiazdką.
screenshot-20211222154606.png

"Masz "klasyczny": wskaźnik na zarządzany obiekt "Button", nie mam pojęcia czy to w ogóle jest legalne."

Zdecydowanie nie jest to legalne. Chcę to przerobić właśnie tak jak przerabiałem np tablice z tych konsolowych, bo tutaj robi się je zupełnie inaczej, lub tak jak to że "string" w CLR to "String^"

0
Klaudiusz Sołtysik napisał(a):

@J.Muzykant:

Nie nauczę się nowego języka w 3 tygodnie

Chyba że będzie znacznie prostszy. Na przykład takie błędy się nigdy nie zdarzą "z mocy ustawy". Masz je że tak powiem* "na własną prośbę"*
Zwłaszcza, że C# jest aktualizowany, z ogromnym wsparciem z internecie, a CLI jest zahamowaną starą wersją bez w/w

Kod WinForms jest bardzo, bardzo podobny, bo to C+++/CLI kopiuje rozwiązania stamtąd

0

Lepiej użyj Panelu zamiast Button

#pragma once

namespace CppWinForm1 
{

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	/// <summary>
	/// Summary for MyForm
	/// </summary>
	public ref class MyForm : public System::Windows::Forms::Form
	{
	public:
		MyForm(void)
		{
			InitializeComponent();
// Dopisujesz kawałek do konstruktora
			float colSize = 100.0 / tableSize;
			float rowSize = 100.0 / tableSize;
			System::EventHandler ^click = gcnew System::EventHandler(this, &MyForm::pnClick);
			System::Windows::Forms::ColumnStyle ^columnStyle = gcnew System::Windows::Forms::ColumnStyle(System::Windows::Forms::SizeType::Percent, colSize);
			System::Windows::Forms::RowStyle ^rowStyle = gcnew System::Windows::Forms::RowStyle(System::Windows::Forms::SizeType::Percent, rowSize);
			//this->tableOfPanels->ColumnCount = 0;
			this->tableOfPanels->ColumnStyles->Clear();
			this->tableOfPanels->ColumnCount = tableSize;
			for (int x = 0; x < tableSize; ++x) this->tableOfPanels->ColumnStyles->Add(gcnew System::Windows::Forms::ColumnStyle(System::Windows::Forms::SizeType::Percent, colSize));
			//this->tableOfPanels->RowCount = 0;
			this->tableOfPanels->RowStyles->Clear();
			this->tableOfPanels->RowCount = tableSize;
			for (int y = 0; y < tableSize; ++y) this->tableOfPanels->RowStyles->Add(gcnew System::Windows::Forms::RowStyle(System::Windows::Forms::SizeType::Percent, rowSize));
			for (int y = 0; y < tableSize; ++y)
			{
				for (int x = 0; x < tableSize; ++x)
				{
					System::Windows::Forms::Panel ^pn = (gcnew System::Windows::Forms::Panel());
					this->tableOfPanels->Controls->Add(pn, y, x);
					pn->Dock = System::Windows::Forms::DockStyle::Fill;
					pn->Tag = (y << 5) | x;
					pn->Click += click;
					pn->BackColor = System::Drawing::SystemColors::ControlDark;
				}
			}
		}

	protected:
		// Dopisujesz tą metodę
		private: System::Void pnClick(System::Object^  sender, System::EventArgs^  e)
		{
			System::Windows::Forms::Panel ^pn = (System::Windows::Forms::Panel^)sender;
			int v = *((System::Int32 ^)(pn->Tag));
			int y = v >> 5;
			int x = v & ((1 << 5) - 1);
			this->Text = String::Format("{0} x {1}", y, x);
		}
			 /// <summary>
			 /// Clean up any resources being used.
			 /// </summary>
			 ~MyForm()
			 {
				 if (components)
				 {
					 delete components;
				 }
			 }

	protected:

	protected:

	private:
		/// <summary>
		/// Required designer variable.
		/// </summary>
		const static int tableSize = 8;
	private: System::Windows::Forms::TableLayoutPanel^  tableOfPanels;


			 System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
			 /// <summary>
			 /// Required method for Designer support - do not modify
			 /// the contents of this method with the code editor.
			 /// </summary>
			 void InitializeComponent(void)
			 {
				 this->tableOfPanels = (gcnew System::Windows::Forms::TableLayoutPanel());
				 this->SuspendLayout();
				 // 
				 // tableOfPanels
				 // 
				 this->tableOfPanels->ColumnCount = 2;
				 this->tableOfPanels->ColumnStyles->Add((gcnew System::Windows::Forms::ColumnStyle(System::Windows::Forms::SizeType::Percent,
					 50)));
				 this->tableOfPanels->ColumnStyles->Add((gcnew System::Windows::Forms::ColumnStyle(System::Windows::Forms::SizeType::Percent,
					 50)));
				 this->tableOfPanels->Dock = System::Windows::Forms::DockStyle::Fill;
				 this->tableOfPanels->Location = System::Drawing::Point(0, 0);
				 this->tableOfPanels->Name = L"tableOfPanels";
				 this->tableOfPanels->RowCount = 2;
				 this->tableOfPanels->RowStyles->Add((gcnew System::Windows::Forms::RowStyle(System::Windows::Forms::SizeType::Percent, 50)));
				 this->tableOfPanels->RowStyles->Add((gcnew System::Windows::Forms::RowStyle(System::Windows::Forms::SizeType::Percent, 50)));
				 this->tableOfPanels->Size = System::Drawing::Size(284, 262);
				 this->tableOfPanels->TabIndex = 0;
				 // 
				 // MyForm
				 // 
				 this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
				 this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
				 this->ClientSize = System::Drawing::Size(284, 262);
				 this->Controls->Add(this->tableOfPanels);
				 this->Name = L"MyForm";
				 this->Text = L"MyForm";
				 this->ResumeLayout(false);

			 }
#pragma endregion

	};
}
0

OK udało mi się naprawić to co mam. Utworzyłem button array i wrzuciłem tam każdy z przycisków. Teraz będę for em sprawdzał kolejno text w każdym. Nie wiem czy to legalne, zdecydowanie nie optymalne dla komputera. Sprawdzałem c# ale uczelnia naciska na c++, no i jednak tam też coś nie grało. Dziękuję również za propozycję użycia panelu, ale nie potrafiłem skompilować podanego kodu, ani utworzyć cokolwiek mądrego samemu.

0

private: array<Button^>^ buttonArray = gcnew array<Button^>(16);

//przypisanie buttonów do tablicy

if (buttonArray[guess1]->Text != buttonArray[guess2]->Text) {
_sleep(1500);
buttonArray[guess1]->Enabled = true;
buttonArray[guess1]->Text = " ";
buttonArray[guess2]->Enabled = true;
buttonArray[guess2]->Text = " ";
}

Kod dla zainteresowanych

0

Po kiego ci ta tablica, skoro można dla każdego przycisku przypisać współrzędne?
Ba nie tylko współrzędne a nawet id obrazka, w sumie samego Id obrazka wystarczy.

1
Klaudiusz Sołtysik napisał(a):

zdecydowanie nie optymalne dla komputera

Bez znaczenia, tablica obiektów to nie jest jakiś wysiłek dla komputera, nie robisz tego milion razy na sekundę.

0

@_13th_Dragon: Prosiłem właśnie o te współrzędne, zrobiłem tak jak potrafiłem

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