XbpComboBox

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

XbpComboBox

Beitrag von Manfred »

Ich mache mal einen neuen Thread auf.

Ein wenig mehr blicke ich jetzt schon durch.

Ich befülle die Box mit einem 2dimensionalen Array.

Das 1.Feld wid in die Box mit additem gepackt. Geht denn dann das 2.Feld verloren? Wie bekomme ich das nacher in das SLE, damit ich das in die DB schreiben kann? Da werde ich nicht schlau draus.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
da mußt Du dann:
  1. den Wert aus dem SLE lesen
  2. das Array durchsuchen (1. Spalte des Arrays)
  3. an der gefundenen Stelle den Wert der 2. Spalte in die DB schreiben
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

ich bin gerade drauf gekommen, bzw. teste es aus.

Code: Alles auswählen

FUNCTION afrombox( oListBox)
         LOCAL aArray := oListBox:getData()
         LOCAL nI

         FOR nI := 1 TO LEN(aArray)
             aArray[nI] := oListBox:getItem( aArray[nI] )
         NEXT
         RETURN aArray
Damit bekomme ich die Nummer der zeile in der Box und die stimmt mit dem Array überein. Dann brauche ich nur noch das 2.Feld auslesen und ich habe die Nummer.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
entweder verstehe ich den Satz falsch:
Manfred hat geschrieben:Damit bekomme ich die Nummer der zeile in der Box und die stimmt mit dem Array überein.
oder Du kannst Dir Deine FOR-Schleife sparen!
Wenn Du Dein eigentliches Array in der selben Reihenfolge hast, wie die Einträge in der Listbox, dann brauchst Du doch nicht die :getItem abfragen, sondern kannst direkt auf die per :GetData() ermittelten Elemente in Deinem Hauptarray gehen.

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

Du verstehst richtig, ich verstehe Dich auch, aber ich kriege das zur Zeit nicht hin. Kannst Du mir kurz helfen?

Ich habe festgestellt, dass ich das SLE überhaupt nicht brauche, weil aus einer fertigen Liste genommen wird. Da genügt es direkt in die Variable zu schreiben, die in die DB kommt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
:?: :?:
Arbeitest Du nun nur mit einer Listbox?
Poste doch mal bitte ein wenig Code...

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

So sieht die Combobox aus. Ich habe sie genommen, weil eine Listbox, soweit ich es festgestellt habe, immer aufgeklappt ist.

Code: Alles auswählen

::oComboBox          := XbpComboBox():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe-60},{60, 80})
       ::oComboBox:tabStop  := .T.
       ::oComboBox:type     := XBPCOMBO_DROPDOWNLIST                            // jetzt kann kein Unsinn reingetippt werden
       ::oComboBox:create()
       AEval( aSysteme, {|x,i| ::oComboBox:addItem(aSysteme[i,1])})
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

OK,
dann probiere es doch mal damit:

Code: Alles auswählen

oComboBox:XbpSLE:dataLink := {|x| IIf( x==NIL, aSysteme[ascan(aSysteme, { |a| a[ 2 ] == Feld_in_der_DB } ), 1], Feld_in_der_DB := aSysteme[ ascan(aSysteme, { |a| a[ 1 ] == x } ), 2 ] ) } 
Alles in einer Zeile und statt Feld_in_der_DB nimmst Du natürlich Deinen entsprechenden Feldnamen (oder die Variable, falls Du nicht direkt auf die DB gehst).

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

ich habe das gestern Abend so eingetippt, aber irgendwie bleibt der Wert 0. Da ich aber auch noch nicht so richtig weiß, was da passiert, werde ich es mir mal näher ansehen.

Die Combobox nutze ich um aus einer kleinen DB Daten einzulesen und dann eine Verknüpfung zu dieser zu machen. Ist das überhaupt eine vernünftige Entscheidung, sowas über eine Combobox zu regeln? Ich meine, wie mache ich das dann, wenn in der Vater DB später gesucht und dann die Sohn DB mitgeführt werden muß und dann später Änderungen geschehen sollen. Ist dafür eine Combobox überhaupt geeignet, oder sollte ich das besser anders lösen? Es natürlich schön, wenn man die Daten in der Combobox per Eingabe direkt anspringen und anzeigen kann.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
ich habe Dich so verstanden, dass Du ein zweidimensionales Array hast. Die Werte in der ersten Spalte stehen zur Auswahl in der Combobox und die Werte der zweiten Spalte stehen in der Datenbank. Also sieht das Ausgangsarray aSysteme z.B. so aus:

Code: Alles auswählen

{ { "Eins", 1 }, { "Zwei", 2 }, { "Drei", 3 } }
In Deiner ComboBox stehen diese Werte:

Code: Alles auswählen

{ "Eins", "Zwei", "Drei" }
Ist dem nun doch nicht so??

Meine Zeile macht folgendes:
Der erste Teil (Wert wird aus der Datenbank gelesen und angezeigt):

Code: Alles auswählen

aSysteme[ascan(aSysteme, { |a| a[ 2 ] == Feld_in_der_DB } ), 1]
Das ascan sucht in dem Hauptarray in der zweiten Spalte nach dem Wert, der in der Datenbank hinterlegt ist und liefert die entsprechende Zeile zurück. Als Ergebnis wird dann aus dieser Zeile des Hauptarrays der Inhalt der ersten Spalte an die Combobox übergeben.
In der Datenbank steht eine 2, also liefert der obige Teil das Ergebnis "Zwei" an die Combobox.

Der zweite Teil (Auswahl der Combobox wird entsprechend in die Datenbank geschrieben):

Code: Alles auswählen

Feld_in_der_DB := aSysteme[ ascan(aSysteme, { |a| a[ 1 ] == x } ), 2 ]
Das ascan sucht in dem Hauptarray in der ersten Spalte nach dem Eintrag, der in der Combobox gewählt wurde und liefert die entsprechende Zeile zurück. Als Ergebnis wird dann aus dieser Zeile des Hauptarrays der Inhalt der zweiten Spalte in die Datenbank geschrieben.
In der Combobox wurde der Eintrag "Eins" gewählt, also schreibt der obige Teil das Ergebnis 1 in die Datenbank.

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

sagen wir mal so: Es ist genau so, wie Du es oben beschrieben hast.

Ich werde es jetzt nochmals kontrollieren und versuchen herauszufinden, was hier falsch läuft.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Martin Altmann hat geschrieben: dann probiere es doch mal damit:

Code: Alles auswählen

oComboBox:XbpSLE:dataLink := {|x| IIf( x==NIL, aSysteme[ascan(aSysteme, { |a| a[ 2 ] == Feld_in_der_DB } ), 1], Feld_in_der_DB := aSysteme[ ascan(aSysteme, { |a| a[ 1 ] == x } ), 2 ] ) } 
Ich würde dies in eine eigene Methode auslagern und diese hier aufrufen.
Kann man leichter debuggen und durchschauen ... :wink:
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

nochmal langsam...
ich habe Dich so verstanden, dass Du ein zweidimensionales Array hast.
Das stimmt so...
Die Werte in der ersten Spalte stehen zur Auswahl in der Combobox
Das ist auch so.

und die Werte der zweiten Spalte stehen in der Datenbank.
Das verstehe ich jetzt nicht. Die zweite Spalte enthält den Wert, den ich extrahieren muß/will um ihn dann wegzuschreiben. Der Wert steht noch im Array.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

eine Combobox liefert wie eine Listbox mit getData() ein Array mit Auswahlen zurück.
Wenn du ein 2 dimensionales Array mit 1. Spalte Anzeige und 2. Spalte gewünschter DBF-FeldInhalt hast, kannst du (ohne datalink) so vorgehen:

Code: Alles auswählen

oCombobox:addItem() wurde geladen mit aAuswahl[nZeile,1]
aErgebnis := oCombobox:getData() // Array mit Ergebnissen, 
if len(aErgebnis)>0 // es wurde was gewählt
   nErgebnis := aErgebnis[1] // wenn nur eine Auswahlmöglichkeit, sonst suchen.
   replace DBF_FELD with aAuswahl[nErgebnis,2] // 
endif
...
Mit Datalink wird der Codeblock von DATALINK direkt aufgerufen, sobald du getData() aufrufst, daher darf man :getData() auch nur nutzen, wenn man was speichern will, sonst :editBuffer(). Ein datalink-Codeblock müsste die Logik abbilden, daher kann ich nur abraten das direkt im Codeblock zu schreiben. Eine Funktion/Methode mit Parametern erledigt das zuverlässiger.

Wenn die Lösung nicht zu deinem Problem passt, darfst du sie gerne wegwerfen :wink:
Gruß
Hubert
Antworten