Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Formular in ein Fenster eine Fremdapplikation einfügen (https://www.delphipraxis.net/179660-formular-ein-fenster-eine-fremdapplikation-einfuegen.html)

x2ph 23. Mär 2014 10:18

Delphi-Version: XE4

Formular in ein Fenster eine Fremdapplikation einfügen
 
Hallo,

Wir haben eine DB Anwendung mit mehreren zigtausend Zeilen, geschrieben in OMNIS7. OMNIS7 ist ein 4GL System, welches um eigene Befehle in Form von DLL erweitert werden kann. Ein Erweiterungstyp ist eine sogenannte Extended Area, wobei die DLL die Kontrolle über die Darstellung und weitere Funktionalität erhält. Es handelt sich dabei NICHT um ein ActiveX oder COM Objekt.

Ich würde gern die genannte Fläche, die ich über ein HDC ansprechen kann, mit einem Delphi Formular ausfüllen.
Was bereits funktioniert: Ich kann ein Canvas Objekt erzeugen, diesem den HDC zuweisen und dann mit Delphi in das Canvas zeichnen.
Ich würde nun gern ein komplettes Delphi Form dort zeichnen.
Leider ist form.canvas aber eine read-only property.

Frage: kann man irgendwie für ein Form die Canvas Eigenschaft umbiegen oder ist es vielleicht möglich, die Formular-Anzeige irgendwie anders in ein bekanntes HDC umzuleiten?

Und bitte: ein Umschreiben der ganzen Anwendung in Delphi kommt leider nicht in Frage, dazu fehlt mir die halbe Million, die das vermutlich kosten würde.

DeddyH 23. Mär 2014 11:57

AW: Formular in ein Fenster eine Fremdapplikation einfügen
 
Du hast doch einen Devicekontext auf die Zielzeichenfläche und den Quellkontext in TForm.Canvas.Handle, dann kannst Du doch mit BitBlt einfach den einen in den anderen zeichnen, oder habe ich das Problem falsch verstanden?

himitsu 23. Mär 2014 12:23

AW: Formular in ein Fenster eine Fremdapplikation einfügen
 
Zitat:

Zitat von x2ph (Beitrag 1253092)
Leider ist form.canvas aber eine read-only property.

Man kann zwar dennoch das HDC dieses Canvas umbiegen, aber das bringt absolut garnichts, da die Form davon nichts mitbekommt und sich dennoch, über ihr selber zeichnet.

Zitat:

Zitat von x2ph (Beitrag 1253092)
Frage: kann man irgendwie für ein Form die Canvas Eigenschaft umbiegen oder ist es vielleicht möglich, die Formular-Anzeige irgendwie anders in ein bekanntes HDC umzuleiten?

Garnicht.

Wenn es sein buß, dann kannst du aber jeweils selber per Befehl die Form da drauf malen.

Entweder die Form direkt auf das HDC drucken, oder man nutzt die Befehle des Canvas, zum Kopieren.

Falls man lieber ein Canvas durm draufmalen haben will, dann könnte eventuell auch eines der zahlreichen Beispiele suchen, wo über einen HDC irgendwo draufgezeichnet wird.
Sehr oft trifft man dabei z.B. auf das Thema http://www.delphipraxis.net/152582-a...ml#post1032057. :stupid:

Zacherl 23. Mär 2014 17:15

AW: Formular in ein Fenster eine Fremdapplikation einfügen
 
Anderer Ansatz: Ein normales Delphi Formular erstellen und dann MSDN-Library durchsuchenSetParent verwenden, um das Fenster als Child Window deines Zeichenflächencontainers zu registrieren.

Popov 23. Mär 2014 17:39

AW: Formular in ein Fenster eine Fremdapplikation einfügen
 
@x2ph

Wenn es das ist was du wissen willst, dann würde ich behaupten, dass das tagtäglich jeder Bildschirmschoner so macht, wenn man unter Eigenschaften auf Vorschau geht. Hier ein Auszug aus einem meiner Bildschirmschonerprogramme:
Delphi-Quellcode:
    GetWindowRect(ParentWnd, Rec);
    Form.SetBounds(0, 0, Rec.Right - Rec.Left, Rec.Bottom - Rec.Top);
    Windows.SetParent(Form.Handle, ParentWnd);

x2ph 23. Mär 2014 19:00

AW: Formular in ein Fenster eine Fremdapplikation einfügen
 
Erstmal Danke für eure Überlegungen und Ideen.

Ich werde jetzt etwas damit experimentieren und hier berichten.

x2ph 23. Mär 2014 20:46

AW: Formular in ein Fenster eine Fremdapplikation einfügen
 
Zitat:

Zitat von Popov (Beitrag 1253141)
@x2ph

Wenn es das ist was du wissen willst, dann würde ich behaupten, dass das tagtäglich jeder Bildschirmschoner so macht, wenn man unter Eigenschaften auf Vorschau geht. Hier ein Auszug aus einem meiner Bildschirmschonerprogramme:
Delphi-Quellcode:
    GetWindowRect(ParentWnd, Rec);
    Form.SetBounds(0, 0, Rec.Right - Rec.Left, Rec.Bottom - Rec.Top);
    Windows.SetParent(Form.Handle, ParentWnd);

Hallo Popov,

Dein Ansatz funktioniert, sogar besser als gehofft.
Ich kann so ein Form erzeugen und in einem bestehenden Fenster als SubWIndow einfügen. Dabei funktioniert das Form immer noch genauso wie gewünscht.

Ziemlich cool das ganze!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf