xbpcombox

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
gina77
Rookie
Rookie
Beiträge: 5
Registriert: Mo, 15. Sep 2008 23:02

xbpcombox

Beitrag von gina77 »

Hallo

Ich bin eine Xbase++ und Programmier-Anfängerin. Nun habe ich schon die 1. Frage betreffend GUI und hoffe, dass ich hier richtig bin.

Nun meine Frage:

Habe eine Tabelle mit zwei Spalten. Spalte 1 ist das Kürzel der Bezeichung und Spalte 2 ist die Vollständige Bezeichnung.

z.B. Spalte 1 = FE
Spalte 2 = Ferien

Nun möchte ich, dass bei einer Combobox der Benutzer die Vollständige Bezeichnung (Spalte 2) auswählen kann, aber beim Eingabefeld soll das Kürzel (Spalte 1) erscheint.

Wie kann ich das machen?

Vielen Dank für Eure Hilfe
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: xbpcombox

Beitrag von Martin Altmann »

Grüezi Nadine,
herzlich Willkommen hier bei uns!
Tut mir leid, aber das wirst Du mit der XbpComboBox() nicht lösen können! Die sieht sowas nicht vor.
Da müsstest Du Dir Dein eigenes Control bauen - aus einem XbpSle() für die Eingabe und darunter einer XbpListBox() für die aufklappende Anzeige der Einträge.
Wenn der untere Teil permanent sichtbar (=aufgeklappt) sein soll, wird es vielleicht etwas einfacher.
Ich stand vor dem selben Problem, da ich in der Maske nicht so viel Platz hatte, um ein 5-Stelliges Eingabefeld (Nationalität) zu verlängern. Also hatte ich mir erst so beholfen, dass ich eine XbpComboBox gebaut habe, die im aufgeklappten Teil die volle Breite hatte, aber oben nur die ersten fünf Zeichen anzeigte - den kompletten Eintrag hat man dann im Tooltip gesehen, wenn man die Maus drauf hielt.
War aber nicht so toll.
Da ich ja XClass++ nutze, habe ich das ganze dann umgestellt. Meine Eingabezeile ist jetzt zwei Zeichen lang und dahinter ist ein Knopf, den man anklicken kann. Dann bekommt man in einem Auswahlfenster die Langtexte angezeigt, die man durchsuchen kann und dann übernehmen kann. Eingetragen in das XbpSle() wird das Kürzel, angezeigt im Tooltip der Langtext.
Näheres dazu findest Du hier: http://www.xbaseforum.de/viewtopic.php?f=20&t=2287
Wobei ich nicht weiß, ob Du XClass++ nutzt - aber vielleicht hilft Dir das ja als Denkanstoß?

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: xbpcombox

Beitrag von AUGE_OHR »

hi,
gina77 hat geschrieben: Habe eine Tabelle mit zwei Spalten. Spalte 1 ist das Kürzel der Bezeichung und Spalte 2 ist die Vollständige Bezeichnung.
z.B. Spalte 1 = FE
Spalte 2 = Ferien

Nun möchte ich, dass bei einer Combobox der Benutzer die Vollständige Bezeichnung (Spalte 2) auswählen kann, aber beim Eingabefeld soll das Kürzel (Spalte 1) erscheint.
Ich habe es bislang mit einer xbpListbox und SLE gemacht, aber ich denke die Methode
sollte auch bei der Combobox gehen den es ist ja nichts anderes ale beide zusammen:

a.) aus dem 2-Dim Array machst du ein 1-Dim Array :

Code: Alles auswählen

LOCAL aLand := LANDKENZ()
// sortiere 2nd Spalte "Lang"namen
aLand := ASort( aLand,,, {|aX,aY| aX[2] < aY[2] } )
...
// Array clonen
aText  := aCLONE(aLAND)
//
// Eindimensionales Array erzeugen aus 2nd Element 
//
AEval( aText, {|a,i| a:=Upper(a[2])},,,.T. )
damit fütterst du nun die Listbox der Combobox

Code: Alles auswählen

iMax := LEN(aText)
FOR i := 1 TO iMax
   oListbox:addItem(aText[i])
NEXT
nun musst du im Itemselect Slot folgendes tun

Code: Alles auswählen

oListbox:itemSelected := {| uNIL1, uNIL2, oLBSelf | ;
                            nPosi := oLBSelf:getData()[1],;
                            ::Land:setdata(  SUBSTR(aLAND[nPosi][1],1,2) ),;
                            oListbox:hide() ,;
                            SetappFocus(::Land) }
er nimmt also deine Position Nummer und holt sich aus der 1st Spalte das Länderkürzel und
füttert damit das SLE.

Bei mir hat das Array sogar 3 Spalten, den in der 3th Spalte habe ich die Resource zum "Land"

Code: Alles auswählen

METHOD KundClass:Flagge()
LOCAL aLand := LANDKENZ()
LOCAL cSeek := KUNDEN->LAND
LOCAL nFlag := 2580
LOCAL nPosi
LOCAL oFlag := ExXbpBitmap():new():create()

   nPosi := ASCAN(aLand, {|x| x[1] == cSeek } )
   IF nPosi > 0
      nFlag := aLand[nPosi][3]
      IF nFlag = 0
         nFlag := 2580
      ENDIF
   ENDIF

   oFlag:load(, nFlag )
   oFlag := BMP2BMP( oFlag, { 30,24 } )
RETURN oFlag
Damit setzt er mir auch noch die Landesflagge mit der Auswahl.

viel Spass beim ausprobieren
Nachtrag : Die ComboBox besteht ja aus 2 Teilen

Code: Alles auswählen

   aItems := oCombobox:XbpListBox:getData()  // Werte in der Listbox 
   cBuffer:= oCombobox:XbpSLE:getData()      // Wert im Eingabefeld 
also beim anpassen des Code an eine Combobox beachten
gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: xbpcombox

Beitrag von Martin Altmann »

Hallo Jimmy,
prima - da wird Sie sich freuen. Dein Beispiel ist ja genau das "Selberbauen" durch XbpSle)( und XbpListbox().
Eine XbpComboBox() kann das nicht!! Sie besteht zwar aus den beiden einzelnen Objekten, aber der XbpSle() wird immer nur mit dem Eintrag aus der XbpListBox() gefüllt.
Und genau da muß man ansetzen - wie Du ja in Deinem Beispiel auch gezeigt hast...

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: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: xbpcombox

Beitrag von brandelh »

Hallo,

eine Combobox ist doch nichts anderes als eine Listbox und ein SLE.
Wenn man die Combobox ableitet kann man schon die setData() und getData() Methoden so ändern, dass sich das Control so verhält, allerdings seit ihr bei der Größe der Listbox flexibler wenn man sie sich selbst zusammenbaut.

In beiden Fällen muss man das Array mit den 2 Spalten mit der Listbox syncronisieren und bei der Rückgabe des Textwertes diesen durch das dazugehörige Kürzel ersetzten.

Ich frage mich allerdings ob es sinnvoll ist, die Kürzel anzuzeigen.
Ich habe solche Aktionen immer gemacht um in die DBF das Kürzel zu speichern (weniger Platz, eindeutig auch nach Wechsel der Schreibweise etc.) und immer den dazugehörigen Volltext angezeigt.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: xbpcombox

Beitrag von Martin Altmann »

Hallo Hubert,
yup!
Ich habe doch auch nur geschrieben, dass es mit der XbpComboBox() nicht geht und man sich selber was basteln muß!
Wenn sie die Kurzform angezeigt bekommen will, wird sie sicher auch zu wenig Platz in ihrer Maske haben...

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.
gina77
Rookie
Rookie
Beiträge: 5
Registriert: Mo, 15. Sep 2008 23:02

Re: xbpcombox

Beitrag von gina77 »

Vielen Dank für die Vorschläge. Nun habe ich meine Anforderung umsetzen können, mit folgender Zeile.

oCombo:ItemSelected := {|mp1, mp2, obj| nItem := obj:getData()[1], obj:setData( aVDIENST_ART[nItem, 1])}

Gruss gina77
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: xbpcombox

Beitrag von Martin Altmann »

Hallo Nadine,
Clever :thumbright:
Aber Du denkst dran, dass ein GetData() einen angegebenen :datalink ausführt und damit die Werte schon (z.B.) in die Datenbank geschrieben werden?
Aber das sollte in dem Fall ja vielleicht nicht so kritisch sein, da es ja nur gültige Werte sein können...

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.
Antworten