Seite 1 von 1

Klassen und destroy

Verfasst: Do, 30. Okt 2014 15:07
von satmax
Ich habe da eine Frage, ist das Initialisieren und freigeben der Objekte so richtig?

Code: Alles auswählen

CLASS cDemo
        class VAR nDemo
        class VAR oCursFa
        class VAR oCursAu
        CLASS VAR oConnection
exported:
        class method init
        class METHOD destroy

endclass

// Initilaisiert
class method cDemo:init()
	::oConnection := obdConnect()
	::oCursFa:= SQLSelect():new("SELECT  *** Gekürzt *** )
	
	
  ::oCursAu:= SQLSelect():new("SELECT  *** Gekürzt *** )

RETURN self

class method cDemo:destroy()
	::oCursFa:destroy()
	::oCursAu:destroy()
	::oConnection:destroy()
	::nDemo:=nil        // Muss eine einfache Var überhaupt freigegeben werden
    
RETURN self

Erstellen dann mit (wobei das stimmen müsste sonst würde die Klasse nicht funktionieren):

Code: Alles auswählen

oWasAuchImmer:=cDemo():new() 
Objekt freigeben mit :

Code: Alles auswählen

oWasAuchImmer:=cDemo():destroy() 

Re: Klassen und destroy

Verfasst: Do, 30. Okt 2014 15:25
von georg
Hallo, Markus -


ja, vorausgesetzt, dass jede der verwendeten Klassen auch eine Methode :destroy() kennt.

Wobei die Laufzeitumgebung selbstätig aufräumt, wenn Objekte nicht mehr referenziert werden. Auf der anderen Seite sollte man z.B. Verbindungen zu Servern beenden, sobald klar ist, dass sie nicht mehr verwendet werden.

Re: Klassen und destroy

Verfasst: Do, 30. Okt 2014 15:28
von brandelh
Bist du dir dem Unterschied zwischen METHOD und CLASS METHOD bewußt ?

Ich habe nie sie viele CLASS METHODs und CLASS VARs benutzt ;-)

Re: Klassen und destroy

Verfasst: Do, 30. Okt 2014 15:57
von satmax
brandelh hat geschrieben:Bist du dir dem Unterschied zwischen METHOD und CLASS METHOD bewußt ?

Ich habe nie sie viele CLASS METHODs und CLASS VARs benutzt ;-)

CLASS VAR und CLASS METHOD sind nur intern von der Klasse aus zugänglich, oder?

Das ist nur ein Auszug aus eienr Klasse. Ich habe da noch mehrer Methoden drinnen:
METHOD getWert1()
..
METHOD getSumme()
mit denen lese ich die gewünschten Werte. Von außen greife ich dann zum Beispiel via
oSay:setCaption(oDemo:getSumme())
auf meine gewünschten Werte zu.

Re: Klassen und destroy

Verfasst: Do, 30. Okt 2014 19:12
von brandelh
Nein, die SICHTBARKEIT wird durch diese geregelt:

Code: Alles auswählen

HIDDEN:    Nur im Programmcode von Methoden dieser Klasse sichtbar               
PROTECTED: Auch im Programmcode von Methoden der Subklassen sichtbar              
EXPORTED:  Im gesamten Programmcode sichtbar (Global sichtbar) 
Eine CLASS VAR bzw. CLASS METHOD wird nur einmalig ausgeführt und ist im Inhalt für alle Objekte gleich.
Dafür gibt es sinnvolle Aufgaben, aber meist will man genau das Gegenteil, nämlich eigene Variablen je Objekt.

Re: Klassen und destroy

Verfasst: Do, 30. Okt 2014 20:10
von satmax
brandelh hat geschrieben: Eine CLASS VAR bzw. CLASS METHOD wird nur einmalig ausgeführt und ist im Inhalt für alle Objekte gleich.
Dafür gibt es sinnvolle Aufgaben, aber meist will man genau das Gegenteil, nämlich eigene Variablen je Objekt.
Das hatte ich so nicht gewusst, danke. Nur um ganz klar zu sehen, ist das auch Thread übergreifend so?

Ich habe jetzt meine Klasse auf
CLASS cDemo

HIDDEN:
METHOD init
VAR ....
...
EXPORTED:
METHOD destroy
METHOD readSqlData()
METHOD getBlaBla()
endclass
mal sehen, das würde einen sehr lästigen Programmfehler erklären... Wird morgen aufkommen.

Re: Klassen und destroy

Verfasst: Do, 30. Okt 2014 20:22
von AUGE_OHR
hi

wie Hubert schon sagte ist die Art wie du eine Class verwendest für Xbase++ eher ungewöhnlich ( erinnert mich an Classy )

ich mache es meisten so

Code: Alles auswählen

CLASS MyClass [ FROM XbPart ]
   PROTECTED:
     VAR ...

   EXPORTED:
     VAR ...

INLINE METHOD Init(...)
   ...
return Self

INLINE METHOD Create(...)
   ...
return Self

INLINE METHOD Destroy()
/**************************
*
* alle activeX und DLL Pointer "lösen"
* bei activeX ( AutomationObject() ) gibt es ein o:destroy()
* bei DLL, wenn man Objecte wie Font, Brush etc. angelegt hat, mit "DeleteObject"
*
* folgende XbPart sollten explizit "o:Destroy" werden
*
* XbpBitmap()
* XbpClipBoard()
* XbpFileDev()
* XbpFont()
* XbpMetaFile()
* XbpPrinter()
* XbpPresSpace()
*
**************************/
return Self

ENDCLASS

Re: Klassen und destroy

Verfasst: Fr, 31. Okt 2014 7:52
von satmax
Eine einfache Variable muss ich aber nicht auf nil setzen:

Code: Alles auswählen

::nDemo:=nil  
Kann ich mir beim :destroy() sparen, oder?

Re: Klassen und destroy

Verfasst: Fr, 31. Okt 2014 13:30
von brandelh
ja normale Variablen brauchen keine NIL Zuweisung und somit braucht eine einfache Klasse kein destroy()

ABER die INIT() muss EXPORTED sein, da sie von außerhalb der Klasse aufgerufen wird ...

o := MyClass():new() => die INIT METHODE aufruft.

oKlassenObjekt := MyClass() // jetzt wurde die CLASS INIT abgearbeitet und alle CLASS VARs angelegt !

o := oKlassenObjekt:new() // hier wird ein Objekt der Klasse MyClass angelegt.
o := MyClass():new() // hier wird ein Objekt der Klasse MyClass angelegt, die Aufrufe sind also normalerweise identisch.

die Aufteilung macht z.B. Sinn, wenn man eine CLASS VAR ändern möchte bevor die Objekte gebildet werden.
Das ist aber sehr selten nötig, daher fällt mir aktuell kein Beispiel ein ;-)

oKlassenObjekt := MyClass() // jetzt wurde die CLASS INIT abgearbeitet und alle CLASS VARs angelegt !
oKlassenObjekt:SuperWichtigClassVar := Irgendwas
o := oKlassenObjekt:new() // hier wird ein Objekt der Klasse MyClass angelegt.

Re: Klassen und destroy

Verfasst: Fr, 31. Okt 2014 14:14
von satmax
Da muss ich jetzt nochmals nachhaken, bei mir funktioniert:

oDlg:oDemoCalc:=cDemoErtrag():new()


obwohl die METHOD init unter HIDDEN: deklariert ist.


Im Übrigen nochmals ein herzliches Dankeschön für Deine und auch all die anderen für Eure tolle Unterstützung! Ich weiß nicht was ich ohne Xbaseforum gemacht hätte.

Ich habe am Montag den ersten Kunden von Clipper auf Xbase++ V2 umgestellt, Full GUI, nur mehr SQL Datenbank, alle wichtigen Programmteile in einem eigenen Thread. Dieser (Klassen) Fehler war mein größtes Sorgenkind und brachte das Programm pro User 1-3x pro Tag zum Absturz. Heute bis jetzt kein einziger Programmfehler mehr (10-12 User, 50-70 Aufträge pro Tag). :D

Alle Daten aus der DOS-Version wurden übernommen (ca. 200000 Aufträge,...) In Summe sind es aktuell ca. 6 GB an Daten. Ich sag nur, NIE wieder ohne SQL. :!: Die SQL DB ist mit verschiedenen Triggern abgesichert (Kunde kann nicht gelöscht werden wenn es einen Auftrag gibt, Rechnungs- Auftragsnummern werden via Trigger hochgezählt, uvam.)

Mein System:
Xbase++ V2
TopDown
SQLExpress
List&Label

Wobei die letzten 3 Wochen gings fast rund um die Uhr...