[ERLEDIGT] XbpBrowse Fehler - Datenquelle ein Array

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: XbpBrowse Fehler - Datenquelle ein Array

Beitrag von Tom »

Noch eine Ergänzung (und das meinst Du vermutlich, Hubert). Wenn ich das hier mache:

Code: Alles auswählen

a1 := {1,2,3}
a2 := a1
? a1, a2
a1[2] := 4
? a1, a2
Dann erhalte ich als Wert in Zeile 3 das hier: {1, 2, 3} {1, 2, 3}
Und zwei Zeilen tiefer, man staune, das hier: {1, 4, 3} {1, 4, 3}

Wenn ich ein Array einer anderen Variable mit ":=" zuweise, und das gilt natürlich auch für Instanzvariablen in Objekten, weise ich eigentlich nur einen Pointer zu. Ändere ich dann das eine Array, ändere ich das (vermeintlich) andere mit. Das Ergebnis wird richtig, wenn ich in Zeile 2 das hier mache:

Code: Alles auswählen

a2 := aClone(a1)
Ähnliches gilt für Objekte.
Herzlich,
Tom
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: XbpBrowse Fehler - Datenquelle ein Array

Beitrag von UliTs »

Tom hat geschrieben:Womit man vorsichtig sein sollte, das ist der (vermeintliche) Aufruf von Funktionen mit Array per value. Das gibt es bei Arrays nämlich nicht. Manipuliert man das - vermeintlich als Parameter übergebene - Array dann in der Funktion, verändert sich auch das Original.
Hallo Tom,

mit "Verlaub", um Deine Worte zu verwenden :wink: , ab dass es Call by Value bei Arrays nicht gibt, is falsch :D . Es funktioniert nur anders als in vielen anderen Programmiersprachen :shock: 8) .
Beispiel:

Code: Alles auswählen

Procedure ArrayQuatsch( aFeld )
  aFeld := {}
RETURN

PROCEDURE Aha()
LOCAL aFeld := {1,2,3}
  ArrayQuatsch( aFeld )
  ? len( aFeld )   // Ausgabe 3 und NICHT 0!
   Inkey(0)
RETURN
Zwar wird in ArrayQuatsch() aFeld ein neues Array zugewiesen (und damit ein Zeiger auf ein leeres Array), aber da in Aha() ArrayQuatsch( aFeld ) der Parameter ohne "@" angegeben wurde, also "Call by Value", verändert sich in Aha das Array nicht. Anders ist es, wenn einzelne Feldelemente geändert werden.
Beispiel:

Code: Alles auswählen

Procedure ArrayQuatsch2( aFeld )
  aFeld[1] := "ArrayQuatsch"
RETURN

PROCEDURE Aha2()
LOCAL aFeld := {"Aha",2,3}
  ArrayQuatsch2( aFeld )
  ? len( aFeld ),aFeld[1]   // Ausgabe 3,ArrayQuatsch
   Inkey(0)
RETURN
Toll, nicht :?: 8) :doubt:

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpBrowse Fehler - Datenquelle ein Array

Beitrag von brandelh »

Hallo Tom,

ich verwende normalerweise XbpQuickBrowse() und meine mich zu erinnern, dass damals
Probleme gab wenn man das Array einfach gelöscht hat z.B. aData := {...}
Natürlich kann ich mich irren und schön wenn es nicht auf XbpBrowse zutrifft.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: XbpBrowse Fehler - Datenquelle ein Array

Beitrag von AUGE_OHR »

brandelh hat geschrieben:ich verwende normalerweise XbpQuickBrowse() und meine mich zu erinnern,
dass damals Probleme gab wenn man das Array einfach gelöscht hat z.B. aData := {...}
ich "denke" es ist ein Unterschied ob ich "Quell" Array für DacPagedDataStore() in XbpQuickBrowse() austausche oder ein Array mit o:datalink habe.
brandelh hat geschrieben:Natürlich kann ich mich irren und schön wenn es nicht auf XbpBrowse zutrifft.
siehe FBrowse.PRG -> ChangeDirectory( oBrowse )
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2827
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: XbpBrowse Fehler - Datenquelle ein Array

Beitrag von georg »

Hallo, Uli -


so entfernt erinnere ich mich an das von Dir geschilderte Phänomen - es hat aber meines Wissens nichts mit @-Übergabe zu tun, sondern damit, dass Du in Deinem ersten Beispiel dem Array einen neuen Wert zuweist, und dieses neue (!) Array wird nicht "zurückgereicht". Wenn Du alternativ in einer Schleife mittels ADel() alle Elemente entfernst, hast Du auch in der aufrufenden Funktion ein leeres Array.


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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: XbpBrowse Fehler - Datenquelle ein Array

Beitrag von UliTs »

Hallo Georg,

Ich habe kein Phänomen beschrieben ;-) .
Es ist von der Umsetzung her logisch -) .
Bei aDel wird der Zeiger auf die arraydaten nicht verändert.
Und da bei call by value mit xBase nur der Zeiger dupliziert wird, gibt es in diesem Fall keinen Unterschied zu call by reference vom Ergebnis her (was für ein Satz :shock: ).
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: XbpBrowse Fehler - Datenquelle ein Array

Beitrag von AUGE_OHR »

Magic hat geschrieben:
AUGE_OHR hat geschrieben:warum gehst du nicht gleich auf ein "festes" X,Y Grid mit XbpMultiCellGroup() ?
Ich weiß es nicht. Das mit dem Browser ist schon der zweite mögliche Weg den ich beschreite. Zuvor habe ich es mir Pushbuttons für jede Nummer probiert. Mit dem Ergebnis war ich dann aber nicht zufrieden. Jetzt also ein XbpBrowse(). Der/die/das XbpMultiCellGroup() habe ich noch nie eingesetzt. Vielleicht kann jem. ein .jpg reinstellen (einen kleinen Ausschnitt), wie so ein XbpMultiCellGroup() aussehen kann (~ Browser?), damit man sich das in etwas vorstellen kann. In den Beispielen finde ich nichts dazu.
ein XbpCellGroup() ist praktisch nur das X,Y "Grid" wo du selbst für die "Bestückung" einer Cell zuständig bist.

das geht z.b. bei einem Calender wunderbar weil man ein festes Schema hat

Code: Alles auswählen

      oCal := XbpMultiCellGroup():new( oDrawing,, { 0, 20 }, { 175, 114 } )
         oCal:maxCol := 7    / Tage
         oCal:maxRow := 48   / a 30min
         oCal:style  := XBP_STYLE_3D
         oCal:create()
         oCal:setColWidth( 25 )
         oCal:setPresParam( PRESPARAM_CAL )
         oCal:itemMarked  := ;
         oCal:itemSelected:= {|aRowCol, unil, obj| lContinuar:= ::_itemMarked( aRowCol, unil, obj ) }
         oCal:keyboard    := {|nKey, unil, obj| lContinuar:= ::_Keyboard( nKey, unil, obj, oMesAno ) }

         FOR nCont := 1 TO 7
            oCal:setAlignment( nCont, XBPALIGN_RIGHT + XBPALIGN_VCENTER )
         NEXT
7 Tage a 24 Std mit 30min Einteilung

Code: Alles auswählen

oCal:setCell( nRow, nCol, xValue )
"füllt" eine Cell und

Code: Alles auswählen

xValue := oCal:getCell( nRow, nCol )
liest dir den Inhalt aus.
wenn du das nun mit Ownerdraw kombinierst stehen dir alle Möglichkeiten offen wie du die Daten positionierst und präsentierst.

anbei der Calender von Diego der mir damals diesen Weg zeigte.

p.s. das 3-Dim Array lassen sich nicht im VX Debugger anzeigen ...
Dateianhänge
CALENDAR.zip
XbpMultiCellGroup() Demo Calender
(4.78 KiB) 208-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: XbpBrowse Fehler - Datenquelle ein Array

Beitrag von Magic »

So, nachdem ich nun den Code „schön“ :wink: neu strukturiert habe, funktioniert das ganze wie gewollt.

Vielen Dank für Eure Anregungen & Unterstützung :!:
Gruß,
Magic
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: [ERLEDIGT] XbpBrowse Fehler - Datenquelle ein Array

Beitrag von Magic »

Ich muss doch noch mal nachfragen:

meine Browserspalten füge ich so an:

Code: Alles auswählen

// Browserspalte 1
oXbpColumn          := XbpColumn():new(,,,,aPresParam)
oXbpColumn:dataLink := {|| IIF( Valtype( ::oValues:aDatenArray[::oValues:nRecNo,1,1] ) == "N", ;
                                  Alltrim( Str( ::oValues:aDatenArray[::oValues:nRecNo,1,1] ) ), ;
                                  ::oValues:aDatenArray[::oValues:nRecNo,1,1]) }
oXbpColumn:colorBlock := {|xValue| IIf( ::oValues:aDatenArray[::oValues:nRecno,1,4] = .F., {NIL,GRA_CLR_PALEGRAY}, ;
                                   IIf( ::oValues:aDatenArray[::oValues:nRecno,1,3] = .F., {NIL,GRA_CLR_PALEGRAY}, ;
                                   IIf( ::oValues:aDatenArray[::oValues:nRecno,1,2] = .F., {NIL,GRA_CLR_RED}, {GRA_CLR_GREEN,NIL} ) ) ) }
oXbpColumn:create()
::oValues:addColumn( oXbpColumn )

// Browserspalte 2
oXbpColumn          := XbpColumn():new(,,,,aPresParam)
oXbpColumn:dataLink := {|| IIF( Valtype( ::oValues:aDatenArray[::oValues:nRecNo,2,1] ) == "N", ;
                                  Alltrim( Str( ::oValues:aDatenArray[::oValues:nRecNo,2,1] ) ), ;
                                  ::oValues:aDatenArray[::oValues:nRecNo,2,1]) }
oXbpColumn:colorBlock := {|xValue| IIf( ::oValues:aDatenArray[::oValues:nRecno,2,4] = .F., {NIL,GRA_CLR_PALEGRAY}, ;
                                   IIf( ::oValues:aDatenArray[::oValues:nRecno,2,3] = .F., {NIL,GRA_CLR_PALEGRAY}, ;
                                   IIf( ::oValues:aDatenArray[::oValues:nRecno,2,2] = .F., {NIL,GRA_CLR_RED}, {GRA_CLR_GREEN,NIL} ) ) ) }
oXbpColumn:create()
::oValues:addColumn( oXbpColumn )

// Browserspalte 2
...
// Browserspalte 10
Hier würde sich wohl eine Schliefe anbieten.
Aber wenn ich das hier mache, klappt es nicht. Da "i" immer den letzten Wert enthält also hier z.B. 10. Somit wird in jeder Spalte immer der letzte Wert angezeigt.
Was muss ich in den u.g. Code anders machen :?: Makro-Operator :?: Aber an welcher Stelle :?:

Code: Alles auswählen

// Browserspalten
FOR i := 1 TO ::nMaxSpalten
   oXbpColumn          := XbpColumn():new(,,,,aPresParam)
   oXbpColumn:dataLink := {|| ::oValues:aDatenArray[::oValues:nRecNo,i,1] }
   oXbpColumn:create()
   ::oValues:addColumn( oXbpColumn )
NEXT
Gruß,
Magic
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: [ERLEDIGT] XbpBrowse Fehler - Datenquelle ein Array

Beitrag von Tom »

Code: Alles auswählen

oXbpColumn:dataLink := &("{|| ::oValues:aDatenArray[::oValues:nRecNo,"+AllTrim(Str(i))+",1] }")
Das Problem ist, dass die im Makro enthaltenen Variablen dafür nicht mehr LOCAL sein dürfen.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: [ERLEDIGT] XbpBrowse Fehler - Datenquelle ein Array

Beitrag von brandelh »

Versuche es doch mal beim Aufbau der Spalte den richtigen Wert im :cargo zuzuweisen ...

Code: Alles auswählen

// Browserspalten
FOR i := 1 TO ::nMaxSpalten
   oXbpColumn          := XbpColumn():new(,,,,aPresParam)
   oXbpColumn:cargo := i // das wird sofort mit dem richtigen Wert gespeichert
   oXbpColumn:dataLink := {|| ::oValues:aDatenArray[::oValues:nRecNo, oXbpColumn:cargo ,1] }
   oXbpColumn:create()
   ::oValues:addColumn( oXbpColumn )
NEXT
Ich persönlich mache das aber nie, wenn ich Arrays verwende, dann nutze ich #DEFINE Variablen, welche die Spalten bestimmen.
Im Editor schreibe ich dann lieber die 10 Zeilen (cut & paste) und bessere die #DEFINE Variable aus.
Ich finde das übersichtlicher und eventuelle Umstellungen sind einfacher, da die Reihenfolge unabhängig vom Arrayaufbau ist.
Gruß
Hubert
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: [ERLEDIGT] XbpBrowse Fehler - Datenquelle ein Array

Beitrag von Magic »

Nö, tut nicht.

Beim Vorschlag von Hubert wir immer der letzte Wert in jeder Spalte angezeigt,
bei dem von Tom bekomme ich den Fehler:

Code: Alles auswählen

Xbase++ Version     : Xbase++ (R) Version 1.90.355
Betriebssystem      : Windows 7 06.01 Build 07601 Service Pack 1
------------------------------------------------------------------------------
oError:args         :
           -> NIL
oError:canDefault   : N
oError:canRetry     : J
oError:canSubstitute: N
oError:cargo        : NIL
oError:description  : Unbekannte Variable
oError:filename     : 
oError:genCode      :         22
oError:operation    : SELF
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :       2000
oError:subSystem    : BASE
oError:thread       :          1
oError:tries        :          2
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von (B)MAINDIALOG:INIT(0)
Aufgerufen von _BLOCK2STRING(1485)
Aufgerufen von XBPCOLUMN:CREATE(293)
Aufgerufen von MAINDIALOG:INIT(247)
Aufgerufen von DIALOGWINDOW(121)
Aufgerufen von MAIN(192)
Gruß,
Magic
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: [ERLEDIGT] XbpBrowse Fehler - Datenquelle ein Array

Beitrag von AUGE_OHR »

Magic hat geschrieben:Ich muss doch noch mal nachfragen:

Code: Alles auswählen

// Browserspalten
FOR i := 1 TO ::nMaxSpalten
   oXbpColumn          := XbpColumn():new(,,,,aPresParam)
   // Codeblock "auslagern"
   oXbpColumn:dataLink := MakeBlock( ::oValues,i )
   oXbpColumn:create()
   ::oValues:addColumn( oXbpColumn )
NEXT
versuch mal den Codeblock in eine Function "auszulagern"

Code: Alles auswählen

FUNCTION MakeBlock(oValues,i) 
RETURN {|| oValues:aDatenArray[oValues:nRecNo,i,1] }
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: [ERLEDIGT] XbpBrowse Fehler - Datenquelle ein Array

Beitrag von Tom »

bei dem von Tom bekomme ich den Fehler:
Stimmt, Schulljung. Die self-Referenz "::" muss natürlich gegen den Objektnamen (oBrowse: oder oDialog: oder was auch immer Parent von oValues ist) ausgetauscht werden. Und auch dieses Objekt muss PRIVATE sein.
Herzlich,
Tom
Antworten