Windows Form Pointer

10/17/2012 01:28 bloodx#1
Hallo, ich weis nicht genau ob der Titel wirklich passend ist ~.~

Ich habe mir in meiner DLL jetzt eine Windows Form geadded.. Funktioniert alles Wunderbar!

Jetzt will ich aber z.b listbox werte außerhalb von der Form Klasse ändern von anderen Funktionen halt aus..

So rufe ich die Form auf ganz normal..

Code:
int Main()
{
	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false); 
	Application::Run(gcnew KalWindow());
	return 0;
}
hier möchte ich die Labels jetzt als Beispiel auf a immer ändern... klappt aber nicht, es passiert garnix weil ich mit gcnew eine neue Instanz der Form wohl aufrufe?! Meine frage ist halt wie ich das lösen kann ohne gcnew.

wenn ich nur KalWindow^ form1; benutze -> crash..
Code:
void MyRecv(char* szBuffer,int iLenght) 
{
	switch(szBuffer[2])
	{
case 0x32:
		{
                        KalWindow^ form1 = gcnew KalWindow();
			form1->UpdateLabels("a","a","a");
		}
		break;
}
}
Code:
public: void UpdateLabels(String ^lbl1, String ^lbl2, String^ lbl3)
				{
					label1->Text = lbl1;

					label2->Text = lbl2;

					label3->Text = lbl3;
				}
10/17/2012 03:30 SmackJew#2
Übergebe einen Zeiger auf deine KalWindow Instanz und rufe deren Methoden auf?
10/17/2012 03:55 bloodx#3
Quote:
Originally Posted by SmackJew View Post
Übergebe einen Zeiger auf deine KalWindow Instanz und rufe deren Methoden auf?
Ich bin glaube ich schon zu lange daran =D könntest du mir netterweise Zeigen was du meinst? ._.
10/17/2012 04:19 SmackJew#4
Quote:
Originally Posted by bloodx View Post
Ich bin glaube ich schon zu lange daran =D könntest du mir netterweise Zeigen was du meinst? ._.
Kenne mich mit dem C++/CLI Zeug nicht aus, aber die Syntax scheint so auszusehen:

Code:
int Main()
{
    KalWindow^ mainform = gcnew KalWindow();
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 
    Application::Run(mainform);
    return 0;
}

void MyRecv(char* szBuffer, int iLenght, const KalWindow ^ form) 
{
    form->UpdateLabels("a","a","a");
}
Und dann eben mit

Code:
MyRecv("bla", 3, mainform);
übergeben.

Ich weiß leider nicht genug über dein Projekt, ist das MyRecv ein Hook und wird vom Spiel gecallt? Dann könntest du dein Form Handle zum Beispiel in einem Singleton kapseln und so von MyRecv drauf zugreifen, oder das ganze einfach global machen.
10/17/2012 04:39 bloodx#5
Danke für die Hilfe :)


Die idee hatte ich auch schon probiert nur kann ich keine Globale Dekladieren mit KalWindow^ mainform; z.b
Code:
Fehler	1	error C3145: "mainform": Eine globale oder statische Variable darf nicht den verwalteten Typ "TestForm::KalWindow ^" aufweisen.
und ja MyRecv ist ein Hook :)
10/17/2012 05:01 SmackJew#6
Hm dann ist das wahrscheinlich nur in einer Klasse erlaubt:

Code:
public ref class KalWindowManager {  
public:  
    static KalWindow^ form;
}
Code:
int Main()
{
    KalWindowManager::form = gcnew KalWindow();
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 
    Application::Run(KalWindowManager::form);
    return 0;
}

void MyRecv(char* szBuffer, int iLenght) 
{
    KalWindowManager::form->UpdateLabels("a","a","a");
}
Ob das ganze so funktioniert weiß ich leider nicht, habe auch wenig Motivation mir die syntaktischen Feinheiten von C++/CLI anzueignen. :P

Schöner wäre es sicher als Singleton, und das macht auch Sinn wenn du ohnehin nur ein KalWindow hast, gibt sicher einige Beispiele für Singletons in C++/CLI.
10/17/2012 09:48 MoepMeep#7
Dein wechsel von C++ auf C++/CLI auf C# und wieder zurück auf C++/CLI in nur wenigen Stunden ist ziemlich interessant Kevin. :>
Mit der Methode wirst du übrigens noch auf viel mehr Probleme stoßen, ich hab dir gestern schon mehrmals gesagt du sollst vernünftig arbeiten. GUI im recv ändern? Ich bitte dich, hör auf bei Bakabug's altem code abzuschauen.
10/17/2012 09:50 bloodx#8
Quote:
Originally Posted by MoepMeep View Post
Dein wechsel von C++ auf C++/CLI auf C# und wieder zurück auf C++/CLI in nur wenigen Stunden ist ziemlich interessant Kevin. :>
Mit der Methode wirst du übrigens noch auf viel mehr Probleme stoßen, ich hab dir gestern schon mehrmals gesagt du sollst vernünftig arbeiten. GUI im recv ändern? Ich bitte dich, hör auf bei Bakabug's altem code abzuschauen.
Ich will informationen aus dem RECV ausgeben in einer Textbox halt wie soll ich es sonst machen?

Naja das gefällt mir bisher besser als diese C# lösung :x
10/17/2012 09:55 MoepMeep#9
MVC anyone? ;o
10/17/2012 11:32 bloodx#10
Jemand noch eine Idee wie ich es anders lösen konnte?

oder muss ich doch wieder auf WinAPI zurück greifen?