Seite 1 von 1

XbpListBox() Daten Speichern

Verfasst: Di, 07. Aug 2018 8:52
von littlea1991
Guten Morgen Liebe Forenmitglieder,

ich versuche zurzeit einen Primzahlrechner zu programmieren, die Anwendung funktioniert bereits sehr gut. Er rechnet mir die Primzahlen in einem Wertebereich aus, allerdings möchte ich die Ergebnisse in einer DBF Datei Speichern.
2018-08-07 08_49_35-project - Xbase++ Workbench -  [funktionstest_gui.exe_main1.prg].jpg
2018-08-07 08_49_35-project - Xbase++ Workbench - [funktionstest_gui.exe_main1.prg].jpg (29.14 KiB) 9126 mal betrachtet
und bei Bedarf später Laden Das klappt mit dem Anfangs und Endbereich sehr gut, allerdings funktioniert es nicht mit der XbpListBox() die ich verwende.

Code: Alles auswählen

   Start := XbpPushButton():new( drawingArea, , {500,36}, {132,180}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   Start:caption := "Werte Speichern"
   Start:tabStop := .T.
   Start:create()
   Start:activate := {|| feld1:setData(), feld2:setData(), ausgabe:setData(), DBSkip(1)}
   
Beim ausführen der ausgabe (Also der Listbox) gibt es immer einen Fehler mit dem falschen Parameter.
XPPERROR.LOG
(1.18 KiB) 332-mal heruntergeladen
was genau beachte ich nicht bei der Listbox? Die DBF Datei besteht aus
Anfang - Integer,
Ende - Integer,
Ergebnis - Character

Vielen Dank im vorraus für eure Hilfe!

Gruß

Ali

Re: XbpListBox() Daten Speichern

Verfasst: Di, 07. Aug 2018 10:07
von Jan
Ali,

ich bin zugegebener maßen irritiert. Aus dem kurzen Codeschnipsel kann ich nicht wirklicher erkennen, was Du da machst. Ich AHNE aber, daß das Du da einen falschen Ansatz gehst.

Was ist feld1? feld2? ausgabe? Wo willst Du warum skippen?

Nur mal so als Einstieg für mich zum Verständnis. Wie gesagt, ich hab da schon so eine Idee, was Du willst und was da falsch läuft. Aber ich will doch erst noch auch Nummer Sicher gehen, bevor ich dann vielleicht doch falsche Gerüchte verbreite hier.

Jan

Re: XbpListBox() Daten Speichern

Verfasst: Di, 07. Aug 2018 10:26
von littlea1991
feld1 und feld2 sind bei mir die XbpSLE() in denen ich den Anfangs und Endebereich für die Primzahlen Einlese (Nutzer soll sie Eingeben) Während ich in der Ausgabe die XbpListbox() verwende. Das DBSkip(1) setzt doch den Zeiger im DBF File eins weiter Vorne (Also soll eine Neue Zeile in der DBF Datei damit angelegt werden).

Code: Alles auswählen

  feld2 := XbpSLE():new( drawingArea, , {408,396}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   feld2:bufferLength := 11
   feld2:tabStop := .T.
   feld2:dataLink := {|x| IIf( PCOUNT()==0, Transform( PRIM_DATENBANK->ENDE, '@N' ), PRIM_DATENBANK->ENDE := Val(x) ) }
   feld2:create():setData()
   

Code: Alles auswählen

ausgabe := XbpListbox():new( drawingArea, , {300,240}, {108,108}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   ausgabe:tabStop := .T.
   ausgabe:editable := .F.
   ausgabe:dataLink := {|x| IIf( PCOUNT()==0,Trim( PRIM_DATENBANK->ERGEBNIS ) , PRIM_DATENBANK->ERGEBNIS := x  ) }
   ausgabe:markMode := XBPLISTBOX_MM_EXTENDED
   ausgabe:create()
   
  
Feld 1 und Feld 2 sind über einen dataLink an die DBF Datei angebunden und wird jedes mal wenn setData()/getData() aufgerufen wird verwendet. Das gleiche habe ich auch bei der Ausgabe gemacht, allerdings gibt es dann dort einen fehler " Parameter hat falschen Typ" wenn beim Werte Speichern Button die ausgabe:setData() Methode aufgerufen wird. Baue ich die Verbindung zur DBF Datei falsch auf und muss Allgemein zuerst eine DatabaseEngine laden?

Gruß

Ali

Re: XbpListBox() Daten Speichern

Verfasst: Di, 07. Aug 2018 10:39
von brandelh

Code: Alles auswählen

 feld2:dataLink := {|x| IIf( PCOUNT()==0, Transform( PRIM_DATENBANK->ENDE, '@N' ), PRIM_DATENBANK->ENDE := Val(x) ) }
 ausgabe:dataLink := {|x| IIf( PCOUNT()==0,Trim( PRIM_DATENBANK->ERGEBNIS ) , PRIM_DATENBANK->ERGEBNIS := x  ) }
Zahlen speichert man normalerweise in numerischen Feldern, dann darf man aber weder Transform() noch Val(x) oder TRIM() einsetzen.
Falls du Strings hast in der DBF, könnte es sein, dass eines einen numerischen Wert bzw. ein NIL liefert ?

Re: XbpListBox() Daten Speichern

Verfasst: Di, 07. Aug 2018 10:43
von brandelh
Fast richtig ... Datentyp ist:

Code: Alles auswählen

oError:args         :
          -> VALTYPE: O CLASS: XbpListBox
du lieferst ein Objekt der Listbox, das kann er nicht verarbeiten ...

Code: Alles auswählen

oError:operation    : :setData
bei einer der Setdata Zeilen...

Code: Alles auswählen

Aufgerufen von (B)MAIN(54)
Aufgerufen von XBPPUSHBUTTON:HANDLEEVENT(1556)
Aufgerufen von MAIN(106)
das zeigt mir, dass du den button angeklickt hast und er activate ausführen will, die Zeilennummern kannst du dahinter sehen, leider nützen die hier nichts.
Im Editor siehst du sicher wo er abbiegt, bevor der Fehler kommt.

Re: XbpListBox() Daten Speichern

Verfasst: Di, 07. Aug 2018 10:56
von littlea1991
danke, ich möchte ja nicht das er das komplette Listbox Objekt versucht zu senden sondern nur die einzelnen felder. Gibt es keine Möglichkeit für mich auf die Werte direkt zuzugreifen? Der Grund warum ich Characters bei der Ausgabe verwende, ist das ich ja pro Abfrage mehrere Zahlen Speichern möchte. z.B. Die Primzahlen von 5 - 10 sind sie 5 und 7. Jetzt möchte ich das er die Ergebnisse in der ListBox in die DBF Datei abspeichert, kann ich nur einzelne Elemente einer Listbox abspeichern in die DBF oder gehen auch mehrere?

Gruß


Ali

Re: XbpListBox() Daten Speichern

Verfasst: Di, 07. Aug 2018 11:33
von brandelh
Listboxen sind speziell, da gibt es ja auch mehrfache Auswahl, daher meine ich wird da die Position in der Listbox geliefert, weiß aber nicht mehr genau.
Du kannst im Codeblock Funktionen aufrufen und genau die Daten/Formate heraus holen die du brauchst.

Dem :dataLink := {|x| wird meist der Inhalt eines Controls übergeben, aber du musst im Einzelfall in der Doku schauen, ob es hier auch so ist.
Dass du ein Objekt bekommen hast lässt mich vermuten, dass der auslösende Event der activate des Pushbuttons war, der dann eine Aktion mit der Listbox machen wollte,
wenn du Funktionen übergibst, kannst du die einzelnen Positionen besser erkennen und debuggen.

Re: XbpListBox() Daten Speichern

Verfasst: Di, 07. Aug 2018 11:41
von Jan

Code: Alles auswählen

cString := ""
FOR i := 1 TO oListbox:numItems()
     cString += oListbox:getItem(i)
NEXT
Jan

Re: XbpListBox() Daten Speichern

Verfasst: Di, 07. Aug 2018 12:10
von littlea1991
@Jan vielen Dank für die Methode, eine ähnliche (wenn auch komplexere) hab ich auch bereits geschrieben.

Code: Alles auswählen

function ausgabeToChar (ausgabe)

local items, i, CharItems
CharItems := " "

items:= ausgabe:numItems()
FOR i := 0 to items
 CharItems += ausgabe:getItem(i)
NEXT i++

RETURN CharItems
kann ich die Funktion dann einfach im dataLink übergeben? Oder wie soll ich das in die DBF Datei reinschreiben?

Gruß

Ali

Re: XbpListBox() Daten Speichern

Verfasst: Di, 07. Aug 2018 12:32
von Jan
Ali,

wieso DataLink? Schrieb doch einfach den Inhalt von CharItems in die dbf.

Jan

Re: XbpListBox() Daten Speichern

Verfasst: Di, 07. Aug 2018 14:01
von littlea1991
Alles Klar, habe ich gemacht! Jetzt funktioniert es auch, wie es soll. Vielen Dank an euch beide, für eure tatkräftige Unterstützung :D

Gruß

Ali