Klassen und destroy

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

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Klassen und destroy

Beitrag 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() 
Gruß
Markus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Klassen und destroy

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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:

Re: Klassen und destroy

Beitrag 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 ;-)
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Klassen und destroy

Beitrag 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.
Gruß
Markus
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:

Re: Klassen und destroy

Beitrag 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.
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Klassen und destroy

Beitrag 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.
Gruß
Markus
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

Re: Klassen und destroy

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Klassen und destroy

Beitrag 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?
Gruß
Markus
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:

Re: Klassen und destroy

Beitrag 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.
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Klassen und destroy

Beitrag 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...
Gruß
Markus
Antworten