Frage zu XbpListbox

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Frage zu XbpListbox

Beitrag von Jan »

Moin,

gibt es eigentlich eine Möglichkeit, eine XbpListbox mit einer vorgegebenen Anzahl Einträge zu initialisieren? Analog zu aArray := Array(nn).

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von Martin Altmann »

Ja - einfach ein leeres Array der gewünschten Größe nehmen ;-)
Aber was soll das bringen? Oder ist Deine Frage einfach nur unglücklich formuliert?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von Jan »

Hallo Martin,

es geht mir um fogendes: Wenn ich ein Array fülle, dann gibt es zwei Methoden: aArray := Array(nn) + aArray := xEintrag, oder AAdd(xEintrag). Die zweite Methode ist die langsamere. Jetzt habe ich überlegt ob es eventuell etwas bringen würde, wenn ich bei einer Listbox auch von Vorneherein angebe, wie viele Einträge es gibt, und die dann einfach mit SetItem() fülle.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von Martin Altmann »

OK - aber eigentlich geht das flott. Zumindest wenn man es "richtig" macht (wobei ich Xclass++ nutze und das befüllte Array bereits vor dem :create() der Listbox hinzufüge...).
Ansonsten: Nimm ein leeres Array der richtigen Größe und dann kannst Du es korrekt befüllen.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von Jan »

Hallo Martin,

jetzt steh ich irgendwie auf dem Schlauch: Ein komplettes Array in die XbpListbox einfügen? Wie geht denn das? Ich kenn das immer nur mit einzelnen Sätzen ...

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von Martin Altmann »

Moin,
wie geschrieben: Ich nutze Xclass++!
Aber dort wird bei Hinzufügen eines Arrays dieses ebenfalls mittels :addItem() Element für Element hinzugefügt.
Geht aber schnell genug, wenn man das vor dem :create() der Listbox macht!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Frage zu XbpListbox

Beitrag von AUGE_OHR »

Jan hat geschrieben:gibt es eigentlich eine Möglichkeit, eine XbpListbox mit einer vorgegebenen Anzahl Einträge zu initialisieren? Analog zu aArray := Array(nn).
so ist es bei WC_LISTBOX vorgesehen aber Alaska hat es bei XbpListbox nicht so umgesetzt :(

ich habe auf der Devon 2012 das native Listbox Control von der DXE Lib vorgeführt und die Methode heisst o:_AddBigArray(aArray)

Code: Alles auswählen

INLINE METHOD _AddBigArray(aArray)
LOCAL iMax   := LEN(aArray)
LOCAL nLen   := 0
LOCAL nBytes
LOCAL i
*LOCAL nStart := 0
*LOCAL nDiff1 := 0

   //
   // find max Item Lenght
   //
   AEval( aArray, {|x,i| IF(LEN(x)>nLen,nLen:=LEN(x),NIL) } )
   //
   // reserve Memory
   //
   nBytes := iMax * nLen
   ::LB_InitStorage(iMax,nBytes)

   //
   // store hole Array
   //
   ::aItems := ACLONE( aArray )

   //
   // AddString to Listbox
   //
   // Note : when Ownerdraw DATA, Window might limited
   //        so you need you ::NumItems() of LB_ADDSTRING
   //
   //        ::LB_SetItemData(nIndex,cString) will just
   //        "replace" DATA when need to display
   //
   IF ::DrawMode = XBP_DRAW_NORMAL
*      nStart := SECONDS()
       AEval( ::aItems, {|x,i| ::LB_SetItemData(i-1, x) } )
*      nDiff1 := SECONDS() - nStart
*      MSGBOX("native  Listbox :"+STR(nDiff1) )
   ELSE
*      nStart := SECONDS()
       AEval( ::aItems, {|x,i| @User32:SendMessageA( ::hLBox,LB_ADDSTRING,0, x) } )
       AEval( ::aItems, {|x,i| ::LB_SetItemData(i-1, x) } )
*      nDiff1 := SECONDS() - nStart
*      MSGBOX("ownerdraw Listbox :"+STR(nDiff1) )
   ENDIF
RETURN
der Performance Unterschied, bei > 10000, wird hauptsächlich durch die Speicher Anforderung bewirkt welches aus der Länge und Breite bestimmt wird.

p.s. das Gegenstück

Code: Alles auswählen

INLINE METHOD _GetBigArray()
LOCAL aRet := {}
   aRet := ACLONE( ::aItems )
RETURN aRet
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von brandelh »

Hallo Jan,

dein Problem ist NICHT dass du 20 oder 30 Zeilen adden musst, sondern dass er bei jedem die Bildschirmanzeige updated (Bildschirmausgaben sind langsam).
Doch dafür gibt es zwei Methoden, ich zitiere ...
, indem die Methoden :lockUpdate(.F.) und :invalidateRect() ausgeführt werden. Insgesamt ergibt sich dadurch ein schnellerer Bildschirmaufbau.
also

Code: Alles auswählen

oLB:lockUpdate(.t.)
do while .t.
    oLB:additem(...)
    ...
enddo
oLB:lockUpdate(.F.)
oLB:invalidateRect()
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von Jan »

Hallo Hubert,

ich denke nicht daß das hier ein Problem sein könnte. Ich zeige die Listbox nicht an, sondern habe da eine XbpComboBox. Die XbpListbox fülle ich, damit der Dropdown die Liste vorlegt. Da wird während des Füllens also nichts angezeigt.

Zu Martin: Gute Idee, das vor dem Create() zu machen. Geht aber nicht. Da die GUI-Elemente sofort bei der Dialogerstellung erstellt werden, die XbpListbox aber erst beim SetInputFocus gefüllt wird, um immer aktuell zu sein. Da ist das :create also definitiv schon gelaufen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von brandelh »

Kann man addItem() überhaupt VOR dem Create ausführen ?

@ JAN

hast du mal probiert ob :lockUpdate() einen Unterschied ausmacht ?
Auch wenn du tatsächlich das Control noch nicht anzeigst, könnten dennoch Laufzeitunterschiede bestehen.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von Martin Altmann »

Hubert,
zumindest mache ich das bei XClass++ so - und die haben ja (u.a.) die XbpListBox als Superklasse.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von brandelh »

ich wundere mich nur, früher hies es alle Methoden erst nach Create (bis auf wenige Ausnahmen z.B. xbpPrinter:list() ),
dann wurde das eingeschränkt auf die Methoden, die ein Betriebssystem handle benötigen (das ist erst nach create da) ...
und da wundere ich mich nur wie eine XbpListBox() addItem() ausführen soll, bevor Create() die Betriebssystem handles erhalten hat.

Aber ich weiß es auch nicht und zum Test habe ich jetzt keine Zeit.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von brandelh »

ich habe das mal ausprobiert (anbei die Testumgebung).
Ein oXbpListBox:AddItem() ist vor oXbpListBox:create() möglich (kein Laufzeitfehler), aber es führt nichts aus !
Bei einer Versteckten Listbox ist die Sperre noch etwa 20% schneller (0.10 Sekunden bei 1000 Zeilen),
aber wirklich groß ist der Unterschied bei sichtbarer Listbox (50% schneller).

Allerdings bin ich überrascht, dass auf meinem (nicht mehr ganz neuen) i5-2500 selbst die sichtbaren 1000 Zeilen nur 0.25 Sekunden benötigen.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von Jan »

Hallo Hubert,

Danke für den Test. Ich werd das mal versuchen. Es ist zwar so, das die meiste Zeit für das Zusammenstellen der Listbox für das Zusammenstellen der Satzinhalte gebraucht wird. Aber da es oftmals mehrere 1.000 Sätze sind bin ich Dankbar für jede halbe Sekunde, die das insgesamt schneller geht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DelUser01

Re: Frage zu XbpListbox

Beitrag von DelUser01 »

Hallo Jan,

habe das Thema etwas mitverfolgt.
Jetzt würde mich aber doch interessieren was Ihr/Du mit so großen ListBoxen ( > 1000 Einträge) macht?
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von Jan »

Hallo Roland,

es geht darum, in einem Programm für Familienforscher Daten für Personen zu erfassen. Orte, Eltern, und Ehepartner werden in den ComboBoxen zur Auswahl gestellt. Und da das Programm netzwerkfähig ist (da arbeiten auch Vereine mit) stelle ich die Listen immer direkt beim :setInputFocus der betreffenden Felder zusammen, damit immer die aktuellsten Daten zur Verfügung stehen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DelUser01

Re: Frage zu XbpListbox

Beitrag von DelUser01 »

Hallo Jan

das sind dann viele Listboxen aber nicht nur eine mit 1000 Einträgen - oder ich verstehe das immer noch nicht.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von Jan »

Roland,

das gibt für jede Person eine für die Eltern, 15 für Ehepartner, und irgendwas um die 60 oder 70 für Orte (Geburt, Taufe, all die Hochzeiten Kirchlich-Standesamtlich-Scheidung, Bürgerort, etc.). Wobei in allen 15 Ehepartner-Dropboxen die gleichen Listen erscheinen, und in den ganzen Orts-Dropboxen auch die gleichen. Aber es gibt eben so viele SLE, wo man das eintragen kann.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DelUser01

Re: Frage zu XbpListbox

Beitrag von DelUser01 »

Hallo Jan

nun soweit klar - in einer Maske hast Du zig Auswahllisten.
Das alles aufzubauen mit den vielen Möglichkeiten das dauert natürlich...
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Frage zu XbpListbox

Beitrag von Jan »

Hallo Roland,

sooo ist dann ja auch wieder nicht. Z. B. haben alle Comboboxen für den Ehepartner den gleichen Inhalt. Ich habe das Füllen der Comboboxen asugelagert in eine eigene Funktion, und alle gleichen Felder greifen dann auf die gleiche Funktion zurück. Alles andere wäre ja Wahnsinn.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten