Array-Browsen

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Array-Browsen

Beitrag von Wonderer »

Hallo,

habe schon wieder das nächste Problem, welches ich nicht lösen kann :(

Habe mir ein Formular gebastelt auf dem ein XbpBrowse angezeigt werden soll. Dem Formular werden von außen zwei Arrays übergeben. Eins für die Feldnamen und eins mit den Werten.
Habe das Ganze erstmal für ein Feld am Testen. Das Problem beim Refresh bekomme ich den Fehler: "Fehler bei der Array-Indizierung"

Ich poste mal den Code, der meiner Meinung nach nen Fehler hat, den ich aber nicht finde. Habe mich dazu an das Beispiel EBROWSE gehalten.

in Init:

::oBrowser := XbpBrowse():new( ::_FormVorlage:drawingArea,, {1,1},
{aSize[1]-1,aSize[2]-1})
::oBrowser:SkipBlock := {|nSkip,oBrowse| ::Skip(nSkip,oBrowse)}
::oBrowser:GoBottomBlock := {|| ::nRecNo := len(::aValues)}
::oBrowser:GoTopBlock := {|| ::nRecNo := 1 }
::oBrowser:PosBlock := {|| ::nRecNo }
::oBrowser:PhyPosBlock := {|| ::nRecNo }
::oBrowser:LastPosBlock := {|| LEN(::aValues) }
::oBrowser:FirstPosBlock := {|| ::nRecNo := 1 }
::oBrowser:HScroll := .t.
::oBrowser:VScroll := .t.
::oBrowser:CursorMode := XBPBRW_CURSOR_ROW
...
(wird vom aufrufenden Programm vor BrowseSingle:create() aufgerufen)
METHOD BrowseSingle:setArrays(aField,aVal)
::aFields := aField
::aValues := aVal
::nRecCnt := len(::aValues)
RETURN

dies wird nach oBrowse:create() aufgerufen für das Erstellen der Spalten

METHOD BrowseSingle:createColumns()
Local z
Local sFieldBlock
if len(::aFields) == 1
::oBrowser:addColumn( {|| ::aValues[::nRecNo] }, , ::aFields[1])
endif
::oBrowser:refreshAll() *
RETURN

Der Fehler tritt bei der Zeile mit * auf.
Ein Auszug aus der XPPERRORLOG:

[...]
oError:args :
-> VALTYPE: B VALUE: {|| ::nRecNo }
-> VALTYPE: O CLASS: XbpBrowse
oError:canDefault : N
oError:canRetry : J
oError:canSubstitute: N
oError:cargo : NIL
oError:description : Fehler bei der Arrayindizierung
oError:filename :
oError:genCode : 4
oError:operation : eval
oError:osCode : 0
oError:severity : 2
oError:subCode : 1012
oError:subSystem : BASE
oError:thread : 1
oError:tries : 1
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von XBPBROWSE:FORCESTABLE(1097)
Aufgerufen von XBPBROWSE:HANDLEEVENT(1453)
Aufgerufen von XBPBROWSE:REFRESHROWS(2219)
Aufgerufen von XBPBROWSE:REFRESHALL(2143)
Aufgerufen von BROWSESINGLE:CREATECOLUMNS(95)
Aufgerufen von BROWSESINGLE:CREATE(57)
Aufgerufen von SHOWARRAY(407)
Aufgerufen von (B)MENUCREATE(387)
Aufgerufen von MAIN(368)

Ich hoffe mal jemand kann damit etwas anfangen, weil ich bin mit meinem Latein am Ende!

Vielen Dank schon mal, Ralf...
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Ralf,
ich sehe nirgendwo, dass Du ::nRecNo mit einem Wert initial vorbelegst!? Das ist die Ursache, da so der Wert NIL ist - und NIL als Parameter für ein Arrayelement geht nicht!

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.
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Beitrag von Wonderer »

Oh, Sorry - dieser Code ist nur ein Ausschnitt gewesen.

In der Klassendeklaration steht:
VAR nRecNo

und im Init steht vor der Erstellung des Browse-Objektes:

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

Beitrag von Martin Altmann »

Hallo Ralf,
ich hoffe mal, dass das jetzt auch nur ein Tippfehler ist, oder?
Du meintest sicherlich:
::nRecNo := 1 :!:

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.
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Beitrag von Wonderer »

Ja, war ein Tippfehler im Posting.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Ralf,
ich habe - da Du meintest, Du hast Dich am EBROWSE.PRG orientiert - mal Dein Codesnippet und das EBROWSE.PRG verglichen. Folgendes ist mir aufgefallen:
Du verwendest ::oBrowser:FirstPosBlock := {|| ::nRecNo := 1 }
in EBORWSE.PRG steht jedoch ::oBrowser:FirstPosBlock := {|| 1 }
Ausserdem wird in der EBROWSE.PRG nicht nur die ::nRecno mit 1 initialisiert, sondern auch ::nLastRec mit len( ::aData ) - machst Du das auch in der INIT?
Des weiteren sehe ich ein Problem in Deiner createColumns()-Methode:
Wenn Du mehr (oder weniger) als 1 Feld in Deiner Array-Definition hast, wird dem Browser gar keine Spalte hinzugefügt und danach trotz allem ein refreshAll() auf ein nicht gültiges (da keine Spalten) Bowse-Objekt durchgeführt!

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
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Ralf,

versuche erstmal mit festen Spaltendefinitionen, damit du die Fehler aus dem Bereich ausschliessen kannst.
Und wenn es funktioniert, dann kannst du mit den Namen weiter machen.

Hier ist mein Programmausschnitt. Vielleicht hilft es dir weiter. Die Skip-Methode habe ich angepasst gehabt. Deswegen solltest du die aus dem Alaska-Beispiel nehmen.

Code: Alles auswählen

::oBrowse := GUIBrowseDB( ::DrawingArea,  {4,96}, {580,272}, .t. )


	FOR i := 1 TO LEN(::aKopf)
		IF LEN(::aKopf)<i
			exit
		ENDIF


		do case
		case i=1
			::oBrowse:addColumn( {|| ::aData[::nRecno, 1] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )
		case i=2
			::oBrowse:addColumn( {|| ::aData[::nRecno, 2] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )
		case i=3
			::oBrowse:addColumn( {|| ::aData[::nRecno, 3] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )
		case i=4
			::oBrowse:addColumn( {|| ::aData[::nRecno, 4] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )
		case i=5
			::oBrowse:addColumn( {|| ::aData[::nRecno, 5] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )
		case i=6
			::oBrowse:addColumn( {|| ::aData[::nRecno, 6] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )
		case i=7
			::oBrowse:addColumn( {|| ::aData[::nRecno, 7] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )
		case i=8
			::oBrowse:addColumn( {|| ::aData[::nRecno, 8] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )
		case i=9
			::oBrowse:addColumn( {|| ::aData[::nRecno, 9] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )
		case i=10
			::oBrowse:addColumn( {|| ::aData[::nRecno, 10] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )
		case i=11
			::oBrowse:addColumn( {|| ::aData[::nRecno, 11] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )
		case i=12
			::oBrowse:addColumn( {|| ::aData[::nRecno, 12] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )
		case i=13
			::oBrowse:addColumn( {|| ::aData[::nRecno, 13] } , 10, IIF( ::aData[1][i]!=NIL, ::aData[1][i], "" ) )

		endcase


	NEXT

	::oBrowse:Create()

	::oBrowse:SkipBlock      := {|nSkip, oBrowse| ::Skip(nSkip, oBrowse)}
	::oBrowse:GoBottomBlock  := {|| ::nRecno := LEN(::aData)}
	::oBrowse:GoTopBlock     := {|| ::nRecno := 1}
	::oBrowse:PosBlock       := {|| ::nRecno}
	::oBrowse:PhyPosBlock    := {|| ::nRecno}
	::oBrowse:FirstPosBlock  := {|| 1}
	::oBrowse:LastPosBlock   := {|| LEN(::aData)}
	
	::oBrowse:goPosBlock    := {|n| nil }

	::oBrowse:setLeftFrozen( {1} )

	::oBrowse:itemMarked := {| aRowCol, uNIL2, self | oFenster1:oBrowse:refreshAll() }
	::oBrowse:itemSelected := {| uNIL1, uNIL2, self | oFenster1:Bearbeiten() }

	ResizePreiseMatrixEdit( ::oBrowse, ::currentSize() )
	::oBrowse:RefreshAll()

	::oBrowse:show()

METHOD Skip(nSkip)
	LOCAL nCanSkip



	IF ::nRecno + nSkip < 1
		nCanSkip := 1 - ::nRecno
	ELSEIF ::nRecno + nSkip > ::nLastRec
		nCanSkip := ::nLastRec - ::nRecno
	ELSE
		nCanSkip := nSkip
	ENDIF

	
	::nRecno += nCanSkip

	/*
	IF ::nRecno < 1
		::nRecno := 1
	elseIF ::nRecno > ::nLastRec
		::nRecno := ::nLastRec
	ENDIF
	*/
RETURN nCanSkip

Gruß,

Andreas
VIP der XUG Osnabrück
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hi

ich hab da auch schon mal was hier im Forum geschrieben unter
dem Titel "Array in xbpBrowse"

der Quelltext funktioniert auch so
Gruß Rolf
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Beitrag von Wonderer »

Erst einmal Danke für die Antworten. Es war dann doch nur ein simpler Fehler in der Skip-Methode. Diese hatte ich nicht aus EBROWSE übernommen sondern selbst geschrieben. Dabei habe ich zuerst den neuen nRecNo Wert gesetzt und dann auf Gültigkeit in den Array-Grenzen überprüft und wieder zurückgesetzt. Die Änderung an nRecNo wirken sich jedoch scheinbar unmittelbar auf das Browse-Objekt aus, so dass der besagte Fehler auftrat. Habe jetzt die Skip-Methode aus EBROWSE übernommen...

@andreas
Habe heute versucht einen variablen Code für das Hinzufügen von Spalten zu schreiben. Ähnlich wie du es mit der CASE-Anweisung machst.

Ich habe in der CreateColumns() folgendes stehen.

[...]
if len(::aFields) == 1
::oBrowser:addColumn( {|| ::aValues[::nRecNo] }, , ::aFields[1])
::nRecCnt := len(::aValues)
else
if len(::aFields) == len(::aValues)
for z := 1 to len(::aFields)
sFieldBlock := "{|| ::aValues["+str(z)+",::nRecNo] }"
::oBrowser:AddColumn( &(sFieldBlock), , ::aFields[z])
next
endif
::nRecCnt := len(::aValues[1])
endif
[...]

Ich bastele mir so den Codeblock zusammen. Das funktioniert aber nicht. Ich bekomme die Fehlermeldung: "unbekannte Variable". (?)

@Martin
Die Änderung habe ich vorgenommen, danke. So funktioniert jetzt auch das scrollen im Fenster.

@Rolf
Okay, ich suche gleich mal...
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

Beitrag von AUGE_OHR »

hi,

also hier ist aValues 1-Dim (aValue[1])
Wonderer hat geschrieben: ::oBrowser:addColumn( {|| ::aValues[::nRecNo] }, , ::aFields[1])
während hier aValue doch 2-Dim ist (aValue[1,1]) ?
Wonderer hat geschrieben: sFieldBlock := "{|| ::aValues["+str(z)+",::nRecNo] }"
oder ?

gruss by OHR
Jimmy
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Rolf,

deine Variablen
z und sFieldBlock
sind nicht überal sichtbar.
2. Diese habaen auch keinen festen Wert.
Ich hatte damals das gleiche Problem und habe es erstmal über DO CASE -Anweisung mit fest vergebenen Nummern gelöst.
Gruß,

Andreas
VIP der XUG Osnabrück
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Beitrag von Wonderer »

@AUGE_OHR
AUGE_OHR hat geschrieben:hi,

also hier ist aValues 1-Dim (aValue[1])
Wonderer hat geschrieben: ::oBrowser:addColumn( {|| ::aValues[::nRecNo] }, , ::aFields[1])
während hier aValue doch 2-Dim ist (aValue[1,1]) ?
Wonderer hat geschrieben: sFieldBlock := "{|| ::aValues["+str(z)+",::nRecNo] }"
Ja, das aFields-Array enthält die Feldnamen. Wenn mehrere Felder übergeben werden sollen muss das aValues-Array mehrdimensional sein. Wobei die erste Dimension des aValues == len(aFields) sein muss.
Nun wollte ich mir den Codeblock zusammensetzen in einer Zeichenkette. Das Problem dabei ist die Übergabe an "addColumn". Dort darf keine Zeichenkette übergeben werden sondern nur ein Codeblock. Daher habe ich gedacht mit dem "&" kann ich den String in einen Codeblock umwandeln, aber das scheint so nicht zu funktionieren. Habe die Funktionsweise des Makro-Operators scheinbar noch nicht ganz verstanden. Muss ich mir noch einmal anschauen.

@Andreas
Okay, dann ist die Funktion begrenzt auf eine bestimmte Anzahl Felder.

MfG, Ralf...
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

ich habe oben in einem Ausschnitt von Andreas ein

oBrowse:setLeftFrozen({1})

gesehen.

Hm, ich versuche es auch gerade, dass die linke Spalte fest stehen bleibt.

Aaaaber, wie immer, mal wieder zu ungeschickt. Es klappt nicht. Was muß denn da alles rein?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Beitrag von brandelh »

Hi Manfred,

1. es handelt sich um einen XbpBrowse ? (nicht Quickbrowse)
2. Du zählst im Array alle linken fixierten Spalten auf ?
1 bis 4 -> {1,2,3,4} ?
Warum das so gelöst wurde ist mir allerdings ein Rätsel,
oder sollte {1,4} die 1. und die 4. einfrieren und 2 und 3 wegrollen ?

wenn es das nicht ist, wäre deine kopierte Befehlszeile (nicht aus dem Gedächtnis nachgeschrieben) wünschenswert, sowie eine Beschreibung
was genau nicht geht. ;)
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

puh, Klasse, dass Du doch noch weiter antwortest... :D

Es klappt alles an dem XBPBrowse.

Nur eben die weitere Zeile oBrowse:setLeftFrozen({1}) will nicht. Ich denke mal, die Zahl ist die Spalte, die einfrieren soll?

PS: Wobei sich mir jetzt die Frage stellt, wann muß es wohin? Nach jedem AddColumn, oder wie oder was?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Beitrag von brandelh »

Manfred hat geschrieben: Nur eben die weitere Zeile oBrowse:setLeftFrozen({1}) will nicht. Ich denke mal, die Zahl ist die Spalte, die einfrieren soll?
Bei diesem Beispiel wird die 1. Spate links fixiert, der Rest rollt.
Jetzt weiß ich auch warum ein Array ;) , denn
{4,2,5} würde von links zuerst die 4. Spalte, dann die 2. dann die 5. fixiert anzeigen, also umsortieren und den Rest scrollen.

Rufst du die methode auch nach dem Create() auf ?

Ich habe das Beispiel aus der Onlinehilfe genommen und vor dem Show das setLeftFrozen() eingebaut. Es funktioniert.

Hast du überhaupt genug Spalten, dass man nach rechts rollen kann ???
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,
Bei diesem Beispiel wird die 1. Spate links fixiert, der Rest rollt.
genau, das hatte ich mir auch so gedacht
Jetzt weiß ich auch warum ein Array ;) , denn
{4,2,5} würde von links zuerst die 4. Spalte, dann die 2. dann die 5. fixiert anzeigen, also umsortieren und den Rest scrollen.
?? Wird intern sortiert, oder was meinst Du?
Rufst du die methode auch nach dem Create() auf ?
jaha. Ich mache bisher immer ein :addcolumn und dann dahinter ein :setleftfrozen({1}). Irgendwas mache ich wohl wieder falsch. Ich glaube ich werde es einmal in einem kurzen test ohne alles ausprobieren.
Ich habe das Beispiel aus der Onlinehilfe genommen und vor dem Show das setLeftFrozen() eingebaut. Es funktioniert.
Hast du überhaupt genug Spalten, dass man nach rechts rollen kann ???
Hm, ich glaube ich habe hier schon sehr viel doofe Fragen gestellt und Mist erzählt??
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Beitrag von brandelh »

Manfred hat geschrieben:Ich mache bisher immer ein :addcolumn und dann dahinter ein :setleftfrozen({1}).
da liegt der Haase begraben ... nicht nach jedem addcolum, sondern danach ...

oBrowse := XbpBrowse():new():create()
....
for x := 1 to nCol
oBrowse:addcolumn(..)
next
...
oBrowse:setleftfrozen({1})
oBrowse:show()
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hier mal ein kleiner Aussschnitt, wie ich es mache.
Ich hoffe es hilft.


Code: Alles auswählen

nLen := LEN(aMaskenArray)
          FOR nI := 1 TO nLen                                // einmal das Array durchlaufen und die Felder abfragen
              cField      := aMaskenArray[nI,1]                                 // Feldbezeichnungen
              cHead       := aMaskenArray[nI,2]                                 // Überschriften
              nBreite     := aMaskenArray[nI,4]                                 // Feldbreiten
              lAusblenden := aMaskenArray[nI,5]                                 // Ausblenden der Spalte
              IF lAusblenden
                 LOOP
              ENDIF
              lLeftFrozen := aMaskenArray[nI,6]                                 // links Fixieren der Spalte
              IF nBreite = 0
                 nBreite := 2
              ENDIF
              oBrowse:addColumn(&("{||"+cField+"}"),nBreite, cHead)             // jetzt werden die Spalten erzeugt
          NEXT
          IF lLeftFrozen
             oBrowse:setLeftFrozen({1})
          ENDIF
wie gesagt, bis auf das Frieren klappt der Rest
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Beitrag von brandelh »

Hallo Manfred,

wenn du den Wert der 6. Spalte als 1. links festfrieren willst mußt du {6} schreiben, wenn alle bis zur 6. Spalte fest sein sollen {1,2,3,4,5,6}

So jetzt geht aber mein Zug ...
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

ich habe an einer gaaanz anderen Stelle einen riiiiieeesen Denkfehler begangen.

Jetzt klappt es.

PS: Ah, ist aber interessant. Wenn man Spalte 1,3 friert, dann werden die an den Anfang gesetzt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
Manfred hat geschrieben:ich habe an einer gaaanz anderen Stelle einen riiiiieeesen Denkfehler begangen.
das glaube ich Dir aufs Wort! :D
Nicht bei jeder Spalte entscheiden, ob die Spalte eingeforen dargestellt werden soll, sondern einmalig, welche einzufrieren sind!
Du hast in Deinem Beispiel in dem Array die Spalten ja untereinander angeordnet. Und wenn Deine letzte Spalte halt nicht eingefroren werden sollte, war Deine Boolesche Variable lLeftFrozen false und somit ging es nicht :)

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

(Du kannst immer so schön aufmuntern :roll: )

mein Beispiel oben ist irgendwie verrutscht. Die setLeftFrozen muß noch in die For Schleife. Warum die darunter gefallen ist, ist mir schleierhaft. Allerdings wär das oben dann trotzdem falsch.

Jetzt habe ich aber verstanden, wie das klappt. Ich schreibe bei einem .T. einfach die Spalte in ein Array und übergebe das dann an die Methode. Das klappt auf jeden Fall.

Allerdings grübel ich jetzt darüber nach, wieso ich die Spaltenbreite nicht "beliebig" klein machen kann.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Nein, nein, nein!!!
Das geht so nicht!
Das SetLeftFrozen muß am Ende der Schleife kommen - in der Schleife mußt Du Dir das Array mit den einzufrierenden Spalten zusammenbauen :!:
Beispiel:

Code: Alles auswählen

LeftFrozen := {}
FOR.....
....
  if aMaskenArray[nI,6]
    AAdd( LeftFrozen, nI )
  endif
....
NEXT
IF len( LeftFrozen  ) > 0
  oBrowse:setLeftFrozen( LeftFrozen ) 
ENDIF
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Höhöhö,

egal....

das habe ich doch so gemacht, aber sicherlich bei meinem letzten Thread nicht vernünftig darauf hingewiesen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten