einmalige Variable in Superklasse [ERLEDIGT]

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

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,
Manfred hat geschrieben: Mit Deiner Oberklasse habe ich aber noch Verständnisschwierigkeiten.
Hilf mir bitte kurz auf die Sprünge, wie das auszusehen hat.
also, angenommen deine Class währe ein Pushbutton und du will mehrere
davon "zusammen" haben. Statt also für jeden Pushbutton ein :Create()
machst du das der Methode :MyAdd()

Code: Alles auswählen

CLASS MyClass
EXPORTED:
   VAR aDBF
ENDCASE

Methode myClass:init(oP,oO,aPos,aSize,aPP,lvisible,aCargo)
    :: aDBF := {}
RETURN self
...
Methode myClass:MyAdd(oP,oO,aPos,aSize,aPP,lvisible,aCargo)
LOCAL oXbp
    DEFAULT oP TO SetAppWindow()
...
    oXbp := XbpPushbutton():New(oP,oO,aPos,aSize,aPP,lvisible)
    //
    // other setting using aCargo[x]
    //  
    ...
    oXbp:create()

    AADD(::aDBF, oXbp) 
RETURN self
gruss by OHR
Jimmy
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Beitrag von hschmidt »

Hallo Manfred, Jimmy,

meiner Meinung nach ist für die Lösung dieses Problems keine neue Oberklasse erforderlich, denn die gibt es doch schon, nämlich die Datenbankklasse.
Eigentlich hatte Manfred die Lösung doch schon fertig, er hat nur nicht beachtet, dass er bei der Instanziierung einer neuen Datenbank (test - test2) jedesmal das Datenbankarray der Superklasse leer gemacht hat.
Wenn er die Codezeile, die ich bereits in meiner letzten Post geschrieben habe (und die Hubert später nochmal wiederholt hat) einfügt, sollte damit alles glatt gehen!

Code: Alles auswählen

METHOD CLASS datenbank:initclass() 
if aDB == NIL 
             ::aDb := {} 
endif    
RETURN self 
Dass Du natürlich noch eine Methode brauchst um die Instanz in dein DB-Array zu bekommen ist doch klar, aber da steht ja nicht viel mehr drin als:

Code: Alles auswählen

aadd(::adb, self)
Hubert hatte das auch schon in seinem letzten Posting beschrieben (CLASS METHOD AddDBF......)

Hans
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,

ich habe jetzt keine Ahnung, wie ich das erklären soll, aber das klappt auch nicht.

also ich definiere eine CLASS Var aDb und eine Class METHOD initclass in meiner Datenbankklasse, von der alle weiteren Klassen erben.

Bis hierhin sind wir alle einer Meinung!?

hier jetzt einmal in gekürzter Form was jetzt abläuft:

Code: Alles auswählen

class datenbank
        class var aDb
        class method initclass
 
        method oeffne_datenbank
endclass
***************
class method datenbank:initclass()
        if ::aDb == NIL
           ::aDb := {}
        endif
return self 
**********
method datenbank:oeffne_datenbank()
            Datenbank wird geöffnet
            AaDD(::adB,self)
return self
**********
**********
class test from datenbank
endclass
**********
class test2 from datenbank
endclass
**********
class test3 from datenbank
endclass
**********
procedure main
                oObjekt1 := test():new()
                oObjekt2 := test():new()
                oObjekt3 := test():new()
                oObjekt4 := test2():new()
                oObjekt5 := test3():new()

                oObjekt1:oeffne_datenbank() <-- hier wird TEST neu in aDb gelegt
                oObjekt2:oeffne_datenbank() <-- hier wird TEST hinzu gelegt in aDb
                oObjekt3:oeffne_datenbank() <-- hier wird TEST hinzugelegt in aDb
                oObjekt4:oeffne_datenbank() <-- hier wird TEST2 neu in aDb gelegt
                oObjekt5:oeffne_datenbank() <-- hier wird TEST 3 neu in aDb gelegt.
return
in oObjekt1-3 stehen die 3 Objekte Test addiert in aDb
in oObjekt4 steht nur Objekt Test2 in aDb
in oObjekt5 steht nur Objekt Test3 in aDb

Ich möchte aber, dass ALLE in EINEM aDb stehen.

PS: Im Falle oObjekt1-3 wird die Abfrage, ob ::aDb == NIL ist nicht gebraucht. Da greift die einmalige Initialisierung über die INITCLASS.
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!!
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Beitrag von hschmidt »

Hallo Manfred,

jetzt verstehe ich Dein Problem. Ich war davon ausgegangen, dass Du auch ein Objekt vom Typ Datenbank instanziiert und darin dann das oDB-Array führst.
Etwa so:

Code: Alles auswählen

class datenbank 
        class var aDb 
        class method initclass 
  
        method oeffne_datenbank 
endclass 
*************** 
class method datenbank:initclass() 
        if ::aDb == NIL 
           ::aDb := {} 
        endif 
return self 
********** 
method datenbank:AddDatenbank(oDB) 
            AaDD(::adB,oDB) 
return self 
********** 
********** 
class test from datenbank 
endclass 
********** 
class test2 from datenbank 
endclass 
********** 
class test3 from datenbank 
endclass 
********** 
procedure main 
                oDatenbank := datenbank():new
                oObjekt1 := test():new() 
                oDatenbank:AddDatenbank(oObjekt1) 

                oObjekt2 := test():new() 
                oDatenbank:AddDatenbank(oObjekt2) 

                oObjekt3 := test():new() 
                oDatenbank:AddDatenbank(oObjekt3) 

                oObjekt4 := test2():new() 
                oDatenbank:AddDatenbank(oObjekt4) 

                oObjekt5 := test3():new() 
                oDatenbank:AddDatenbank(oObjekt5) 

return 
Viel Erfolg!

Hans
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 Hans,

das ist genau das, was ich jetzt habe. Nach jeder Instanzbildung die Hinzufügung ins Array. Meine Idee ist es dass automatisch mit jedem Öffnen einer Datenbank über die Methode oeffne_datenbank() aus der Klasse datenbank zu machen. Ich möchte mir eigentlich Quellcode sparen und sicher sein, dass das Objekt in aDb geschrieben wird. Jetzt muß ich immer darauf achten, dass ich jedesmal ein Add() in das aDb Array von Hand mache. Es geht mir nur um die Vereinfachung.
Öffnen muß ich jede DB einzeln. Da ich noch die Möglichkeit habe nach Wunsch die Objekte in aDb aufzunehmen, kann ich mit einer Ersatzfunktion (MyDbcloseall()) "alle" Db auf einmal schließen, (die in dem Array aDb stehen), die ich in dem Fall geschlossen haben möchte und habe trotzdem noch die auf, die offen bleiben müssen. Da ist bei größerer Anzahl Db sehr vorteilhaft.
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!!
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Beitrag von hschmidt »

Hallo Manfred,

ich verstehe...
Habe mir nochmal die Doku von ClASS VAR angeschaut: mit der Option SHARED solltest Du eigentlich genau das (mit Deinem ursprünglichem Code) erreichen:
SHARED

Die Option SHARED bewirkt, daß der Wert bzw. Inhalt einer Klassenvariable auch in zukünftigen Subklassen bekannt ist. Ohne diese Option bekommen Subklassen standardmäßig eigene Klassenvariablen mit dem Namen <VarName> bzw. <MessageName> und verwalten darin eigene Werte. Der Wert einer SHARED Klassenvariable existiert dagegen nur einmal für die deklarierte Klasse und all ihre zukünftigen Subklassen. Die Optionen SHARED und ASSIGNMENT HIDDEN schließen sich gegenseitig aus, da SHARED eine Klassenvariable zur gemeinsamen Nutzung für Subklassen freigibt, ASSIGNMENT HIDDEN das Zuweisungsrecht aber auf die deklarierte Objektklasse begrenzt.
Versuch das mal!

Hans
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,

habe ich gemacht, aber mit dem Weg, wie er oben von mir beschrieben ist, wird NIL hinzugeschrieben. Also muß noch irgendwas beachtet werden, aber was? :dontknow:
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: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Manfred,

meinst du dass aDB so aussieht:

{ oTest1, oTest2, oTest3, NIL, NIL }

oder so

{ NIL, NIL, NIL, NIL, NIL } ?
Gruß
Hubert
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 Hubert,

es steht drin:

{NIL, NIL, NIL,.....,test3,test2,test1}

also nur die, die von der gleichen Klasse erben. Oder eben die Erste Instanz, die generell gebildet wird.
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: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

ersetzt man das additem(self) mit additem("Eindeutiger Text").

Damit kannst du prüfen, ob die Variable bzw. deren Inhalt von den unteren Klassen tatsächlich oben gespeichert wird.
Gruß
Hubert
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 Hubert,

nee, mache ich nicht. Ich bin mal wieder überschnell gewesen.

Ich schreibe das Objekt in aDb wenn die DB geöffnet wird mit Aadd(aDb) und wenn die Db geschlossen wird, dann mache ich Adel(aDb) usw. Leider habe ich aber die Anleitung nicht tief genug durchgelesen. In der steht nämlich, dass nach einem Adel() ein Asize() folgen muß. Das hatte ich nicht beachtet. Da ich aber nur die ersten 4 DB geprüft hatte, die auch direkt wieder geschlossen werden, habe ich natürlich jedesmal ein NIL mehr im Array gehabt. Deine Frage, was denn nun genau im aDb steht, hat mich darauf gebracht generell mal nachzuschauen und ALLE DB zu öffnen. Nun, da ist es mir aufgefallen.

Ich habe heute zum 1.Mal Adel() benutzt, sonst wäre mir das schon früher aufgefallen.

Danke, dass ihr mal wieder so viel Ausdauer gezeigt habt. :?
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: 16509
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 heute zum 1.Mal Adel() benutzt, sonst wäre mir das schon früher aufgefallen.
kennst Du nicht den Spruch: Adel verpflichtet :?:

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

Beitrag von Manfred »

:lol: :occasion5:

der war gut....

Jetzt ergibt der Spruch auch einen Sinn.
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: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Manfred,

adel()
asize()

als Kombination sollte man nicht mehr verwenden, dafür gibt es nun

aRemove()

solange man nur einen Thread hat (und sonst meist auch), ist das Verhalten zwar gleich (aber 2 Aufrufe), sobald man aber mal das Pech hat, dass das Programm richtig arbeiten muss und ein Thread nach aDel() und vor aSize() dazwischen funkt, wundert man sich warum eine DBF als NIL ausgewiesen wird ;-)
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
guter Einwurf :!: :thumbright:

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

Beitrag von Manfred »

Hi Hubert,

jou, wieder was dazugelernt.
Jetzt habe ich mich schon so daran gewöhnt unter "siehe auch", oder Klassenbaum nachzusehen. aRemove() habe ich noch nie gehört und deshalb auch jedesmal unter "siehe auch" übersehen.

Es gibt noch viel zu lesen.

PS: verflixt, ich glaube ich werde den Alaska Jungs mal vorschlagen, dass sie sowas farblich kennzeichnen. Genauso wie die Hinweise, dass mache Funktionen nur noch aus Kompat. Gründen drin sind und andere benutzt werden sollen.
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: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

darum lese ich immer sehr aufmerksam die Änderungen zur letzten Version und Änderungen in der Dokumentation aber dennoch geht ganz schnell was vergessen ... in diesem Falle viel mir nur ein, da gab es doch noch was ... :D
Gruß
Hubert
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,

eine Frage habe ich noch, die mich schon die ganze Zeit quält:

wenn jetzt nach und nach die Objekte in das/ein Array geschrieben werden, dann ist es ja so, dass nicht die Objektnamen, sondern die Namen der Klasse genommen werden.

Code: Alles auswählen

objekt   := test():new()
add(adb, objekt)
objekt2 := test():new()
add(adb, objekt2)
objekt3 := test():new()
add(adb, objekt3)
wenn ich mir jetzt das Array anschaue, dann steht 3x test darin. Woher weiß der Compiler denn jetzt, welches Test ich meine?

Oder sehe ich nur den Namen, das Array weiß aber die Speicheradresse des Objektes? Das habe ich nämlich überhaupt noch nicht verstanden. Genauso bei Pushbutton, oder SLe oder was weiß ich.

Klappt dann sowas überhaupt?

Code: Alles auswählen

nElement := AScan(::aDb, self)
IF nElement > 0
    ARemove(::adb, nElement)
ENDIF
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: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

im Array ist das bzw. sind die Objekte als solche gespeichert.
Sonst würde aDB[x]:eineMethode() ja nicht funktionieren!

Nur der Debugger bzw. Var2Char(oO) gibt den Namen der Basisklasse etc. aus, damit man was sehen kann.
Gruß
Hubert
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,

ich merke schon, es fehlen noch Grundlagen. Aaaaber, ich habe schon etliches in den letzten Wochen und Monaten klären können.

Ich komme immer wieder zum alten Thema zurück:

Irgendwie die Anleitung von Xbase++ verbessern.

Es gibt so viele Funktionen usw. von denen ich z.B. gar nicht weiß wozu man die benutzen kann. Deshalb überlese ich sie auch so schnell. Erst wenn man, wie jetzt wieder zu sehen war, ein Anwendungsgebiet gezeigt bekommt, dann kann man darauf wieder aufbauen.
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: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

noch ein Problem. Wenn ich jetzt das Array mit Objekten gefüllt habe, dann würde ich es gerne sortieren, damit man im Debugger eine bessere Übersicht hat. Das geht aber nicht einfach über

Code: Alles auswählen

 ASort(::adB,,, {|a,b| a >b}) 
Da gibt es eine Fehlermeldung. [/code]
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,
Manfred hat geschrieben:

Code: Alles auswählen

 ASort(::adB,,, {|a,b| a >b}) 
Da gibt es eine Fehlermeldung. [/code]
Yup ... wie wäre es mit

Code: Alles auswählen

   aDebug := ASort(::adB,,, {|x| x[1] > x[2] })
... allerdings solltest du nur das sortierte Resultat in eine Var nehmen
den sonst "könnten" deine ASCAN() nicht mehr stimmen ...
Manfred hat geschrieben: wenn ich mir jetzt das Array anschaue, dann steht 3x test darin. Woher weiß der Compiler denn jetzt, welches Test ich meine?
grundsätzlich könntest du bei AADD() statt einem Wert auch mehrere in
einem Array aufnehmen und zusätzliche Informationen wie einen "Zähler"
darin ablegen. Bei XbParts nehme ich dazu meisten das :getHWND().

Wenn man in einem Array das letzte Element ADEL() dann ändert sich
an der Reihenfolge "davor" ja nichts, aber wie machst du es wenn es
"dazwischen" ist ? nach dem ASIZE() rücken ja alle "danach" auf und wie
weist du dann "beim nächsten" wer/was gemeint ist ?

hier mal ein Beispiel wie ich das "richtige" Thread Fenster "suche"

Code: Alles auswählen

nPosi   := ASCAN( aThread, {|x| x[ID_REC] == nSeekRec .AND.;
                                x[ID_WHO] == "LIEFER" } )
IF nPosi > 0
   setappFocus( aThread[nPosi][ID_OBJ] )
Das alles würde ich aber, wie schon gesagt, nicht in deiner "existierenden"
Class machen und die "aufblähen". IHMO sollte eine Class "klein" sein.

Der Begriff "Ober Class" ist mich eigendlich falsch den ich will ja die Eigen-
schaften meiner Class nutzen + neue Egenschaften. Genau das wäre OOP
das vererben von Eigenschaften an dier "Kinder".
Somit gilt, zuminderst für die OOP Programmierung, das man in die
"Kinder" investieren sollte und nicht die "Eltern" noch "fett"er machen sollte.
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,

das mit dem Asort hat sich erledigt. In der VX gibt es ja das View Fenster und da ist, wie ich gestern bemerkt habe das Array sortiert drin zu sehen.

Aber das mit der Class klein halten würde doch dann bedeuten, dass es z.B. mehrere Superklassen gibt, die dann die einzelnen Aufgaben übernehmen, von denen dann meine sogenannte Datenbankklasse erbt, die dann wiederum an die Klassen, die einzelne Datenbanken darstellen, weitervererbt. Also eigentlich so, wie es immer schon war: So viel wie möglich in UDF auslagern, die dann aufgerufen werden.
Oder meinst Du das anders?
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: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

wie soll aSort ein Objekt mit einem anderen nach der Größe sortieren ?
Welches DB Objekt ist denn größer ? Immer daran denken, nur weil der Debugger Text zeigt ist es noch lange keiner, aber du könntest eventuell eine Instanzvariable oder Methode fürs Sortieren benutzen (ich nehme jetzt mal ::className()):

Code: Alles auswählen

ASort(::adB,,, {|a,b| a:className() < b:className() }) 
ich habe es nicht probiert, aber warum sollte es nicht gehen :-)

@Manfreds Beispiel:

Code: Alles auswählen

ASort(::adB,,, {|a,b| a >b}) 
dein > sortiert Z zuerst, wolltest du das ? Standard ist < ;-)
Ob a[1] > b[1] oder a > b kommt darauf an, ob es ein ein- oder mehrdimensionales Array ist und was genau man vergleichen will. Nochmals zur Verdeutlichung dieses Punktes:

Was ist größer ?

{ {"A","B","C"}, {"A","B","C","E"} } -> {"A","B","C"} > {"A","B","C","E"} ...
Ich weiß nicht ob Xbase++ nun die Anzahl der Elemente oder den Wert des ersten Elementes vergleicht, aber diese Entscheidung muss sowieso der Entwickler treffen !!!!

@Jimmys Beispiel:

Code: Alles auswählen

ASort(::adB,,, {|x| x[1] > x[2] }) 
bei aSort werden 2 Parameter übergeben und es macht aus meiner Sicht keinen Sinn x[1] mit x[2] zu vergleichen.

Ich selbst habe auch immer Probleme mit der Syntax von aSort und aScan (ich vermute die hast du in der Eile verwurstelt...), da beide einmal den Codeblock als letzter bzw. als zweiter Parameter brauchen und ich es auch so selten brauche, dass ich jedesmal in der Onlinehilfe nachsehe und das passende Beispiel kopiere ;-)
Gruß
Hubert
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,
brandelh hat geschrieben: @Jimmys Beispiel:

Code: Alles auswählen

ASort(::adB,,, {|x| x[1] > x[2] }) 
bei aSort werden 2 Parameter übergeben und es macht aus meiner Sicht keinen Sinn x[1] mit x[2] zu vergleichen.
Yup hast recht müsste :

Code: Alles auswählen

ASort(::adB,,, {|x,y| x[1] < y[1] }) 
sein
gruss by OHR
Jimmy
Antworten