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):
Objekt freigeben mit :
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:
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).
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...