Auswahl einer ListBox verarbeiten

Moderator: Moderatoren

Antworten
Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Auswahl einer ListBox verarbeiten

Beitrag von Jojo » Mi, 11. Mär 2015 20:35

Hallo zusammen,

ich hänge mal wieder...

Ich möchte eine ListBox in mein Programm aufnehmen.

Das habe ich mit folgendem Code (aus FSMAN) hinbekommen:

Code: Alles auswählen

 oLB := ListBox{12,16, 9,32}
 oLB:AddItem("1")
 oLB:AddItem("2")
 oLB:AddItem("3")
  item := oLB:Show()
 ? "Selected item:", ltrim(item)
So bekomme ich ein umrahmtes Fenster mit den drei Auswahlmöglichkeiten, die mittels Pfeiltasten ausgewählt werden können.

Ich möchte nun gerne das eine separate .dbf mit der Anzahl der Auswahlen gefüllt wird.
Also jedesmal, wenn die Auswahl "1" gewählt wird, soll die Zahl in der Spalte mit der Überschrift "1" um eins erhöht werden.

Hat mir jemand einen Tipp, wie ich das umsetze?

Grüße
Jojo
Zuletzt geändert von Jojo am Mi, 11. Mär 2015 21:13, insgesamt 1-mal geändert.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11515
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Auswahl einer ListBox verarbeiten

Beitrag von AUGE_OHR » Mi, 11. Mär 2015 20:53

hi,
Jojo hat geschrieben:Ich möchte nun gerne das eine separate .dbf mit der Anzahl der Auswahlen gefüllt wird.
Also jedesmal, wenn die Auswahl "1" gewählt wird, soll die Zahl in der die Spalte mit der Überschrift "1" um eins erhöht werden.
ein String einer Standart Listbox ist nicht austauschbar. du muss alle Element löschen und neu aufbauen.
bei einer Ownerdraw Listbox könnte man auch dynamisch auf ein Array zugreifen ... aber das erfordert einige API Tricks.

Ich würde dein Problem mit einem Browse lösen.
gruss by OHR
Jimmy

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Auswahl einer ListBox verarbeiten

Beitrag von Jojo » Mi, 11. Mär 2015 21:44

hi,
Moin!
ein String einer Standart Listbox ist nicht austauschbar. du muss alle Element löschen und neu aufbauen.
?
bei einer Ownerdraw Listbox könnte man auch dynamisch auf ein Array zugreifen ...
??
aber das erfordert einige API Tricks.
???
Ich würde dein Problem mit einem Browse lösen.
????

Sorry, Auge_Ohr, aber mit Deiner Antwort fange ich leider gar nichts an.

Ein "Browse" macht in FlagShip laut FSMAN..."Screen oriented display and modification of the currently selected database".

Das würde mir vermutlich wenig helfen...

Grüße
Jojo

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11515
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Auswahl einer ListBox verarbeiten

Beitrag von AUGE_OHR » Mi, 11. Mär 2015 22:02

Jojo hat geschrieben:Sorry, Auge_Ohr, aber mit Deiner Antwort fange ich leider gar nichts an.
schon mal in Xbase ( alle Versionen) programmiert ?
Jojo hat geschrieben:Ein "Browse" macht in FlagShip laut FSMAN..."Screen oriented display and modification of the currently selected database".

Das würde mir vermutlich wenig helfen...
man kann ein Browse auf eine DBF oder Array anwenden.
ein Browse kann von der Daten-Quelle neu einlesen ( RefreshAll(), RefreshCurrent() ) und damit eine geänderte Zeile anzeigen.

bei einer Listbox / ComboBox / Listview wird per "AddItem" ein String zum Control hinzugefügt aber es gibt kein "replace" um Daten neu einzulesen.
deshalb musst man alle Elemente einer Listbox "sichern", den alten Inhalt löschen und dann die Elemente wieder hinzufügen (AddItem)
gruss by OHR
Jimmy

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Auswahl einer ListBox verarbeiten

Beitrag von Jojo » Mi, 11. Mär 2015 22:38

schon mal in Xbase ( alle Versionen) programmiert ?
Nein, leider nicht :(
ein Browse kann von der Daten-Quelle neu einlesen ( RefreshAll(), RefreshCurrent() ) und damit eine geänderte Zeile anzeigen.
...wenn ich Dich richtig verstehe, muss ich mit Browse den aktuellen Inhalt meiner .dbf auslesen und dann je nach ListBox Auswahl das entsprechende Feld um 1 erhöhen und wieder in die dbf einfügen?
Und wie stelle ich das an? :?:

Warum muss Programmierung eigentlich immer so umständlich sein? :angry4:

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7333
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Auswahl einer ListBox verarbeiten

Beitrag von Tom » Mi, 11. Mär 2015 22:51

Wenn ich Jojo richtig verstehe, geht es um etwas viel einfacheres. In der Listbox wird ein Item ausgewählt. Wenn das Item "1" ausgewählt wird, soll in der selektierten Tabelle in der Spalte (Feld), die ebenfalls "1" heißt, im aktuellen Datensatz der enthaltene Wert um 1 erhöht werden. Wird "2" gewählt, soll in Spalte "2" erhöht werden. Richtig?

Es geht also letztlich, wenn meine Annahme stimmt, darum, in der Eventloop - so es derlei bei Flagship gibt, wovon ich ausgehe - zu ermitteln, welches Item gewählt wurde und dann entsprechend zu agieren. Nix mit API, Ownerdrawing und sonstwelchem Zauberzeug. :wink:
Herzlich,
Tom

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Auswahl einer ListBox verarbeiten

Beitrag von Jojo » Mi, 11. Mär 2015 23:21

Tom hat geschrieben:...Wird "2" gewählt, soll in Spalte "2" erhöht werden. Richtig?
Jepp, genau das ist was ich brauche.

Leider scheint es bei FS keine Funktion Eventloop zu geben...oder ist "do while" gemeint?

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11515
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Auswahl einer ListBox verarbeiten

Beitrag von AUGE_OHR » Mi, 11. Mär 2015 23:35

Jojo hat geschrieben:
Tom hat geschrieben:...Wird "2" gewählt, soll in Spalte "2" erhöht werden. Richtig?
Jepp, genau das ist was ich brauche.
ok dann habe ich dich falsch verstanden weil ich dachte du wollte was "in" der Listbox ändern.
wenn ich nun das höre frage ich mich warum es eine Listbox sein soll ? ich würde paar Buttons nehmen ...
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14597
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Auswahl einer ListBox verarbeiten

Beitrag von brandelh » Mi, 11. Mär 2015 23:37

Hallo JoJo,

ein EventLoop ist meist eine do while Schleife die Events verarbeitet.
Bei Xbase++ würde man auf den Select (oder Klick) Event des Controls reagieren und die Datenbank aktion auslösen.

Vermutlich hat auch die Listbox bei FlagShip eine solche Funktionalität, Hinweise darauf sollten in der Doku stehen.
Hier wirst du kaum jemand finden der mit FlagShip arbeitet und daher kann wohl niemand hier den code aus dem Gedächtnis schreiben.

Bei Xbase++ kann man codeblöcke in Variablen des Objekts legen, die nach einem Event ausgeführt werden.
Select(ed) oder Klickevent sind dazu eventuell passende Suchbegriffe.
Gruß
Hubert

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Auswahl einer ListBox verarbeiten

Beitrag von Jojo » So, 15. Mär 2015 11:43

O.K. Das mir keiner einen fertigen Code liefern kann hatte ich befürchtet :-)

Aber vielleicht kann mir dennoch jemand einen Tipp geben...

Ich glaube, ich stehe kurz vor einem Etappensieg mit :

Code: Alles auswählen

 oLB := ListBox{12,16, 9,32}
 oLB:AddItem("Text1")
 oLB:AddItem("Text2")
 oLB:AddItem("Text3")
 item := oLB:Show()
 
  do case
  case item = "Text1"
  @ 20, 20 say 'Text1 ausgewaehlt!'
  endcase
Hat vielleicht jemand eine Idee weshalb das "do case" so nicht funktioniert und ein "Data type mismatch in equals '=' operation" liefert?

Grüße
Jojo

P.S.: Falls sich jemand tiefergehend damit auseinandersetzen möchte, hier die Beschreibung der Funktion ListBox (aus der ich leider nicht schlauer werde :-( ):

ListBox Class
The ListBox Class creates and manages list boxes and combo boxes. The Achoice() function is based on ListBox class.
List boxes and combo boxes display a list of items or choices to the user. The list box methods will allow you to add,
arrange, remove, and interrogate the list of items. When one of the items is selected, ListBox:CurrentItem,
ListBox:CurrentItemNo, ListBox:TextValue, and ListBox:Value are updated.

ListBox Class Index

AddItem() METHOD Add (append) a new item to a list box
Bitmap ACC/ASS Display bitmap as list box item
Bottom ACC/ASS Bottommost screen row of the box
Buffer ACC Position in the list of the selected item
CapCol ACC/ASS Screen column of the list box's caption
CapRow ACC/ASS Screen row of the list box's caption
Caption ACC/ASS String that describes the list box caption
Cargo ACC/ASS A user value of any type
ChangeSelected() METHOD Change a range of items in a multiple selection
ClassName() METHOD For compatibility to Clipper's getsys.prg only
Clear() METHOD Clear (delete) all items in a list box
ClearSelection() METHOD Clear a multiple selection list box
Close() METHOD Closes the combo box ("drop-down list box")
ColdBox ACC/ASS Frame of list box without focus
ColorSpec ACC/ASS Color attributes for Terminal i/o
ColumnLeft ACC/ASS Number of the leftmost visible column
CurrentItem ACC/ASS String representing the displayed listbox item
CurrItemNo ACC/ASS Numeric value indicating the selected item
CurrentText ACC/ASS Fix ""
DeleteItem() METHOD Remove an item from a list box
DelItem(p1) METHOD Remove an item from a list box
DeselectItem() METHOD Turn off the selection of a specified item
Destroy() METHOD Destroys the ListBox object
Display() METHOD Show the list box and its caption on the screen
DropDown ACC Indicator of list box or combo box
Exec() METHOD Process user input, same as :Show()
Fblock ACC/ASS Code block evaluated at receiving/loosing focus
FillUsing() METHOD Data server/dictionary driver
FindItem() METHOD Search a list box for a specified item
FindText() METHOD Search a list box for a specified string
FirstSelected() METHOD Position of the 1st item in a multiple selection
Font ACC/ASS Font object used to display the list box items
GetData() METHOD Get the data portion of a list box item
GetItem() METHOD Get the item property
GetItemValue() METHOD Same as GetData()
GetText(p1) METHOD Get the item text
GuiColor ACC/ASS Color attributes for GUI mode
HasFocus ACC Indicates whether the object has input focus
HitTest() METHOD Determines if the mouse cursor is within the box
HotBox ACC/ASS Frame of list box with focus
InputBlock ACC/ASS CodeBlock for default/user keyboard handler
InsItem() METHOD Insert a new item to a list box
IsOpen ACC Indicator whether the combo box widget is visible
ItemCount ACC Number of items in the list
KillFocus() METHOD Take input focus away from a ListBox object
Left ACC/ASS Leftmost screen column of the box
ListFiles() METHOD Fill a list box with the names of matching files
Message ACC/ASS String displayed in the windows status bar
Modified ACC/ASS Ignored.
NextItem() METHOD Skip to the next available item
NextSelected() METHOD Skip to the next selected item
Open() METHOD Opens the combo box (drop-down box)
PrevItem() METHOD Skip to the previous available item
Right ACC/ASS Rightmost screen column of the box
Sblock ACC/ASS Code block evaluated at user selection
Scroll() METHOD Scrolls the contents of a list box up or down
Select() METHOD Change the selected item in a list
SelectBySingleClick ACC/ASS Allow selection by left mouse same as Enter
SelectBySpace ACC/ASS Allow selection by space key same as Enter
SelectedCount ACC Number of items selected in a multiple selection
SelectedFile ACC Selected file filled by :ListFiles()
SelectItem() METHOD Change the selected item in a list
SetData() METHOD Change the property of an available item
SetFocus() METHOD Set input focus to a ListBox object
SetItem() METHOD Replaces the item property
SetText() METHOD Change/replace the displayed text of item
SetTop() METHOD Move a specified item to the top of the list box
Show() METHOD Show the list box and its caption on the screen
TextValue ACC/ASS String representing the displayed listbox item
ToolTip ACC/ASS Short pop-up info message
Top ACC/ASS Topmost screen row of the box
TopItem ACC/ASS Position of the first visible item
TypeOut ACC/ASS Indicator whether the list contains any items
Value ACC/ASS Any value associated with the specified item
ValueChanged ACC/ASS Indicator representing the status of :Value
Vscroll ACC/ASS Ignored in FlagShip

Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2087
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Kontaktdaten:

Re: Auswahl einer ListBox verarbeiten

Beitrag von Koverhage » So, 15. Mär 2015 12:28

item enthält ja nicht dir Rückgabe als Text, sondern (vermutlich) entweder das Objekt oder einen logischen Wert.
Du müsstest in Deiner DO CASE oLB:TextValue abfragen
Gruß
Klaus

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Auswahl einer ListBox verarbeiten

Beitrag von Jojo » So, 15. Mär 2015 13:03

Koverhage hat geschrieben:Du müsstest in Deiner DO CASE oLB:TextValue abfragen
Das war der entscheidende Hinweis! :blob8:

Danke! Jetzt kann ich weitermachen.

Grüße
Jojo

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14597
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Auswahl einer ListBox verarbeiten

Beitrag von brandelh » So, 15. Mär 2015 17:45

da steht was, dass die Listbox für Achoice verwendet wird.
Achoice gibt den numerischen Index der Auswahl zurück, also vermutlich 1 statt "Text1", beides hat vor und Nachteile !

Code: Alles auswählen

do case 
   case nAuswahl = 1 
      ... funktioniert auch nach Textänderungen, aber wehe man vertauscht die Auswahl logisch (z.B. eine interne Sortierung oder nachträglich eine Option oben statt am Ende) 

bei dem tatsächlichen Textvergleich trifft es immer diesen Text, aber wehe wenn jemand auf die Idee kommt die Anwendung in mehreren Sprachen ausführen zu wollen ;-)
Gruß
Hubert

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Auswahl einer ListBox verarbeiten

Beitrag von Jojo » Di, 17. Mär 2015 21:23

Servus Hubert,

es wird zwar sicherlich nie vorkommen das ich diese Anwendung in mehrere Sprachen portieren mus, aber die Idee mit der Numerierung gefällt mir dennoch...

Dein Vorschlag bringt mir leider eine Fehlermeldung , aber mit

Code: Alles auswählen

do case
case oLB:Buffer = 1
klappt das.

Jetzt muss ich nur noch herausfinden, wie ich damit eine Datenbankdatei befülle #-o

Grüße
Jojo

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Auswahl einer ListBox verarbeiten

Beitrag von Jojo » Mi, 18. Mär 2015 23:42

Wie ich eine Datenbank befülle habe ich herausgefunden...

Code: Alles auswählen

 do case

    case oLB:Buffer = 1
    z_variable := meinedbf->Spalte1
    z_variable ++
    replace meinedbf->Spalte1 with z_variable
   .
   .
   .
 endcase
Aber ich bekomme ein "No database opened in work area X ", vermutllich weil ich diese Prozedur mit einem "use" mitten in einer Erfassung einer anderen dbf mache.

Trotz eines

Code: Alles auswählen

DBCLOSEAREA( meinedbf )
am Ende meiner Prozedur.

WARUM? :banghead:
Zuletzt geändert von Jojo am Di, 31. Mär 2015 20:43, insgesamt 1-mal geändert.

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Auswahl einer ListBox verarbeiten

Beitrag von Jojo » So, 22. Mär 2015 16:52

Habs herausgefunden (bzw. einen Tip bekommen)...

Ich muss anfangen mit

Code: Alles auswählen

    select 7
    use meinedbf shared alias dbf
und dann wieder schließen mit

Code: Alles auswählen

dbclosearea(7)
Grüße
Jojo

Antworten