Objekte in Arrays ablegen

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

Moderator: Moderatoren

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

Objekte in Arrays ablegen

Beitrag von Manfred »

Ich mal wieder,

die Sache, Objekte über AADD in ein Array reinzupacken und dann über AEval nach und nach abzuarbeiten ist eine schöne Erfindung, nur ist mir jetzt dabei etwas aufgefallen, für das ich keine Lösung parat habe:

Code: Alles auswählen

local aObjekte := {}

PRIVATE oUWg        := uwg():new():initvaria():dbopen()
PRIVATE oUwg2       := uwg():new():initvaria():dbopen()

aadd(aObjekte, oUwg)
aadd(aObjekte,oUwg2)

jetzt stehen zwar 2 Objekte im Array, aber beide haben den gleichen Namen nämlich ouwg.

Code: Alles auswählen

AEval(aObjekte,{|o| o:closeDb()})
Wenn ich das jetzt aufrufe, bleibt die letzte DB die zu ouwg2 gehört offen. Das passiert bei allen Objekten, die aus der gleichen Klasse gebaut werden.

Wo denke ich hier wieder falsch.
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
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,

hab zwar keine direkte Lösung für dich, aber das Problem selbst ist
interessant.

Ich hab ein ähnliches Problem gehabt als ich meine Cl*pper Proceduren
auf GUI / MDI umgestellt hab. Da es unter MDI möglich ist "beliebig"
viele Fenster zu öffnen (mit verschiedenen RECNO() ) brauchte ich
nun was zum "identifizieren". Ich gebe nun beim :init / :create eine
"Nummer" > 0 zurück die ich beim "Save,Close etc" benutze.

Code: Alles auswählen

#xtranslate mW9MARK  => Stack\[SP, 1]
...
#xtranslate mEditRec    => Stack\[SP,18]

STATIC Stack       := {}       // Array für Memvar´s
STATIC SP           := 0        // "Zähler"
STATIC aEditControls := {}  // Array SLE
STATIC hWndEdit                 // handle des "Fenster´s"

FUNCTION         EDIT_INIT
AADD(Stack,ARRAY(18))       // Anzahl meiner Memvar´s 
SP++                                  // "STACK" hochzählen 
EDIT_LEER()                        // Memvar´s "leer" vorbelegen 
RETURN (SP)                        // Nummer des "STACK"
...
PROCEDURE      EDIT_EXIT(nThread)
LOCAL iMax
   ADEL(Stack,nThread)
   DO WHILE .T.
      iMax := LEN(Stack)
      IF iMax = 0
         EXIT
      ELSEIF Stack[iMax] = NIL
         ASIZE(Stack,LEN(Stack)-1)
      ELSE
         EXIT
      ENDIF
   ENDDO
   SP := LEN(Stack)
RETURN

PROCEDURE        EDIT_STORE(nRecno,nThread)
IF PCOUNT() = 2
   SP := nThread
   mEditRec    := nRecno       //  => Stack\[SP,18]
....

STATIC PROCEDURE ST_REPLACE(nThread)
   SP := nThread
   GOTO (mEditRec)             // => Stack\[SP,18]
*   REF2GETS(aEditcontrols)
   Gather(aEditcontrols)
   IF ( DbRLock(mEditRec) )  // => Stack\[SP,18]
...

oDlg := XbpDialog():new( AppDeskTop(),oParent, aPos, aSize, , .F.)
...
oDlg:close  := {|| ...... EDIT_EXIT(oDlg:cargo) ...}

oDlg:cargo := nThread
oDlg:create()
...
oOK := XbpPushButton():new(....)
oOK:activate := {|| ST_REPLACE(oDlg:cargo) , ;
                             PostAppEvent(xbeP_Close,,,oDlg) }
...
was du also brauchst wäre ein "Zähler" welchen ich mit dem "Fenster"
verknüpfe über oDlg:cargo.

gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Jimmy,

vergiss den ganzen Mist, den ich geschrieben habe. Ich habe vorhin 5-6x über den Quelltext geschaut und nichts, aber auch rein gar nichts entdeckt. Dann nach einer kurzen Pause, einem neuen Versuch, bei dem ich diesmal wirklich Zeile für Zeile überprüft habe, habe ich entdeckt, dass ich nicht alle Objekte ins Array geschrieben hatte. Merkwürdig kam mir auch zwischendurch die Tatsache vor, dass doch nicht alle "doppelten" Db geöffnet blieben. Spätestens danach kam mir dann der Gedanke nochmals absolut genau alles zu prüfen.

Wie singt man so schön: Leise rieselt der Kalk, ich glaube der Manfred ist alt.
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