Referenz auf TextBox
-
Hallo zusammen
Ich arbeite mit VS2003. Ich habe nun eine einfache Andwendung mit einem Form in C++ .net geschrieben. Nun habe ich einige "alte" cpp-libraries (prozedural programmert) die ich eingebunden habe. Diese werden vom Programm z.B. beim Druck eines Button aufgerufen. Umgekehrt würde ich aber auch gerne einer Routine aus der "alten" Library eine Referenz auf ein TextBox-Objekt übergeben, damit diese Daten in die Textbox schreiben kann.
Würde mir bitte hier jemand das Zauberwort mitteilen, mit dem ich so etwas machen kann. Über ein kurzes Beispiel würde ich mich noch mehr freuen.
Vielen Dank
Geri
-
Wie meinst Du mit "Zauberwort"!?
Wenn Deine alte Lib nichts von Windows-Forms weiss, dann gibt es AFAIK den einfachen weg, dass Du in Deiner Managed-Welt die alte Methode aufrufst und dann den Rückabewert verwendest um den Text zu setzen...oder was meinst Du genau?
-
Hallo Jochen
Vielen Dank für Deine rasche Antwort. Mit Zauberwort habe ich gemeint, dass es evtl. eine Methode gibt um der "alten" library eine referenz auf die Textbox zu übergeben, damit ich sie von dort aus aufrufen kann. Gedacht habe ich mir z.B.
// als funktion in der "alten" library
Definition einer globalen Variable
textBox ReferenceToCheckBox;
int SetReferenceToCheckBox(textBox myCheckBox)
{
ReferenceToCheckBox = myChechBox; // nun sollte die "alte" lib wissen, wo //die Daten hingeschrieben werden können
}void Calculate(void)
{
// führe eine Berechnung aus
ReferenceToCheckBox->Lines-Add(calculationresult);
}
// ende der "alten" libkann man das irgendwie machen? Den Source code der library habe ich
Die von dir genannte Möglichkeit setzt voraus, dass ich eine der library -Routinen aufrufe und mit dem Rückgabewert die Textbox fülle. Ich möchte es aber gerne umgekehrt machen: Die Library soll die Textbox selbst füllen, wenn sie neue Daten hat, sie läuft nämlich in einer Thread.
Freundliche Grüsse und nochmals vielen Dank
Geri
-
Geri schrieb:
Die Library soll die Textbox selbst füllen, wenn sie neue Daten hat, sie läuft nämlich in einer Thread.
Das geht ja sowieso nicht! Da Du auf Windows-Controls *immer* nur aus dem gleichen Thread zugreifen darfst, der dieses Control auch erstellt hat. Es gibt zwar ein paar Ausnahmen, aber ich würde prinzipiell davon abraten.
Lass doch lieber von der LIB eine WM_APP+x an Deinen Haupt-Thread senden und dann kannst Du ja die Aktionen direkt durchführen, die Du willst (in PreProcessMessage)...
-
Hallo Jochen
Vielen Dank für Deine Rückmeldung.
Verstehe ich das richtig?
1.) Die "alte" Lib erzeugt eine Message mit einer eindeutigen ID und den Daten, die "alte Lib" kennt ausserdem den Handle der Form.
2.) Die Message wird gesendet
3.) In der Windows-Form gibt es eine Art Message-Handler Dieser sieht anhand der ID was zu tun ist und führt die Operation ausFalls das so ist:
in der MSDn gibt es eine Methode zur Erzeugung einer Message.Muss man in der Form dann noch die Fensterprocedure implementieren so wie z.B.
[System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
void WndProc(Message* m) {
// Listen for operating system messages.
switch (m->Msg) {
case WM_ADDTOTEXTBOX:textBox1->Lines->Add(m->Daten);
this->Invalidate();break;
}
Form::WndProc(m);
}Ist das bitte der richtige Ansatz und darf lparam in der Message auch eine Datenstruktur sein?
..oder liege ich damit komplett daneben? Falls es stimmt, wäre es nett, wenn mir bitte jemand ein Beispiel posten würde. Habe schon eingies gegoogelt und in der MSDN nachgeschaut. Wenn man allerdings die schleche Suchbegriffe hat, dann kommt man nicht weiter...
Freundliche Grüsse
Geri