Array und refresh getlist

Moderator: Moderatoren

Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Array und refresh getlist

Beitrag von Ewald »

Immer wenn ich denke ich habe zum Thema Array alles gerafft ist der Rückschlag nicht weit. So wie jetzt. Da ich nicht (mehr) eingrenzen kann ob es an der Programmierung allgemein oder an express liegt schreibe ich es mal hier rein.
Wenn ich dieses Sinnlosprogramm laufen lasse erscheint wie erwartet in den say und get Zeilen der Inhalt vom Arrays. Zur Kontrolle habe ich noch mal ein browse drunter gesetzt. Auch hier erscheint der richtige Array-Inhalt.
Zu meiner Verwunderung/Verwirrung ändert sich nach dem Aufruf der Funktionen der Inhalt des Arrays aber die beiden get Zeilen nicht mehr.
Was übersehe ich denn da ?



Code: Alles auswählen

#include "dcdialog.ch"
#include 'DCDIALOG.CH"
#include 'APPEVENT.CH'

procedure main
LOCAL GetList:={}, arr:={}

aadd(arr,{"Karl ","Meier  "})

@ 02,01 dcsay {||arr[1,1]} saysize 0
@ 02,10 dcget arr[1,1]  // <----- ändert sich nicht mehr

@ 03,01 dcsay {||arr[1,2]} saysize 0
@ 03,10 dcget arr[1,2]  // <----- ändert sich nicht mehr

@ 05,01 dcbrowse ob1 data arr size 50,4 fit
dcbrowsecol element 1 header "Vorname" parent ob1 width 10
dcbrowsecol element 2 header "Name"    parent ob1 width 10

@ 12,0 dcpushbutton caption "Hein" size 10,1 ;
      action {||fhein(arr,getlist)}

@ 12,10 dcpushbutton caption "Ewald" size 10,1 ;
        action {||fewald(arr,getlist)}

DCREAD GUI FIT 

RETURN 
*-------------------------------------------

function fhein(arr,xlist)
asize(arr,0)
aadd(arr,{"Hein","Mück"})
dc_getrefresh(xlist)
return .t.

*------------------------------------------
function fewald(arr,xlist)
asize(arr,0)
aadd(arr,{"Ewald ","Saur"})
dc_getrefresh(xlist)
return .t.
*-------------------------------------------

proc appsys
return 
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Wolfgang Ciriack »

Schau dir mal die Funktionen dc_getbrowarray() und dc_getcolarray() an.
Viele Grüße
Wolfgang
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Ewald »

Moin Wolfgang,
kann ich im Moment nicht einordnen. Es geht nicht um das Browse. Da funktioniert alles. Das habe ich nur druntergepinnt um noch mal zu sehen, was tatsächlich im Array steht.
Es geht mir um
@ 02,10 dcget arr[1,1] und
@ 03,10 dcget arr[1,2]
da erscheint aus mir nicht nachvollziehbaren Gründen nicht der aktuelle Wert der Arrayelemente.
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Rudolf »

Hallo,
Du darfst das Array nicht löschen

Code: Alles auswählen

function fhein(arr,xlist)
*asize(arr,0)
*aadd(arr,{"Hein","Mück"})
arr[1,1] := "Hein"
arr[1,2] := "Mück"
dc_getrefresh(xlist)
return .t.
Grüße
Rudolf
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Ewald »

Moin Rudolf,
danke für deinen Beitrage. Stimmt, asize() verursacht das Problem. Wenn ich deine Lösung nehme funktioniert das in diesem Fall.

Mein Sinnlosprogramm war aber leider nur dazu da, das Problem aufzuzeigen. Ich verstehe nach wie vor nicht, warum die Arrayinhalte nach anklicken meiner beiden Funktionen offensichtlich richtig geändert werden (zu sehen in den Codeblöcken und in den Browse Elementen), in den Getfeldern aber nicht.

Ursprünglich habe ich dieses Problem bemerkt, weil ich eine Universal-Funktion habe an die ich beliebige Arrays übergebe, das Array dort erst mal mit asize() leere und dann beliebig mit neuen Daten fülle. Das ist immer ein mehrdimensionales Array in unterschiedlichsten Längen. Im aufrufenden Programm habe ich das Array bisher dann in einem Browse beackert. Das funktioniert ohne Probleme. Nur als ich jetzt versucht habe einzelne Elemente direkt zu editieren (Beispiel dcget [arr,1,1]) habe ich halt festgestellt, das der Inhalt nicht stimmt. Wenn ich mir das Array zur Laufzeit mit dc_arraybrowse() ansehe stehen dort die richtigen Daten drin - nur die Anzeige passt halt nicht.
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Rudolf »

Hallo Ewald,
müsste damit zu tun haben dass die Getlist beim Aufbau die Referenz des Arrays verwendet und dann durch asize(0) diese nur für das GET irgendwie verliert und dann im Codeblock nicht mehr ändert. Aber Roger könnte mehr darüber sagen. In Rogers Doku steht sogar dass man keine Arrays und Objekte in GETs verwenden soll, aber Arrays funktionieren bei mir sonst einwandfrei.
Grüße
Rudolf
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Ewald »

Hallo Rudolf,
kann ich alles genau so unterschreiben. Auch ich verwende Arrayelemente in Gets seit ewigen Zeiten. Bisher auch immer problemlos. Verwirrend ist auch, das ich nach 20 Jahren erstmalig auf dieses Problem stoße. Liegt wahrscheinlich daran, das ich das Array (nach den Funktionsaufruf) bisher immer in einem Browse beackert habe. Aber da findet das Editieren doch schlussendlich auch in einem Get statt wenn ich das richtig verstanden habe.

Wenn ich das Array in der Funktion tatsächlich nicht leeren kann ist die Funktion natürlich wertlos, da ich ja kein eindeutiges Ergebnis zurückbekomme sondern ein ständig länger werdendes Array. Ich werde schweren Herzens vorsichtshalber schon mal über einen workarround nachdenken.

Vielleicht kommt ja aber auch noch ein alles entscheidender Rat wo ich einen "Haken" setzten muss.
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Ewald »

Hallo Rudolf,
das hat mir ja nun mal doch keine Ruhe gelassen mit dem "Referenzverlust" durch asize() ;-)
Ich habe das noch mal mit einem eindimensionalen Array versucht - und siehe da, das funktioniert.

Code: Alles auswählen

#include 'DCDIALOG.CH"
#include 'APPEVENT.CH'

procedure main
LOCAL GetList:={}, arr:={}

aadd(arr,"Karl ")
aadd(arr,"Meier")

@ 02,01 dcsay {||arr[1]} saysize 0
@ 02,10 dcget arr[1]  

@ 03,01 dcsay {||arr[2]} saysize 0
@ 03,10 dcget arr[2]  

@ 12,00 dcpushbutton caption "Hein" size 10,1 ;
        action {||fhein(arr,getlist)}

@ 12,10 dcpushbutton caption "Ewald" size 10,1 ;
        action {||fewald(arr,getlist)}

DCREAD GUI FIT 

RETURN 
*-------------------------------------------

function fhein(arr,xlist)
asize(arr,0)
aadd(arr,"Hein")
aadd(arr,"Mück")
dc_getrefresh(xlist)
return .t.

*------------------------------------------
function fewald(arr,xlist)
asize(arr,0)
aadd(arr,"Ewald")
aadd(arr,"Saur")
dc_getrefresh(xlist)
return .t.
*-------------------------------------------

proc appsys
return
 
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Rudolf »

Hallo Ewald,
auch interessant, wäre interessant wo da wirklich das Problem bei mehrdimensionalen Arrays liegt.
Grüße
Rudolf
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Wolfgang Ciriack »

Poste doch mal beide Beispiele in Rogers Forum.
Viele Grüße
Wolfgang
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Rudolf »

Hallo,
vielleicht könnte man mit dc_getanchorcb() das Problem umgehen, einfach den get Codeblock neu zuweisen, mal schauen was Roger dazu sagt.
Grüße
Rudolf
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Ewald »

Es wird noch viel abenteuerlicher, wenn man in das nicht richtig referenzierte ? GET Eingaben in das arrayelement arr[1,1] macht ;-) Habe ich mal versucht was dabei rauskommt.
Wer gerne einen Knoten im Kopf hätte - bitte. Hier ist der Quelltext. 10 x Klicken und 3 Eingaben in dieses Programm haben die gleiche verwirrende Wirkung wie 3 Flaschen Bier :roll: .
Zu den Express++ Foren habe ich keine Verbindungen. Bin mir aber auch absolut nicht darüber im Klaren, ob das überhaupt ein Express++ Problem ist oder ob das gleiche nicht auch passiert wenn mit mit Xbase++ pur arbeitet. Kann ich selbst nicht mangels Kenntnissen ausprobieren.

Code: Alles auswählen

#include 'DCDIALOG.CH"
#include 'APPEVENT.CH'

procedure main
LOCAL GetList:={}, arr:={} 

aadd(arr,{"Karl ","Meier  "})

@ 02,01 dcsay {||arr[1,1]} saysize 0
@ 02,15 dcget arr[1,1]  valid {||dc_getrefresh(getlist)} // <----- „ndert sich nicht mehr

@ 03,01 dcsay {||arr[1,2]} saysize 0
@ 03,15 dcget arr[1,2]  // <----- „ndert sich nicht mehr

@ 04,01 dcsay {||arr[1,1]} saysize 0
@ 04,15 dcget arr[1,1] 

@ 05,01 dcbrowse ob1 data arr size 50,4 fit
dcbrowsecol element 1 header "Vorname" parent ob1 width 10
dcbrowsecol element 2 header "Name"    parent ob1 width 10

@ 12,00 dcpushbutton caption "Hein" size 10,1 ;
        action {||fhein(arr,getlist)}

@ 12,11 dcpushbutton caption "Ewald" size 10,1 ;
        action {||fewald(arr,getlist)}

@ 12,22 dcpushbutton caption "Array View" size 10,1 ;
        action {||dc_arrayview(getlist)}


DCREAD GUI FIT  

RETURN 
*-------------------------------------------

function fhein(arr,xlist)
asize(arr,0)
aadd(arr,{"Hein","Mck"})
dc_getrefresh(xlist)
return .t.

*------------------------------------------
function fewald(arr,xlist)
asize(arr,0)
aadd(arr,{"Ewald","Saur"})
dc_getrefresh(xlist)
return .t.
*-------------------------------------------

proc appsys
return

 
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Rudolf »

Hallo Ewald,
ist sicher ein eXpres++ Problem, an den Arrays von xBase++ zweifel ich nicht. Ich stolpere auch immer wieder über kleine Probleme, aber hat immer mit der Referenz zu tun. Kann ja mal das Problem im eXpress++ Forum posten. Ich würde mich an Deiner Stelle dort anmelden, sehr interessant.
Grüße
Rudolf
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Koverhage »

Nicht nur interessant, es gibt auch ein paar Beiträge dazu, gerade auch von Tom.
Gruß
Klaus
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Ewald »

Moin zusammen.
@ Rudolf: Wenn du das mit dem Posten übernehmen würdest würde ich dich in mein Abendgebet einschließen ;-) Wäre echt nett.

@ Klaus: Ich habe erst nach meinem Beitrag gesehen das du dieses bzw. ein ähnliches Problem schon am 11. Mai hier im Forum veröffentlicht hast. Da dein Beitrag als erledigt gekennzeichnet wurde keimt natürlich Hoffnung in mir auf. Hast du eine Lösung gefunden - oder das Problem umschifft ?

Gruß
Ewald
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Koverhage »

Ewald,

nein, hatte aber in dem speziellen Fall auch nicht ewig Zeit, habe es dann anders gelöst.
Gruß
Klaus
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Rudolf »

Hallo Ewald, habs gepostet, bin gespannt auf Rogers Antwort
Grüße
Rudolf
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Ewald »

Hallo Rudolf,
danke dafür.
Wie ich in dem Forum gesehen habe gibt es diesem Thema von Klaus auch schon einen Beitrag aus Mai. Da ich denke das das ein richtig fettes Problem ist habe ich aus Zeitdruck auch schon eine Ersatzlösung gebastelt und auf eindimensionale Arrays umgestellt.
Das kann aber eigentlich nicht die Lösung sein. Mal sehen ...

@ alle die noch mitlesen
Schönes Wochenende
Ewald
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Ewald »

Moin zusammen,
@ Rudolf
mir ist die Frage ob das ein express++ Problem ist nicht aus dem Kopf gegangen. Mangels genauerer Xbase++ GUI pur Kenntnisse habe ich unser Beispiel mal in ein Beispiel aus einem uralten Xbase++ Handbuch eingebastelt.
Meiner Meinung nach stellt sich dort das gleiche Problem. Solange man auf Knopf 3 oder 4 drückt ist alles in Butter. Einmal auf Knopf 1 oder 2 gedrückt ist die Referenz weg. asize() killt den Pointer.
Etwas verwirrt hat mich dabei, das die Referenz sofort wieder da ist, wenn man auf das X oben rechts klickt ;-)

Code: Alles auswählen

#include "inkey.ch"

proc main
local oxbp,arr:={}
setcolor("N/W,W+/N")
cls
aadd(arr,{"Peter     ","Müller    "})

setmouse(.t.)
set cursor on 

oxbp:=XbpPushButton():new()
oxbp:caption := "Peter"
oxbp:activate:={||fpeter(arr),refreshgetlist()}
oxbp:create(,,{10,10},{90,30})

oxbp:=XbpPushButton():new()
oxbp:caption := "Karl"
oxbp:activate:={||fkarl(arr),refreshgetlist()}
oxbp:create(,,{110,10},{90,30})

oxbp:=XbpPushButton():new()
oxbp:caption := "Franz"
oxbp:activate:={||ffranz(arr),refreshgetlist()}
oxbp:create(,,{210,10},{90,30})

oxbp:=XbpPushButton():new()
oxbp:caption := "Josef"
oxbp:activate:={||fjosef(arr),refreshgetlist()}
oxbp:create(,,{310,10},{90,30})

do while lastkey() <> K_ESC

@  3, 1 get arr[01,01] 
@  3,15 get arr[01,02]

read
enddo

return

procedure refreshgetlist
aeval(getlist, {|oget| oget:reset() , ;
                       oget:display() } )
return

function fpeter(arr)
asize(arr,0)
aadd(arr,{"Peter     ","Mück      "}) // not visible in get codeblock
return .t.

function fkarl(arr)
asize(arr,0)
aadd(arr,{"Karl      ","Karlson   "}) // not visible in get codeblock
return .t.

function ffranz(arr)
arr[1,1] := "Franz     "  // this way it works works
arr[1,2] := "Müller    "
return .t.

function fjosef(arr)
arr[1,1] := "Josef     "  // works
arr[1,2] := "Mustermann"   // works
return .t. 
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Wolfgang Ciriack »

Hast du mal arr:=ASize(arr,0) probiert ?
Viele Grüße
Wolfgang
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Ewald »

Halo Wolfgang,
jep, habe ich versucht. Gleicher Erfolg. Ob asize(arr,0) oder arr:=asize(arr,0). Die Daten werden im get nicht "refreshed".
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Ewald »

Es funktioniert übrigens auch nicht, wenn man das Array im Hauptprogramm vor dem Aufruf der Funktionen leert und dann in den Unterfunktionen wieder füllt.
Wenn man statt asize(arr,0) das Array manuell leert (Schleife mit aremove) passiert das gleiche wie bei asize(). Die Daten im GET werden nicht mehr aktualisiert. :angry4:
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von UliTs »

Wie Wolfgang schon sagte, darfst Du das array nicht zerstören!
Wenn Du beim 2-dimensionalen Array

Code: Alles auswählen

ASize(arr,0)
verwendest, werden alle Einträge (in deinem Fall also die "2. Dimension") gelöscht und die Zeiger auf die arrays der 2. Dimension gehen alle verloren!
Deshalb darfst Du nur die Inhalte der 2. Dimension ändern :D .
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Rudolf »

Hallo Ewald,
habe Antwort von Roger
You are creating a new pointer to the variable whereas the Get is bound to the previous pointer.

This is how a code block is bound to the Get:
oGet:datalink := aGetListItem[bGETLIST_VAR]


When you create a GET, a function named DC_GetAnchorCB() is used to create the code block.

Try this:
cNewValue := 'Hein'

oGet:dataLink := DC_GetAnchorCB(cNewValue)

oGet:refresh()
mit DC_AnchorCB() und Neuzuweisung müsste es gehen
Grüße
Rudolf
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array und refresh getlist

Beitrag von Ewald »

Moin Rudolf,
Danke für die Info. Ich hab mittlerweile das Donnay Forum besucht und den Beitrag verfolgt. Ich glaube es war keine gute Idee, mein Problem in dem Sinnlosprogramm auf NUR EIN getfeld zusammenzuschmelzen :( Wie gesagt kann das Array ja beliebig lang werden und im Hauptprogramm könnten beliebig viele gets betroffen sein.
Müsste man den Vorschlag von Roger nicht für jedes einzelne Get anwenden? Ich habe es nicht geschafft den in das Sinnlosprogramm an die richtige Stelle in den Quellcode einzufügen. Könntest du das mal machen ?
Ich habe nach wie vor Probleme zu verstehen, warum ich das geänderte Array mit dcsay problemlos ansehen und auch Browsen und im Browse auch editieren kann.
Antworten