Seite 1 von 2

DCBROWSE unsichtbar nach Erzeugung

Verfasst: Sa, 20. Jun 2020 8:39
von Manfred
Hi,
ich habe ein Szenario, in dem ich mehrere Browse erzeugen muß, von denen aber immer nur jeweils einer sichtbar sein darf. Also erzeuge ich alle Browser direkt am Anfang und zeige dann immer nur den benötigten über HIDE Codeblock an. leider hat das zur Folge, das bei mehreren Browsern, die erzeugt werden am Anfang immer ein Flackern entsteht und dann erst die Browser versteckt werden. Das stört den User natürlich. Jetzt habe ich es umgekehrt gemacht also nicht so, das der Hideblock versteckt, wenn .F. zurück geliefert wird, sondern direkt ein .F. und wenn der Codeblock .F. zurückliefert, dann wird angezeigt. Das bringt es auch nicht. Also als nächstes in EVAL ein Hide() eingebaut um dann in Kombination mit HIDE Codeblock zum Ziel zu kommen. Das klappt auch nicht. Das Flackern bleibt. Man sieht also erstmal, wie die browser aufgebaut und dann ausgeblendet werden. Also auch nicht erquicklich. Wie bekomme ich es hin, das die Browser erstmal nicht zu sehen sind während der jeweiligen Erzeugung und dann eben nur der jeweils eine Browser sichtbar wird und das Flackern aufhört? Normalerweise kann sowas doch unter xbase++ pur mit show() hide() gemacht werden. Aber wie sage ich express++ das erstmal alles Hide() ist und dann auf Wunsch show() wird? Natürlich nur für die besagten Browser.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Sa, 20. Jun 2020 9:38
von Tom
Häng mal das HIDE direkt in die DCGET OPTIONS. Und setze im EVAL des DCREAD GUI eine Var, die das richtige Browse zur Anzeige bringt. Danach dann Show() für den gesamten Dialog.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Sa, 20. Jun 2020 11:27
von Manfred
habe ich gemacht. DA passiert gar nichts. Es wird nichts versteckt.... Sehr merkwürdig

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Sa, 20. Jun 2020 11:56
von Tom
Mmh. Das hier funzt einwandfrei:

Code: Alles auswählen

FUNCTION MAIN()
LOCAL GetList := {}, GetOptions := {}, oBrowse1, oBrowse2, oDialog, a := Directory(), lShowBrowse1 := .T., lShowBrowse2 := .F.
DCGETOPTIONS NOMINBUTTON HIDE

@ 1,1 DCBROWSE oBROWSE1 DATA a SIZE 100,20 HIDE {||!lShowBrowse1}
DCBROWSECOL ELEMENT 1 HEADER "Test1" WIDTH 20 PARENT oBrowse1

@ 1,1 DCBROWSE oBROWSE2 DATA a SIZE 100,20 HIDE {||!lShowBrowse2}
DCBROWSECOL ELEMENT 2 HEADER "Test2" WIDTH 20 PARENT oBrowse2

@ 22,1 DCPUSHBUTTON CAPTION 'Toggle' SIZE 10,1 ACTION {||lShowBrowse1:=!lShowBrowse1,lShowBrowse2:=!lShowBrowse2,DC_GetRefresh(GetList)}

DCREAD GUI FIT ADDBUTTONS OPTIONS GetOptions PARENT @oDialog EVAL {||oDialog:Show()}

RETURN NIL

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Sa, 20. Jun 2020 11:59
von Manfred

Code: Alles auswählen

********************************************************************************
         DCGETOPTIONS;
           AUTORESIZE;
               BORDER XBPDLG_SIZEBORDER;
                 BUSY "Daten werden geladen";
                COLOR oSysPara:doParaWS:dialog_hg;
            COLORGETS {oSysPara:doParaWS:colorgets_aktiv,oSysPara:doParaWS:colorgets_inaktiv};
              GETFONT oVtpara:us_font_menue;
              HIDE;
           HILITEGETS oSysPara:doParaWS:hilitegets;
          NOESCAPEKEY;
          NOMAXBUTTON;
          NOMINBUTTON;
                PIXEL;
         PRESENTATION oVtPara:aPresGet;
              SAYFONT oVtpara:us_font_menue;
           SAYOPTIONS XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT;
           SCROLLBARS XBP_SCROLLBAR_VERT+XBP_SCROLLBAR_HORIZ;
         TOOLTIPCOLOR oSysPara:doParaWS:tooltipcolor_vg,oSysPara:doParaWS:tooltipcolor_hg;
          TOOLTIPFONT oSysPara:doParaWS:tooltipfont;
          WINDOWWIDTH oDialogZusatz:nFensterBreite;
         WINDOWHEIGHT oDialogZusatz:nFensterHoehe

         DCREAD GUI;
               EVAL {|| oDialog:setFrameState(XBPDLG_FRAMESTAT_MAXIMIZED),;
                        oDialogZusatz:setzePbButton(x_wechsel,oDialog,x_filter,@getlist),;
                        passeBreiteAn(oDialogZusatz),;                          /* oDialogZusatz:MausImKopf(2,"dat_buc",,.T.),; */
                        oDialogZUsatz:aktualisiereBrowse(oDialogZUsatz:oJo),;
                        SetAppFocus(oDialogZusatz:oBrowse);
                    };
              MODAL;
            OPTIONS GetOptions;
             PARENT @oDialog;
              TITLE sag_kopf( oVtPara:N_JOURNAL + x_filter , "JTNR" )
wo ist der Unterschied?

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Sa, 20. Jun 2020 12:11
von Tom
wo ist der Unterschied?
Ich sehe kein oDialog:Show(), aber auch überhaupt kein DCBROWSE (muss ich auch nicht). Hast Du mein Beispiel ausprobiert? Was macht Dein Code genau? Was siehst Du? Nix? Alles? Teile?

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Sa, 20. Jun 2020 12:15
von Manfred
ach so, sorry. Hide versteckt gar nichts. es ist so, als wenn ich es überhaupt nicht benutzen würde. Ich habe DIch/die ANleitung doch so verstanden, das der gesamte Dialog erstmal nicht zu sehen sein dürfte/sollte. Er ist es aber.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Sa, 20. Jun 2020 12:45
von Tom
Doch, tut es. Nimm mal aus meinem Dialog das "oDialog:Show()" aus der EVAL-Klausel des Dialogs, und Du siehst nix. Du kannst das Programm nur noch über die Taskleiste beenden. Wenn es bei Dir anders ist, ist irgendwas im Code falsch.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Sa, 20. Jun 2020 16:59
von Manfred
ok, in einem anderen Programm klappt es. Das muß ich jetzt mal näher untersuchen, was das wieder für ein Mist ist.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 10:40
von Manfred
kann man die Browser nicht während des Betriebs austauschen? Also eine Funktion statt des DCBROWSE in der dann jeweils der entsprechende Browser erstellt wird und dann durch irgendein Refresh oder so den jweils gewünschten browser reinholen und anzeigen? geht sowas innerhalb eines Dialogs mit DCREAD GUI?

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 11:53
von Tom
Das geht mit DC_MergeGetLists().

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 11:56
von Manfred
ok, und damit kann ich dann jeweils die browser gegeneinander austauschen? Das ist eigentlich das. was ich damit bezwecken möchte.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 12:58
von Tom
Nein, Dinge aus der Getlist und aus den Childlists herauszupopeln, das ist recht aufwendig. Ich arbeite auch mit Hide() und Show() - und überlagere mehrere Browses. Das hat - je nach GUI-Performance - manchmal unschöne Seiteneffekte, aber da es das nur in sehr wenigen Dialogen gibt, leben wir bislang damit. DC_MergeGetLists() ist nur für die optionale Erweiterung eines Dialogs gedacht, nicht für das Gegenteil.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 13:01
von Manfred
ok, ich lese heraus, das Du evtl. das gleiche Flackern hast wie ich. Also muß ich erstmal damit leben.
In der Version, die ich gerade umbaue wird das in einer Do While Schleife mit Appbrowse gelöst. Das baut den brower jedesmal neu und da flackert es nicht.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 13:35
von Tom
Hallo, Manfred.

DCBROWSE ist sowieso, äh, flackeranfällig. Ich durchstöbere die Klasse schon seit einer Weile, da gibt es m.E. hier und da ein RefreshAll() zu viel.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 16:10
von Wolfgang Ciriack
Hallo Manfred,
ich würde darauf tippen, dass dein BUSY "Daten werden geladen" dein HIDE aushebelt.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 16:26
von Manfred
Wolfgang,
das ist es auch nicht. Wenn ich Busy ausbaue und dann wie Tom zu Anfang ein Hide mache, dann wird der Dialog zwr erst später aktiv, aber es werden dann trotzdem ert die ganzen browser aufgebaut und die wecken dann den Anschein beim Anwender, als wenn alles flackern würde, weil eben mehrere erzeugt und dann direkt versteckt werden.
D.h. also nachdem alles fertig ist, werden erst die Browser aufgebaut

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 17:48
von Tom
wo ist der Unterschied?
HIDE als Option in DCGETOPTIONS bewirkt, dass die Objekte erzeugt werden, aber die ganze GUI-Schose wartet, um dann beim Show() des Dialogs nachgeholt zu werden. Die HIDE-Klausel beim Control selbst bedeutet, dass es aufgebaut wird (mit GUI) und dann versteckt.

XbpBrowses sind im Vergleich zu anderen Grids in vielerlei Hinsicht problematisch. Ich hatte ja gehofft, dass sich da mit der vollständigen Neuprogrammierung, die es mit/in Xbase++ 2.0 gab, einiges ändert. Ist aber leider nicht der Fall. Abwärtskompatibilität ist ein Killer.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 17:52
von HaPe
Hallo Zusammen !

Es gibt in der Windows-API die Funktion LockWindowUpdate in der user32.dll.
Damit konnte ich auch in EXCEL-VBA das Flackern der Oberfläche minimieren.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 17:56
von Marcus Herz
Die gibst auch als dBase Methode:lockupdate()

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 18:11
von Wolfgang Ciriack
aber es werden dann trotzdem ert die ganzen browser aufgebaut und die wecken dann den Anschein beim Anwender, als wenn alles flackern würde, weil eben mehrere erzeugt und dann direkt versteckt werden.
Dann stimmt in deinem Code etwas nicht, dann sind die Browser auch nicht mit HIDE richtig versehen.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 18:15
von Manfred
Wolfgang,
nur für den Fall,d as es hier irgendwo falsch rübergekommen ist. Das HIDE klappt, aber.....
Es werden erst alle Browser erzeugt und dann angezeigt nacheinander und dann ausgeblendet über HIDE. Und diese Flackerei, die nervt.
Das HIDE ansich funktioniert. Nur erst nachdem alles erzeugt wurde.

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 18:23
von Tom
LockUpdate() stackt nicht. Da Roger das in seinem Code auch nutzt, löst er jedes vorherige LockUpdate(.T.) mit nur einem einzigen LockUpdate(.F.).

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 18:49
von Marcus Herz
Flackern ist wohl xbase spezifisch. In xclass haben wir da auch immer zu kämpfen...

Re: DCBROWSE unsichtbar nach Erzeugung

Verfasst: Di, 16. Mär 2021 19:53
von HaPe
Was ist, wenn man die Controls beim Erstellen erstmal auf TOP = -10000 setzt und diese erst dann an die gewünschte Position bringt wenn Sie angezeigt werden sollen?
So hatte ich ein widerspenstiges OCX txTextControl 25 einigermaßen im griff.