[Visual C++]Klasy, referencje, wskaźniki i Windows Forms


(Masterslynx) #1

Analizowałem i kombinowałem już na kilka(naście) różnych sposobów jak ostatecznie można rozwiązać problem, który zacząłem w poprzednim wątku. Było kilka koncepcji, między innymi podział programu na poprawny sposób, czyli definicja do .h, implementacja w .cpp. W tym wypadku zaczęły się problemy z rozważaniami co tak na prawdę gdzie powinno być. Zwłaszcza w przypadku inicjalizacji komponentów i tworzeniu zdarzeń dla obiektów. Najpierw, proszę o krótkie info jak powinno wyglądać poprawne odniesienie do zmiennej (nie całej klasy) klasy głównej. Powiedziałbym formy, bo klasa w tym wypadku jest formą, ale niech zostanie klasa, bo niektórzy się czepiają. przyjmijmy, że klasa główna ma nazwę Form1, czyli standardową. Od razu mówię, że to:

Form1^ cos = gcnew System::Windows::Forms::Form();

i to

Form1^ cos = Form1();

w przypadku formy głównej nie działa poprawnie. (includy oczywiście są) Kwestia podziału na dwa pliki. Co gdzie powinno być ? Dajmy na razie taki prosty przykład programu do podziału. Interesuje mnie zwłaszcza kwestia tworzenia zdarzeń dla obiektów. inf. o zdarzeniu (gcnew) są dodawane przy inicjalizacji komponentu, a metody są na końcu. Wychodziłoby na to, że trzeba przerzucić 90% programu, a to się mija z celem.

#pragma once

#include "cos.h"


namespace kataloger {

	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 for slider

	///

	/// WARNING: If you change the name of this class, you will need to change the

	/// 'Resource File Name' property for the managed resource compiler tool

	/// associated with all .resx files this class depends on. Otherwise,

	/// the designers will not be able to interact properly with localized

	/// resources associated with this form.

	/// 

	public ref class slider : public System::Windows::Forms::Form

	{

	public:

		slider(void)

		{

			InitializeComponent();

			//

			//TODO: Add the constructor code here

			//

		}


	protected:

		/// 

		/// Clean up any resources being used.

		/// 

		~slider()

		{

			if (components)

			{

				delete components;

			}

		}

	public: System::Windows::Forms::Button^ button1;

	protected: 


	private:

		/// 

		/// Required designer variable.

		/// 

		System::ComponentModel::Container ^components;


#pragma region Windows Form Designer generated code

		/// 

		/// Required method for Designer support - do not modify

		/// the contents of this method with the code editor.

		/// 

		void InitializeComponent(void)

		{

			this->button1 = (gcnew System::Windows::Forms::Button());

			this->SuspendLayout();

			// 

			// button1

			// 

			this->button1->Location = System::Drawing::Point(107, 36);

			this->button1->Name = L"button1";

			this->button1->Size = System::Drawing::Size(75, 23);

			this->button1->TabIndex = 0;

			this->button1->Text = L"button1";

			this->button1->UseVisualStyleBackColor = true;

			this->button1->Click += gcnew System::EventHandler(this, &slider::button1_Click);

			// 

			// slider

			// 

			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->button1);

			this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::None;

			this->Name = L"slider";

			this->Text = L"slider";

			this->ResumeLayout(false);


		}

#pragma endregion

	private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) 

			 {

				 this->Close();

			 }

	};

}

Była trzecia propozycja, a raczej powód tych wszystkich błędów. Jak wygląda kwestia dodawania includów w visualu ? Jest tam też specjalny plik stdafx.h na includy. Domyślam się, że wykorzystywany przy "precompiled header", ale że tego na razie nie potrzebuje to tam nie wrzucam. Dlaczego mówię o includach ? Bo to one powodują błędy. Nakładają się, wykluczają, sam nie wiem. Wiem, że gdy do głównej i podrzędnych klas dodajemy hierarchicznie nagłówki to przy próbie załadowanie w drugą stronę (klasa podrzędna ładuje nagłówek klasy głównej) wywala listę błędów spowodowaną wykluczeniem innej klasy z głównej formy (klasy). Trochę to skomplikowane, ale tak wygląda problem. Szukam odpowiedzi na to już od paru dni. Jak coś mi się jeszcze przypomni lub będzie wymagało dodatkowych wyjaśnień to napiszę.

-- Dodane 23.12.2010 (Cz) 19:29 --

Temat już nieaktualny. Zrobione. Pomogli na innym forum.


(Ryan) #2

Ja na tym forum tylko zasugeruję, żebyś przestał się męczyć z C++/CLI. Jeśli nie piszesz warstwy komunikacji kodu natywnego z zarządzanym, to po co się mordować z zarządzanym C++?