Seite 1 von 1

Express: bestehendes XBP in neuem Dialog benutzen?

Verfasst: Fr, 15. Sep 2006 10:06
von Markus Walter
Hallo,

ich versuche es hier nun auch mal (im Express-Forum habe ich keine Antwort erhalten)...

An die Express-Nutzer (Tom, ... ?):

Kann man in einem neuen Dialog ein bereits bestehendes Xbp benutzen? Also kein neues Xbp erzeugen, sondern nur ein bestehendes plazieren?

Hintergrund ist, dass ich in mehreren (modalen) Dialogen ein XbpHtmlViewer (als Vorschau) verwende. Die Instanzierung des IE dauert immer merklich lange. Also wäre mein Ansatz bereits bei Programmstart ein XbpHtmlViewer-Objekt zu erzeugen und dieses in den einzelnen Dialogen immer nur zu verwenden...

Geht so was?
In purem Xbase++ sollte das ja kein Problem sein...

Verfasst: Fr, 15. Sep 2006 11:16
von Tom
Hallo, Markus.

Wenn ich Dich richtig verstehe, willst Du den Code für bestimmte Komponenten nur einmal schreiben und sie dann in andere Dialoge integrieren, richtig?

Das geht ganz einfach. Zum Beispiel so: Ich habe eine Routine, die ein DCSAY ... GET erzeugt (als einfaches Beispiel, könnte aber auch Dein HTML-Viewer sein):

Code: Alles auswählen

PROC MySayGet (nRow, nCol, oParent, aGetList)
LOCAL GetList := {}, cMeinFeld := Space(30)

@ nRow, nCol DCSAY "Mein Getfeld:" GET cMeinFeld // usw.

DCREAD GUI MODAL EXIT SAVE PARENT oParent
DC_MergeGetLists(aGetList,GetList)
SetAppFocus(oParent)
RETURN
Im aufrufenden Code gehe ich dann wie folgt vor:

Code: Alles auswählen

DCREAD PARENT @oDialog ... EVAL {||MySayGet(10,1,oDialog,GetList)}
Das ist alles. Man sollte allerdings dafür Sorge tragen, daß oDialog (im aufrufenden Dialog) groß genug ist - und nicht die FIT-Klausel verwenden!

Verfasst: Mo, 18. Sep 2006 14:36
von Markus Walter
Hallo Tom,

es geht mir nicht im Code-Wiederverwertung, sondern ich möchte ein XBP (in meinem Fall ein XbpHtmlViewer) nur einmalig ERZEUGEN. Eben weil das Erzeugen eines XbpHtmlViewer relativ lange dauert.

Danach möchte ich dieses instanzierte Objekt in verschiedenen Dialogen verwenden (eben nicht bei jedem Dialog neu erzeugen).

In purem Xbase würde ich eben ein XbpHtmlViewer bei Programmstart erzeugen und in einem neuen Dialog verwenden, Position und Größe neu setzen und ein :configure() ausführen...

Aber ich wüsste nicht, wie ich sowas mit Rogers DC-READ-System umsetzen kann...

Verfasst: Fr, 22. Sep 2006 18:40
von Tom
Roger hat in seinem Webboard eine Lösung vorgeschlagen, ich setzte das einfach mal frech hier herein. Bevor der Dialog zerstört wird (egal, ob er mit oder ohne eXPress erzeugt wurde), wird das Objekt mit :SetSize() auf 0,0 verkleinert, mit :SetParent(oAppDeskTop) aus dem bisherigen Parent-Objekt gelöst und mit :SetPos(1000,1000) ins Nirvana verschoben. Erst danach wird der Dialog zerstört. Wenn man einen neuen Dialog aufbaut, setzt man vor dessen oDialog:Show() die quasi umgekehrte Vorgehensweise - das "alte" Objekt bekommt mit :SetSize() seine ursprüngliche Größe zurück, wird mit :SetParent(oDialog) dem neuen Dialog zugewiesen und mit :SetPos() an eine bestimmte Stelle gesetzt. Das Objekt sollte einer STATIC-Variablen zugewiesen sein. Hinweis: Funktioniert natürlich nur innerhalb eines Threads.

Verfasst: Mo, 25. Sep 2006 11:04
von Markus Walter
Hallo Tom,

habe den Vorschlag von Roger eben auch gelesen. Ich werde das mal so probieren...