Instanzen dynamisch bilden

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

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

Instanzen dynamisch bilden

Beitrag von Manfred »

Hi,

es kann sein, dass es mal wieder recht einfach ist. Ich komme aber nicht weiter.

Ich möchte gerne beim Aufbau der GUI in einem Static Rahmen SLE und Static dynamisch einbringen. Dynamisch deshalb, weil die Feldtexte alphabetisch sortiert in der Reihenfolge erzeugt und angezeigt werden sollen.

Deshalb würde ich es gerne in einem Array unterbringen und dann eben sortieren. Somit kann ich das Array beliebig füllen und muß dann nicht im Rahmen selbst darauf achten, dass die Felder alphabetisch richtig stehen.

Bisher habe ich es so gemacht:

Ich habe das Array gefüllt

Code: Alles auswählen


aFelder := {;
                  {"feld1"},;
                  {"feld2"},;
                  {"feld3"},;
                  {"feld4"},;
                  {"feld5"},;                  
                 }
Ausgewertet wird es dann so

Code: Alles auswählen

         nY := nYOrg
         nX := nXOrg
         nY := oVt:oRahmenVoStatistik:currentSize()[2]-nYOrg

         FOR nI := 1 TO Len(oVo:aFelder)
             oStatic         := feldtexte():new(oVt:oRahmenVoStatistik,,{nX,nY},{100,nStaticHoehe})
             oStatic:caption := oVo:aFelder[nI,1]
             oStatic:create()
             nY -= 30
             IF nY <= 30
                nY := oVt:oRahmenVoStatistik:currentSize()[2]-nYOrg
                nX := 100
             ENDIF
         NEXT
(Feldtexte() ist nur eine Methode, die mir Statics zurückgibt, damit ich nicht immer alles extra schreiben muß, was dazu benötigt wird. Also eigentlich könnte da auch XbpStatic stehen.)

Das klappt, die Instanzen für die Beschriftung werden erzeugt.
Jetzt hatte ich vor auch noch in das Array die Objektnamen einzugeben, damit diese auf dem gleichen Wege direkt neben der Feldbeschriftung erzeugt werden.
Geplant war das so:

Code: Alles auswählen


aFelder := {;
                  {"feld1",oObjekt1},;
                  {"feld2",oObjekt2},;
                  {"feld3",oObjekt3},;
                  {"feld4",oObjekt4},;
                  {"feld5",oObjekt5},;                  
                 }
Also im Prinzip soll das passende Objekt zum Static im Array stehen. Nur, wie schreibe ich das richtig, wie erzeuge ich die Instanzen später in einer Schleife und vor allen Dingen: Geht das überhaupt was ich vorhabe?
Ich hatte auch schon einen Codeblock für die Erzeugung der Instanz in das Array geschrieben, aber ich weiß dann nicht, wie ich den auswerten soll, innerhalb der Schleife?
Ich denke einmal, das hat nichts mit dynamischen Klassen zu tun? Weil da habe ich nachgelesen, konnte aber keine Verbindung herstellen zu meinem Problem.
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: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

was hat ein oXbpStatic mit dem Inhalt zu tun ?

Du kannst doch einfach z.B. 10 statisch oder dynamisch erzeugen und nur bei der Zuordnung der CAPTION vorher die Texte sortieren :?:

Eigentlich sind alle Controls von Xbase++ dynamisch ! Statisch wäre es wenn wir die Dialoge als Resourcen anlegen würden (denke ich mal so richtig verstanden zu haben ...)

Du könntest das Erzeugen eines Static in eine Funktion legen und der alles nötige übergeben und z.B. aus einem Codeblock aufrufen. Im Prinzip musst du den gleichen Code ausführen, den du normalerweise in der INIT und CREATE Methode ausführst.

Ich würde z.B. 10 Statics OHNE Caption (=unsichtbar) erzeugen, die jeweiligen Objekte in einem unabhängigen Array sammeln und später einfach die Caption setzen:

Code: Alles auswählen

aeval(aStatic, {|oStatic,x| oStatic:setCaption( aCaption[x] ) } )
So wäre über die Laufnummer (hier x) die Zuordnung möglich.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,
brandelh hat geschrieben:Hallo Manfred,

was hat ein oXbpStatic mit dem Inhalt zu tun ?
Ich weiß jetzt nicht, ob ich die Frage richtig verstehe. Ich meine nur, dass ich z.B. links den Text als Static stehen habe und dann daneben ein SLE z.B. in dem die Inhalte angezeigt werden. Da die beiden zusammengehören, sollten sie auch mit dem Static sortiert werden.
Du kannst doch einfach z.B. 10 statisch oder dynamisch erzeugen und nur bei der Zuordnung der CAPTION vorher die Texte sortieren :?:

Eigentlich sind alle Controls von Xbase++ dynamisch ! Statisch wäre es wenn wir die Dialoge als Resourcen anlegen würden (denke ich mal so richtig verstanden zu haben ...)

Du könntest das Erzeugen eines Static in eine Funktion legen und der alles nötige übergeben und z.B. aus einem Codeblock aufrufen. Im Prinzip musst du den gleichen Code ausführen, den du normalerweise in der INIT und CREATE Methode ausführst.
Das verstehe ich jetzt im Moment überhaupt nicht. Tut mir Leid. Kannst Du mir das näher erklären. Ich denke mal, es fehlt mir heute morgen der kleine Hinweis...
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
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hi Manfred,

du kannst doch die SLE ebenfalls mit der Static in ein Array bringen mit der gleichen Nr. - Wie Hubert meinte, hast du dann die Sortierung mit [x]
Nur beim Datalink vom Sle mußt du aufpassen.

oder habe ich dich falsch verstanden ?
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

ich weiß nicht, ob und wie ich SLE in ein Array packe und dann aus dem Array heraus erzeuge. Um eine reine Anzeige geht es nicht. Ich muß die Statics erzeugen und die Sle, oder Checkbuttons, oder was auch immer. Ein new() und create() mit den reinen Statics klappt, weil ich in diesem Fall nur eine Var nehme, die für jedes Static benutzt wird. Diese Var, die ich dann benutze, steht nicht in dem Array. In dem Array steht dann nur die Caption. Wenn ich aber jetzt zu jedem Static die entsprechende Ausgabe machen will, dann benötige ich für jede Ausgabe einen anderen Variablennamen. Normalerweise macht man sowas ja über den Macrooperator, aber das scheint wohl bei Instanzen so nicht zu gehen, oder ich komme nicht darauf.

Also:

Code: Alles auswählen


aArray := {;
                 {"caption1"},;
                 {"caption2"},;
                 {"caption3"},;
                 {"caption4"};
                 }

for i := 1 TO len(aArray())
     oStatic             := xbpstatic():new()
     oStatic:caption := aArray[i,1]
     oStatic:create()
next

Das geht, weil ich nur oStatic habe. da ich die TExte nicht direkt ansprechen muß später, genügt es wenn ich nur eine Var habe.

Jetzt möchte ich aber folgendes haben:

Code: Alles auswählen


aArray := {;
                 {"caption1",oFeld1},;
                 {"caption2",oFeldF},;
                 {"caption3",oFeldX},;
                 {"caption4",oFeld3};
                 }

Also Instanzen, die nicht über eine Var zu definieren sind und die später über den direkten Namen angesprochen werden müssen.

THEORTISCH sollte es ja so aussehen:

Code: Alles auswählen


for i := 1 TO len(aArray())
     oStatic             := xbpstatic():new()
     oStatic:caption := aArray[i,1]
     oStatic:create()
     aArray[i,2] := xbpsle():new()
     aArray[i,2]:create()
next

Aber nur theoretisch, weil es nicht klappt. Oder ich habe einen Denkfehler gemacht. Der Compiler nimmt das Array so nicht, weil er sich über die Angabe OHNE Anführungszeichen muckiert. Wenn ich die "Objekte" in dem Array in Anführungszeichen setze, dann muß ich aber in der For NExt Schleife den Makrooperator benutzen, das klappt dann aber auch wieder nicht.
Mache ich was falsch, oder geht das so überhaupt nicht?

Es geht nur um die reine Erzeugung. Die Codeblocks für den datalink kann ich ja auch als 3. Element in dem Array unterbringen. usw.
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: 16501
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,
koch' Dir mal 'nen Kaffee und nimm Dir ein paar Kekse (oder hast Du die schon alle gefuttert?) und dann denke noch mal in Ruhe darüber nach, was Du eigentlich willst... :wink:
In Deinem Array steht in der 2. Position ja nicht ein "echtes" Objekt (das erzeugst Du ja noch später), sondern nur ein Name für dieses Objekt - oder? Und wenn dem so ist, wieso? Woher weißt Du, welches Feld dann daran hängt (also per :datalink damit verknüpft ist)?
Was willst Du denn eigentlich erreichen?
Ich vermute mal, dass Du wieder bei Deiner Datenbankklasse bist und - unabhängig von der geöffneten Datenbank - eine einfache Eingabemaske stricken willst, richtig?
Ansonsten würde ja eine alphabetische Sortierung nicht wirklich Sinn machen - oder würdest Du wirklich Daten eingeben wollen, die in der Reihenfolge einzutippen sind:
  • Name
    Ort
    PLZ
    Strasse
    Telefon
    Vorname
Wenn meine Vermutung stimmt, ist das ganze doch viel einfacher:
Hole Dir die Struktur Deiner Datenbank und sortiere nach den Feldnamen:

Code: Alles auswählen

aStructure := DbStruct()
ASort( aStructure,,, {|aX,aY| aX[DBS_NAME] < aY[DBS_NAME] } )
Nun hast Du schon mal alles in der richtigen Reihenfolge und kannst Deine Felder ausgeben, wie Du das oben gemacht hast.
Dabei kannst Du überlegen, ob Du an den Anfang jeder Caption ein & hängst, so dass das jeweilige Feld mit ALT-1.Buchstabe angesprungen werden kann.
Anhand des Feldtyps (in Position DBS_TYPE Deines Arrays) kannst Du entscheiden, ob Du ein SLE, Checkbox, was auch immer nimmst. Die Länge hast Du ja auch (in Position DBS_LEN und die Nachkommastellen in DBS_DEC) und somit kannst Du dann sogar eine picture definieren.

Warst Du gestern nun noch beim XUG-Treffen in Leverkusen?

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
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

hast du schon Kaffee und Kekse hinter dir ?
Martins Vorschläge sind immer die Besten ;-) du solltest erst nochmal überlegen was du willst und warum du es so willst.

Du könntest natürlich ein Array machen, das in der ersten Spalte die Captions enthält und in der 2. Spalte die Static Objecte etc. aber macht das wirklich Sinn ? In einer einfachen Eingabemaske spielt es doch keine Rolle genau DEIN SLE anzusprechen, du musst nur die caption und datalink Blöcke der SLE richtig setzen und dann passt das auch:

1. Feld -> 1. oStatic:setCaption(..) -> 1. oSLE:datalink := .... oder setData()...

2. Feld -> 2. oStatic:setCaption(..) -> 2. oSLE:datalink := .... oder setData()...

ODER aber du verwendest festgelegte Namen (so wie ich und der CLASS Code es machen):

Feld PLZ -> oftPLZ -> oslePLZ ...

Wenn du ein datadriven (DBF) Feldeditor machen möchtest, dann wären die Namen natürlich eine Einschränkung.

Code: Alles auswählen

aTXT := {"Eins","Zwei","drei"}  // eindimensional -> wir brauchen aber 2 !

aEval(aTXT, {|cCaption| aadd(aArray, { cCaption, NIL, NIL } ) } )
so jetzt haben wir die Grundlage für dein gewünschtes Array mit caption und Controls (ging natürlich auch auf einmal, aber ich möchte beides trennen, da ich nicht weiß wie du das aArray erzeugt hast.

Aber was seh ich da:

for i := 1 TO len(aArray())

ist aArray nun eine FUNKTION oder ein ARRAY ?

Egal, ich fülle nun mein Array mit den neuen Objecten:

Code: Alles auswählen

nMax := len(aArray) // geht schneller

for i := 1 to nMax
     oStatic             := xbpstatic():new() 
     // da fehlen aber noch aPos und aSize !
     oStatic:caption := aArray[i,1] 
     oStatic:create() 
     aArray[i,2] := oStatic  // einfach OBJEKT speichern !
     oSLE := xbpsle():new() 
     // da fehlen aber noch aPos und aSize !
     oSLE:datalink ???
     oSLE:create() 
     aArray[i,3] := oSLE  // einfach OBJEKT speichern !
next 
Bedenke aber, dass diese Aktion möglichst selten durchgeführt wird:
einmal beim Aufbau ist OK,
keinesfalls bei einem Satzwechsel, sonst wird es sehr lahm !

Ich kann den Code jetzt nicht prüfen, aber so müsste es gehen.
In den Arrays selbst wird NICHT die Variable oSLE oder oStatic gespeichert, sondern deren aktueller Inhalt -> die Referenz auf das Objekt. Somit kann danach auch oSLE oder oStatic für das nächste verwendet oder auf NIL gesetzt werden. Im Array sind alle Referenzen enthalten.
Gruß
Hubert
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hi Manfred,

in meinem Beispiel habe ich 9 verschiedene Checkboxen, die als Sortierung dienen.

Hier ein Auszug: Diese Checkboxen sind beim start disable()- werden aber durch ein anderes Feld freigeschaltet. aObj ist als Privat deklariert

Code: Alles auswählen

	oBox39 := XbpCheckBox():new( drawingArea,, {190,80}, {140,20} )
	oBox39:caption :=aFelder[39][1]
	oBox39:tabStop := .T.
	oBox39:create()
	oBox39:selected := ; 
	    {| mp1, mp2, oChk| IIf( oChk:getData(), aFelder[39][2]:=.t., aFelder[39][2]:=.f. ),;
				PrfSortBox(aFelder,oBox39,39)}
	AAdd(aBox,oBox39)
	oBox39:disable()


Function PrfSortBox(aFelder,oBox,Nr)
Local lTreffer:=.f.
For i = 1 to Len(aObj)
	Do Case
		Case empty(aObj[i]) .and. aFelder[nr][2]=.t.
			aObj[i]:=oBox
			lTreffer=.t.
			exit
		Case aObj[i]=oBox .and. aFelder[nr][2]=.f.
			Do Case
				Case i=1
					aObj[1]:=aObj[2]
					aObj[2]:=aObj[3]
					aObj[3]:=Nil
				Case i=2
					aObj[2]:=aObj[3]
					aObj[3]:=Nil
				Case i =3
					aObj[3]:=Nil
			EndCase
			oBox:setdata(.f.)
			lTreffer:=.t.
			exit
		Otherwise
			lTreffer:=.f.
	EndCase
Next i
If lTreffer=.f. .and. aFelder[nr][2]=.t.
	oBox:setdata(.f.)
	aFelder[nr][2]:=.f.
EndIf
Return Nil
im Array ist das komplette Object vorhanden. d.h. du kannst den Caption ändern setdata setzen usw.

Vielleicht hilft es dir weiter
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

ohne eure Antworten komplett gelesen zu haben, stelle ich jetzt erstmal eine Teillösung ein, die ich gerade mal erstellt habe. Nur damit die Diskussion nicht abbricht:

Also, das klappt bisher:

Code: Alles auswählen

METHOD vo:erzeugeArrayStatistikFelder(objekt)
       MEMVAR oVo
       ::aFelderStatistikVo := {;
                      {"Datum Ankauf:" ,{|| oVo:oDatumAk  := SlePic():new(objekt:oRahmenStatistikVo):create()}},;
                      {"Datum Eingang:",{|| oVo:oDatumEin := SlePic():new(objekt:oRahmenStatistikVo):create()}},;
                      {"Datum Ausgang:",{|| oVo:oDatumAus := SlePic():new(objekt:oRahmenStatistikVo):create()}};
                               }
RETURN self

oVo:erzeugeArrayStatistikFelder(oVt)

         nY := oVt:oRahmenStatistikVo:currentSize()[2]-nYOrg

         FOR nI := 1 TO Len(oVo:aFelderStatistikVo)
             oStatic := feldtexte():new(oVt:oRahmenStatistikVo,,{nX,nY},{nStaticLaenge,nStaticHoehe})
             oStatic:caption := oVo:aFelderStatistikVo[nI,1]
             oStatic:create()
             Eval(oVo:aFelderStatistikVo[nI,2])
             nY -= 30
             IF nY <= 30
                nY := nYOrg
             ENDIF
         NEXT
Das klappt jetzt. Das Blöde ist jetzt nur, dass die Slepics an total verkehrter Stelle erschienen. Also habe ich in dem Codeblock darauf verzichtet die aPos Angaben zu machen.

Es scheint aber nicht zu klappen. Wenn ich jetzt als 3.Element in dem Array den Namen des späteren Objektes angebe, dann ist es aber zu dem
Zeitpunkt NIL und kann somit nicht in der späteren Schleife über :setPos() richtig positioniert werden.

@Hubert.

Keine Bange, ich baue das nur 1x so auf und zwar zum Zeitpunkt der Maskenerstellung. Danach wird nur noch mit setdata() garbeitet.

@Martin,

natürlich kommt später noch mehr in das Array. Auch ein Codeblock z.B. für den Datalink. Ich versuche jetzt nur schrittweise das Dingen ans Laufen zu kriegen und dann nach und nach zu erweitern.
Das Sortieren ist dafür da, die Anzeige stellt nur Statistik dar. Es werden keine Eingabefelder, sondern nur Anzeigen.
Und bevor jetzt jemand den Kopf schüttelt, Slepic ist nur für den Anfang, damit ich bei der Erzeugung zeilenweisen sehen kann, was passiert. Es wird später gegan andere Parts ausgetauscht.
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: 16501
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,
kein Wunder, dass Deine Positionen nicht stimmen!
Zum Einen berechnest Du den Startwert für nY so:

Code: Alles auswählen

nY := oVt:oRahmenStatistikVo:currentSize()[2]-nYOrg
setzt ihn dann aber in Deiner Schleife nur zurück auf:

Code: Alles auswählen

nY := nYOrg
Des weiteren sehe ich nirgendow, wie Du nX setzt :!:
Diesen Wert musst Du natürlich auch anpassen, wenn nY <= 30 ist!
Woher bekommst Du nStaticLaenge und nStaticHoehe?
Was steht in aFelderStatistikVo[nI, 2]?

Viele Grüße,
Martin
Zuletzt geändert von Martin Altmann am Mi, 12. Mär 2008 12:37, insgesamt 1-mal geändert.
: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: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

nochwas hinterher:

Die Kekse sind schon lange weg und Kaffee mag ich nicht. :lol:
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

kleiner Übermittlungsfehler. Die Werte für aPos habe ich vorher der Methode übergeben. Ich war aber bisher der Meinung, dass ein Codeblock Code zur Laufzeit ausführt und somit auch auf geänderte verhältnisse reagiert. Das scheint aber nicht der Fall zu sein, oder ich mache es falsch. Die Werte, mit denen die Position errechnet werden soll, werden erst vor dem Eval() errechnet. Das scheint den Codeblock aber nicht zu stören. Ich hatte nur darauf hingewiesen, dass es nicht klappt und auch schon den geänderten Codeblock zu gezeigt.

Sch.... ist das hier windig draußen.
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: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Manfred hat geschrieben: Wenn ich jetzt als 3.Element in dem Array den Namen des späteren Objektes angebe, dann ist es aber zu dem
Zeitpunkt NIL und kann somit nicht in der späteren Schleife über :setPos() richtig positioniert werden.
Der Name nützt dir gar nichts ! Du brauchst Objekte !

Dass die Positionen nicht stimmen kann ich verstehen,
du gibst ja gar keine vor !

Eval(oVo:aFelderStatistikVo[nI,2]) gibt doch den letzten erzeugten Wert eines Codeblockes zurück - oder irre ich mich da ?

Wenn ja, müsste das bei deinen vorgeladenen Codeblöcken genau das aktuell erzeugte Controll sein:

Code: Alles auswählen

...
oTemp := Eval(oVo:aFelderStatistikVo[nI,2]) 
oTemp:setPosAndSize()
...
sollte funktionieren.

Ansonsten speichere die Referenzen auf die 2. erzeugten Objekte wie ich oben beschrieben habe einfach auch im Array.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
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,
war mein Fehler - ich hatte den oberen Teil ignoriert...
Was passiert bei AEval()?

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: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

wann Aeval()? Statt Eval()?

Geht nicht, weil ich ja sonst nicht passend zu den Statics die "felder" erzeugen kann. Dann würde ja zu jedem Arraysatz immer das komplette Array durchlaufen in der For Schleife.

Die For Schleife ist auch nur da, um im Einzelschritt den Erfolg abzuklopfen, Später wird da ein Aeval draus.
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: 16501
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,
genau da!
Nein - Deine Bedenken sind nicht korrekt, da das zweite Element ja ein Array ist!

Code: Alles auswählen

AEval(oVo:aFelderStatistikVo[nI,2])
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: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

@Hubert,

Deine Vorschläge bearbeite ich gleich...

@Martin,

wie Array? Es ist doch ein Codeblock..
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: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Martin Altmann hat geschrieben:Nein - Deine Bedenken sind nicht korrekt, da das zweite Element ja ein Array ist!

Code: Alles auswählen

AEval(oVo:aFelderStatistikVo[nI,2])
Aber aEval() nutzt jedes Element eines Arrays um es einem Codeblock zu übergeben.
Er nutzt Eval() um genau den Codeblock der einen Array Zeile auszuführen.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Ihr habt ja Recht - und ich eine frische Tasse Kaffee vor mir... :D

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: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

So,

hier nochmal das, was ich meinte:

Code: Alles auswählen

METHOD vo:erzeugeArrayStatistikFelder(objekt,nXEingabe,nY)
       MEMVAR oVo
       ::aFelderStatistikVo := {;
                                {"Datum Ankauf:" ,{|| oVo:oDatumAk  := SlePic():new(objekt:oRahmenStatistikVo,,{nXEingabe,nY},{100,20}):create()},oVo:oDatumAk},;
                                {"Datum Eingang:",{|| oVo:oDatumEin := SlePic():new(objekt:oRahmenStatistikVo,,{nXEingabe,nY},{100,20}):create()},oVo:oDatumEin},;
                                {"Datum Ausgang:",{|| oVo:oDatumAus := SlePic():new(objekt:oRahmenStatistikVo,,{nXEingabe,nY},{100,20}):create()},oVo:oDatumAus};
                               }
RETURN self
************************************************************
         nY := nYOrg
         nX := nXOrg

         nY := oVt:oRahmenStatistikVo:currentSize()[2]-nYOrg

         oVo:erzeugeArrayStatistikFelder(oVt,nX+100+nXAbstand,nY)

         FOR nI := 1 TO Len(oVo:aFelderStatistikVo)
             oStatic := feldtexte():new(oVt:oRahmenStatistikVo,,{nX,nY},{nStaticLaenge,nStaticHoehe})
             oStatic:caption := oVo:aFelderStatistikVo[nI,1]
             oStatic:create()
             nXEingabe := nX + nXAbstand + oStatic:currentsize()[1]
             Eval(oVo:aFelderStatistikVo[nI,2])
             nY -= 30
             IF nY <= 30
                nY := nYOrg
             ENDIF
         NEXT
das klappt nicht, wenn ich nY verändere. Static ja, aber aus dem Codeblock nicht.
Was mich auch irritiert ist, dass ich oVo als Memvar oben angeben muß. Der ganze Mist steht doch in einem Codeblock, warum meckert der Compiler beim Compilieren?
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Boh Hubert, ey,

die Sache mit dem

oTemp := eval()
oTemp:setPos()

das war es. Man, da habe ich ganz kurz dran gedacht, aber mal wieder die Anleitung nicht verstanden und auch nicht weitergelesen. Bzw. war der Meinung: das ist zu einfach.

Danke für den Gedankentritt

ich sollte mal mehr auf meinen Bauch hören. :roll:
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: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

Variablen im Code-Block werden als solche erkannt und wenn du die Warnungen auf undeklarierte Variablen eingeschaltet hast, muss er meckern. Die Variablen in deinem codeblock die LOCAL (Parameter in Klammern oben) sind, werden zur Compilierzeit bestimmt und sind später nicht automatisch im aufrufenden Programm bekannt. Am Besten man kann den Codeblock auflösen:

Code: Alles auswählen

local cSuchOrt := "Mannheim"
... eval(&("{|| field->ORT='"+cSuchOrt+"'")})
oder man übergibt die Variablen per eval(...

Code: Alles auswählen

local cSuchOrt := "Mannheim"
... eval( {|cOrt|field->ORT=cOrt} , cSuchOrt )
Gruß
Hubert
Antworten