locked
Listbox probleme RRS feed

  • Frage

  • Hallo comunity.. 

    ich habe ein problem, unzwar habe ich eine Klasse geschrieben, die ich 42x auf einem formular verwende.. Zweck Kalender.. 

    Meine Klasse besteh aus einem container, in dem sich ein weiterer conteriner befindet.. in diesem sind meine Datenverarbeitungs controls: Textfelder, editfeld ect.. und auch zwei listboxen.. eine von denen ist beim start invisible. Sie wird direckt wie folgt gefüllt:

    select tabelle
    scan
    cantainer1.container2.Listbox2.addListitem(tabelle.feld1 + " " + tabelle2)
    endscan 

    per buttenclick wird diese Liste dann sichtbar. Wenn mann dann einen dplclick auf eines dieser ListItems macht, sollte folgender code ausgeführt werden:

    this.parent.List1.addListItem(this.Value) 
    this.removeListItem(this.ListItemId)
    this.visible = .f.

    nun passiert folgendes.. 

    ich starte das formular, mit den 42 containern (<-- meine Klasse). ich wähle einen Container aus und clicke auf den button, den die unsichtbare liste sichtbar macht.. nun doppelclicke ich auf einen eintrag. 

    Der Eintrag wir in die List1 geschrieben und verschwindet aus der List2, nur dass der Eintrag in der List1 nicht sichtbar ist.. aber das item ist vorhanden und lässt sich selecten. 

    doppelklicke ich ein weiteres mal auf einen eintrag der List2, so kommt die nachricht, dass der Arrayindex nicht stimmt.. 

    ich habe aber gar kein array erstellt (jedenfalls nicht selber.. Ich kann mir vorstellen, dass die liste das selbst gemacht hat) 

    Weiß jemand wieso diese fehlermeldung kommt, oder wieso ich die verschobenen einträge nicht sehen kann??


    • Bearbeitet Schosch93 Freitag, 5. Juli 2013 11:51
    Freitag, 5. Juli 2013 11:42

Alle Antworten

  • Hallo Schosch,

    wenn Du die Methode "addListItem" verwendest musst Du mehrere Parameter angeben.

    Dieser Code sollte funktionieren.

    select tabelle
    scan
    cantainer1.container2.Listbox2.additem(tabelle.feld1 + " " + tabelle2)
    endscan

    this.parent.List1.ADDITEM(THIS.LIST(THIS.LISTINDEX))
    THIS.REMOVEITEM(THIS.LISTINDEX)

    Bei mir tut er dies jedenfalls. Auch solltest Du prüfen ob es sinnvoll ist beim füllen der Listbox die Feldinhalte zu trimmen. "nicht sichtbar ist.. aber das item ist vorhanden und lässt sich selecten" hört sich so an als wäre ein Item ohne Inhalt eigefügt.

    Gruss Uli


    • Bearbeitet Uli Münch Samstag, 6. Juli 2013 05:55 unvollständig
    Samstag, 6. Juli 2013 05:50
  • Additem()/Removeitem() sollten mit Listbox.Listitem genauso funktionieren wie AddListItem()/RemoveListItem mit Listbox.ListItemID. ICh sehe keinen Fehler, er muss dann irgendwo anders liegen.

    In beiden Fällen nutzt Du das der Listbox nativ zugehörige Array List() und daher kommen bei Addressierung mit nicht existenten ListItem bzw ListItemID Arrayfehlermeldungen. Gerade im DblClick solltest Du prüfen, ob der nicht ins leere ging und ListItem bzw. ListItemID nicht 0 sind.

    Eigentlich machst Du nichts falsch, denn die Hilfe zu ListItemID beschreibt, daß die Listitems ihre ListItemID beibehalten, auch wenn per RemoveListItem ein Element irgendwo aus der Mitte entzogen wird. Aber wie gesagt der Fall 0 kann auf jeden Fall sein.

    Ich selbst habe diese Kombination aus zwei Listboxen zum hin und her selektieren von Elementen einmal generisch mit Cursoren programmiert, Man kann prima Items per DELETE entfernen, per RECALL wieder reaktivieren, per SCATTER NAME in ein Objekt transferieren, dass man auf der anderen Seite per INSERT FROM NAME einfügt. Identifizierung per primärschlüssel, bei bedarf wird einer generiert, Sortierung ist beliebig per Index möglich, was wesentlich andere Sortierung zuläßt, als Listbox.Sorted=.T. der Selektierte Eintrag ist der per Recordpointer aktive Datensatz, bei Multiselect kann das trotzdem nur einer sein, aber dann muß man im Selected()-Array der Listbox Selected(Listitem)=.F. setzen, dann ändert sich ListItem zum  nächste selektierte Eintrag oder wird 0 und auch der REcordpointer bewegt sich.

    Nur so als Anregung.

    Tschüß, Olaf.


    Olaf Doschke (Setmics)

    Montag, 8. Juli 2013 05:12
  • das habe ich geprüft, in dem ich im debugger nach Listbox.ListItemID und nach Listbox.Value gefragt habe, in beiden Listboxen. 

    bei der auswahl listbox wurde immer die passende ID und auch das Passende Value ausgegeben. also denke ich mal nicht, dass mein doppelklick ins leere ging. 

    Das heißt also ich versteh immer noch nicht, wieso nicht das gewünschte Ergebnis erzielt wird. -.-
    Montag, 8. Juli 2013 06:37
  • Ich sehe auch immer noch kein Problem in Deinem Code. Das Problem muss also woanders liegen. Du zeigst zu wenig, bzw. Du schaust Dir zu wenig an.

    Und trotzdem würde ich es eben anders machen, wenn's so nicht funktioniert. Manchmal macht es keinen Sinn sich tot zu suchen, wenn es viele einfache Alternativen gibt.

    Ich habe versucht Dein Problem nachzustellen, geht nicht. Ich fülle eine Listbox mit AddListItem() wie Du, ich nutze den Code für DblClick, und es geht. Die Daten können auch nicht das Problem sein, wenn Du die Einträge in der Listbox siehst, kommen Sie 1:1 in die andere Listbox.

    Du hast nicht zufällig in der Listbox, die nicht geht auch noch Controlsource und/oder Rowsource auf ein Feld bzw. eine Tabelle gesetzt? Um die Listbox sein internes List Array anzeigen zu lassen, läßt man Control- und Rowsource leer und RowsourceType auf dem Defaultwert 0 (None).

    Allgemein gesagt: Da die eine Listbox Deine Daten anzeigt, vergleiche alle Eigenschaften der anderen Listbox. Ist da etwas anders?

    Tschüß, Olaf.


    Olaf Doschke (Setmics)

    Mittwoch, 10. Juli 2013 08:50
  • Das einzige was mir als besonderheit einfallen würde ist an der stelle, dass sich die listboxen in einem container befinden. dieser container befindet sich seinerseits in einer abgeleiteten containerklasse. Diese Klasse benutze ich dann 42x auf einem formular.

    Ich habe versucht damit einen termin kalender zu imitieren, mit jeweils 6 reihen a 7 tage (ein Tag = eine Klasse) 

    die Klasse an sich ist im init auf 84 pixel in der höhe und 96 pixel in der breite begrenzt. Der enthaltene container ist invisible. mit einem doppelklick auf die klasse render ich diese neu an einer anderen position mit den maßen höhe = 564pixel und breite = 744 pixel...

    wenn dies passiert, wird auch der enthaltene container visible. Und somit auch sein inhalt (das ist der einzige grund des containers, um code zu sparen..

    beide listen haben weder eine source, noch eine surce typ.. ich lasse sie lediglich mit einer schleife, die verschiedene tabellen auf ihre inhalte prüfen und passende inhalte mit addlistitem() hinzufügen. (so war jedenfalls der plan). Ich habe zuerst aus testgründen nur die eine Liste gefüllt.

    die schon gefüllte liste ist invisible und wird auf einen knopfdruck sichtbar. sollte sie sichtbar sein wird sie auf dem selben knopf wieder unsichtbar. (klappt bis hier hin)

    Ich kliacke auf den butten der die Liste sichtbar macht. (Hierbei tritt ein eigenartiges phänomen auf) die Liste wird sichtbar, an der stelle, an der sich sein sollte UND an der Stelle an der sie Liste vor der neupositionierung war. (ich habe schon geschrieben, dass ich die komplette klasse beim "vergrößern" neu positioniere..) Ich habe dieses Phänomen mal als "Schattenobjekt" definiert, weil ich nicht wusste wie man das nennt. 

    wenn ich den Formularrand darüberziehe, so das der schatten außerhalb des Formulars gerät verschwindet er (aber auch nur der teil, der außerhalb des Formulars gerät) 

    Naja.. jedenfalls ist die Liste nun sichtbar und gefüllt. Und dann kommt der doppelklick und das althergebrachte Problem mit den Einträgen ohne Inhalt. 

    Mittwoch, 10. Juli 2013 13:42
  • Verschieben des Containers, sichtbar und unsichtbar schalten, all das ändert nichts an dem realtiven Verweis this.parent.List1 aus List2 heraus. D.h. List2 eines Containers füllt die List1 Listbox, die parallel dazu im selben Container liegt.

    Das Schattenobjekt ist schon merkwürdig.

    Container lassen sich ineinander Schachteln, soweit kein Problem, der äußere Container bestimmt den sichtbaren Bereich, innere Container sind nur innerhalb dessen Grenzen sichtbar, wie machst Du also den inneren Container immer an derselben Stelle im Formular mit 564x744 Pixel sichtbar? Wenn Du Container1.Container2.Top und Container1.Container2.Left so änderst, dass Container2 eine Position im Gesamtformular neben Container1 hätte, wird Container2 nicht sichtbar.

    Irgendwas stimmt vielleicht mit Deiner Containerstruktur wirklich nicht und was meinst Du mit "neu rendern" eigentlich?

    Tschüß, Olaf.


    Olaf Doschke (Setmics)

    Mittwoch, 10. Juli 2013 15:14
  • also ich verändere nur die position des oberen containers.. das heist ich sage Container1.Top = int-wert.. 

    der container 1.container2 liegt immer an der selben stelle, weil top und left eines objekts immer abhängig vom parent sind. das heißt ich brauche den container1.container2 nicht zuverschieben.

    Mit "rendern" meine ich nur das das objekt grafisch neu erstellt wird, was ja bei jeder grafischen veränderung der fall ist, und sei es nur die änderung der top-eigenschaft (Hab ich so zumindest in der schule gelernt.. Kann sein dass es anders geschrieben wird, wusste ich nicht mehr so genau, aber das ist ja nicht wichtig)

    Also ich sage beim container1.container2 nur Visible = .t. sonst nichts den rest erledigt container1.top/left

    Ich werde es jetzt mal anders versuchen, ohne meine Klasse, und werde die Anzahl der objekte um 86 objekte + Childobjekte veringern.. 

    Mal gucken, vielleicht klappt es ja dann :)

    Donnerstag, 11. Juli 2013 12:50
  • Du wirst es schon hinkriegen, aber mit zu wenig Nachvolziehbarem Code kann man Dir leider nicht helfen.

    Tschüß, Olaf.


    Olaf Doschke (Setmics)

    Samstag, 13. Juli 2013 07:59
  • Ich habe dir alles an code gegeben, was irgentwie was damit zusammen hängt und erklärt wie ich jeden einzelnen schritt programmiert habe.. Ich guck mal weiter.. wenn ich was gefunden habe sage ich bescheid
    Montag, 15. Juli 2013 06:40
  • Das stimmt schon, nur geht das besser, ich habe schon ein Beispiel nachprogrammiert, was das geschilderte Verhalten nicht hat, also muss irgendwas mehr sein. Du könntest z.B. mal ein Zip teilen mit Codebeispiel. Platz zum Teilen gibt's überall, MS, Google, Amazon, DropBox, NSA.

    Tschüß, Olaf.


    Olaf Doschke (Setmics)

    Montag, 15. Juli 2013 08:40
  • darf ich nicht. Firmen software -.-
    Montag, 19. August 2013 11:46
  • Codebeispiel

    beispiel

    Ich verlange von Dir nicht die komplette Applikation.

    Du kannst ein Demoprojekt aufsetzen und ein kurzes Formular, was das gleiche Problem hat, ohne allen Kladderadatsch und Daten drum herum.

    Wenn, dann halt nicht. Wie soll dann jemand helfen?

    Tschüß, Olaf.


    Olaf Doschke (Setmics)

    Donnerstag, 22. August 2013 11:08
  • Hat sich das Problem erledigt, ist es gelöst? Oder gibt's noch Bedarf nach Vorschlägen/Hilfen?

    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    Mittwoch, 28. August 2013 13:37
  • Ich bin bei diesem Problem noch kein schritt weiter.. ich hatte es erstmal zurückgestellt, weil ich andere Aufgaben zugeteilt bekommen hatte.. und es zu dem einige schwierigkeiten mit der i-net verbindung gab.. ich war ja jetzt einige wochen nicht mehr im formu -.-
    Donnerstag, 19. September 2013 08:16