| Autor |
Nachricht |
bIce
Mitglied
Benutzerprofil
Anmeldungsdatum: 30.06.2003
Beiträge: 463
|
bIce Mitglied
12:55:05 22.05.2004 Titel: |
Forms - Fenster aus Dll werden nicht angezeigt. |
Zitieren |
Hi,
ich weiß nicht ob ich dass besser im WinAPI Forum posten sollte, aber ich denke dass es ein VCL-Speziefisches Problem ist.
Also, in einer Dll habe ich eine TForm, diese enthält ein Panel. Ein Programm nun ruft eine funktion der Dll auf und diese liefert das Handle des Panels. Und nun wird mit der WinAPI-Funktion SetParent das Panel der Dll in ein Panel der Anwendung eingefügt. Zumindest sollte es das tun, aber ich bekomme nichts zu sehen.
Ungefähr so sieht das ausprogrammiert aus:
(Das ganze ist in Delphi programmiert, deswegen habe ich vielleicht irgendwelche Fehler eingebaut als ich die Funktionen hier umgewandelt habe. (ist schließlich ein C++-Forum )
Funktion der Dll:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | HWND TTestPlugin::getPanel()
{
if (Form1 == nil){
app_->raiseException("Das Plugin wurde nicht initialisiert");
return INVALID_HANDLE_VALUE;
} else{
return Form1->Panel1->Handle;
}
}
//Erstellt wird das Fenster so:
void TTestPlugin::initialize()
{
if (Form1 == NULL){
Form1 := TForm1(NULL);
}
} | |
Die Funktion der Anwendung die das Plugin einfügt:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [...]
IMETCPlugin* plugin = pluginMgr->getPlugin(
pluginMgr->indexByName(item->Caption));
IMETCPanel* panel = NULL;
if (plugin->QueryInterface(IMETCPanel, panel) == S_OK){
if (item == __prefSelectedListItem_){ // Das Element erhält den Fokus
if (panel->getPanel() != INVALID_HANDLE_VALUE){
Windows::SetParent(panel->getPanel(), pnlContainer.Handle);
ShowWindow(panel->getPanel(), SW_SHOWNORMAL); // das nützt nichts
pnlContainer->UpdateControlState(); // das auch nicht
}else{ // Das Element verliert den Fokus
panel->hidePanel();
}
}
}
[...] | | |
Zuletzt bearbeitet von AndreasW am 23:03:20 27.05.2004, insgesamt 1-mal bearbeitet |
|
 |
Werbeunterbrechung
|
|
 |
bIce
Mitglied
Benutzerprofil
Anmeldungsdatum: 30.06.2003
Beiträge: 463
|
bIce Mitglied
14:17:21 22.05.2004 Titel: |
|
Zitieren |
Hab jetzt hingekriegt, man musste noch die Position des Panels setzten
| C++: | TRect r;
[...]
::SetParent(panel->getPanel(), pnlContainer->Handle);
::GetClientRect(pnlContainer->Handle, r);
MoveWindow(panel->getPanel(), r.Left, r.Top, r.Right, r.Bottom, true); ////
ShowWindow(child, SW_SHOWNORMAL);
[...] | |
Das Problem jetzt ist, dass die Child-Elemente des Panels nicht angezeigt werden
(außer TLabel - wahrscheinlich alle TGraphicControls). Wie kann man sie denn alle zum Anzeigen bringen. Gibt es da etwas besseres als EnumChildWindows()?.
Und gibt es eigentlich eine Align-Funktion (TControl::Align) in der Winapi, oder muss ich diese selbst programmieren? |
Zuletzt bearbeitet von bIce am 14:21:36 22.05.2004, insgesamt 1-mal bearbeitet |
|
 |
bIce
Mitglied
Benutzerprofil
Anmeldungsdatum: 30.06.2003
Beiträge: 463
|
bIce Mitglied
15:50:47 22.05.2004 Titel: |
|
Zitieren |
Ich hab versucht mit EnumChildWindows() alle Steuerelemente des eingefügten Panels anzuzeigen, aber irgendwie wird die callback-funktion nicht aufgerufen. Und auch WinSight zeigt nur das Panel aber ohne Steuerelemente. Ich komme einfach nicht weiter. |
|
|
|
 |
bIce
Mitglied
Benutzerprofil
Anmeldungsdatum: 30.06.2003
Beiträge: 463
|
bIce Mitglied
18:43:23 22.05.2004 Titel: |
|
Zitieren |
mit einem reinen WinAPI-Fenster (genauergesagt Dialog) kommt das Programm zurecht,
(alle Steuerelemente werden angezeigt). Aber alle Fenster in WinAPI zu erstellen ist irgendwie nicht der Sinn der Sache. Ich hab einerseits keinen gescheiten Resourcen-Editor, andererseits sollte es auch mit VCL Zeug funktionieren, nur wie?
(Irgendwie sieht der Thread nach einem Monolog aus. Weiß niemand was über das Thema oder schreibe ich unverständlich?) |
|
|
|
 |
F98
Mitglied
Benutzerprofil
Anmeldungsdatum: 18.06.2002
Beiträge: 3665
|
F98 Mitglied
08:07:07 25.05.2004 Titel: |
|
Zitieren |
Um Deinen Monolog zu beenden:
Schaul mal auf meine Seite unter BCB->DLLs. |
|
|
|
 |
bIce
Mitglied
Benutzerprofil
Anmeldungsdatum: 30.06.2003
Beiträge: 463
|
bIce Mitglied
18:51:34 25.05.2004 Titel: |
|
Zitieren |
|
 |
F98
Mitglied
Benutzerprofil
Anmeldungsdatum: 18.06.2002
Beiträge: 3665
|
F98 Mitglied
08:04:16 26.05.2004 Titel: |
|
Zitieren |
u.U. "Verwenden von Datenbankkomponenten in einer DLL"?
Da habe ich eine Form verwendet. Vielleicht hilft das ja weiter. |
|
|
|
 |
bIce
Mitglied
Benutzerprofil
Anmeldungsdatum: 30.06.2003
Beiträge: 463
|
bIce Mitglied
23:27:34 26.05.2004 Titel: |
|
Zitieren |
| F98 schrieb: | u.U. "Verwenden von Datenbankkomponenten in einer DLL"?
Da habe ich eine Form verwendet. Vielleicht hilft das ja weiter. |
Erstmal danke für die Mühe.
Ein Fenster aus der Dll modal anzuzeigen klappt schon, aber nicht, wenn das Fenster (genauergesagt ein Panel, das sich im Fenster befindet), in meiner Anwendung eingebettet wird. Sozusagen wie ein TFrame. Aber das Problem ist, dass es mit Frames nicht funktioniert, mit Panels alleine auch nicht. Wenn ich aber das Panel mit Komponenten in eine TForm einfüge, als Dll kompiliere, dann werden im Programm selbst nur das Panel mit den Graphischen Komponenten angezeigt, aber Buttons zum Beispiel nicht. Wenn ich aber ein Fenster mit der reinen WinAPI erstelle, so wird scheinbar alles richtig angezeigt. Wieso das mit VCL nicht funktioniert, das verstehe ich nicht. Schließlich wird nur das Handle übergeben und keine Komponenten. Aber auch wenn ich im WinSigh die Fenster durchgehe, dann wird zwar das eingefügte Panel gefunden, aber nicht die Komponenten, die sich darauf befinden.
* Ich hab zwar in den Newsgroups irgendwo gelesen, dass das mit Packages funktionieren sollte, aber ich will keine Packages verwenden, da sie einerseits mit genauderselben Version des BCB/Delphi kompiliert sein müssen, andererseits sich auf BCB bzw. Delphi beschränken. Aber ich möchte es davon unabhängig halten, damit die Dlls auch mit anderen Compilern erzeugt werden können.
* Das mit der reinen WinAPI ist auch schlecht, da ich viele umfangreiche Komponenten wie SynEdit in die Dlls auslagern möchte, und Neuentwicklungen bzw. Erweiterungen von RichEdit gehen gewaltig über mein Wissen hinaus.
* Vielleicht kann man das aber auch mit ActiveForms lösen. Hab aber wenig Erfahrung damit. |
Zuletzt bearbeitet von bIce am 23:29:41 26.05.2004, insgesamt 1-mal bearbeitet |
|
 |
tuküe
Mitglied
Benutzerprofil
Anmeldungsdatum: 04.03.2004
Beiträge: 75
|
tuküe Mitglied
23:53:01 26.05.2004 Titel: |
|
Zitieren |
Hallo,
ich hab zur Zeit ein ähnliches Problem und zwar mit Delphi. Ist ja die selbe VCL. Ich möchte das Fenster aus der Dll in das aufrufende Programm einbetten. Dazu übergebe ich das Handle des Parent-Fensters in das ich das Dll-Fenster einbetten möchte.
Zuerst hab ich das Dll-Fenster als Form eingebettet mit der Api-Funktion SetParent(). Dazu hab ich noch BorderStyle auf bsNone geschaltet. Das hatte noch am besten geklappt. Aber ich habe in diesem Dll-Fenster SpeedButtons mit Flat=true. Wenn man nun mit der Maus das Control verlies, senkten sich die Buttons nicht mehr.
In den Borland NewsGroups hieß es, dass bei Fenstern in Dll's, die nicht Modal angezeigt werden, die CM_MOUSELEAVE Message nicht richtig abgearbeitet wird. Ich habs dann ausprobiert: bei Modaler Anzeige war das Problem weg. Die einzigste Lösung sollen Packages sein. Wie auch du möchte, ich das aber nicht - aus ähnlichen Gründen.
Dann hab ich es noch als TFrame versucht. Ich bekam dann zur Laufzeit eine Zugriffsverletzung ("TFont kann nicht an TFont zugewiesen werden" ), es wurde dann aber dennoch angezeigt. Allerdings wurden die Controls nicht richtig gezeichnet. Sie hatten einen flachen Rahmen, wie bei Ctl3D=true.
Ich hab zur Zeit auch keine Ahnung, wie ich das jetzt in den Griff kriege.
Nur eines steht fest: Keine Packages.
MfG
tuküe |
|
|
|
 |
bIce
Mitglied
Benutzerprofil
Anmeldungsdatum: 30.06.2003
Beiträge: 463
|
bIce Mitglied
18:22:30 27.05.2004 Titel: |
|
Zitieren |
Hallo Leidensgenosse
Ich programmiere auch in Delphi, weil mein BCB schon seit längerem Streikt.
Was ich nicht so ganz verstanden habe ist, wie Du das Fenster mit Komponenten zum Anzeigen gebracht hast. Werden bei Dir alle TWinControls angezeigt? Schließlich ist TSpeedButton ein TGraphicControl.
Das Workaround für den TFont-Fehler ist, das ParentFont auf false zu setzen.
Außer mit Packages sollte es eigentlich auch mit ActiveForms funktionieren, zumindest werden VCL-ActiveForms in VB-Anwendungen und VB-ActiveX-Controls in VCL-Forms ohne Probleme angezeigt (außer bei TDateTimePicker). Aber wie man das "richig" einsetzt weiß ich nicht, muss mich damit etwas auseinandersetzten.
Eine andere Alternative ist, wie ich schon oben schrieb, die WinAPI. |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum nicht antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|