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.
- Rejestracja:prawie 6 lat
- Ostatnio:prawie 3 lata
- Postów:14
- Rejestracja:ponad 3 lata
- Ostatnio:około 3 lata
- Postów:93
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#
- Rejestracja:prawie 6 lat
- Ostatnio:prawie 3 lata
- Postów:14
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.
- Rejestracja:ponad 3 lata
- Ostatnio:około 3 lata
- Postów:93
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ą?

- Rejestracja:prawie 6 lat
- Ostatnio:prawie 3 lata
- Postów:14
@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ą.
"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^"
- screenshot-20211222154606.png (37 KB) - ściągnięć: 9
- Rejestracja:ponad 3 lata
- Ostatnio:około 3 lata
- Postów:93
Klaudiusz Sołtysik napisał(a):
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

- Rejestracja:prawie 20 lat
- Ostatnio:12 dni
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
};
}
- Rejestracja:prawie 6 lat
- Ostatnio:prawie 3 lata
- Postów:14
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.

- Rejestracja:prawie 6 lat
- Ostatnio:prawie 3 lata
- Postów:14
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


- Rejestracja:prawie 20 lat
- Ostatnio:12 dni
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.

- Rejestracja:ponad 21 lat
- Ostatnio:2 minuty
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ę.
- Rejestracja:prawie 6 lat
- Ostatnio:prawie 3 lata
- Postów:14
@_13th_Dragon: Prosiłem właśnie o te współrzędne, zrobiłem tak jak potrafiłem
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.