Aktuelle Zeit: 09.12.2019 06:20

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 54 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5, 6  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: Modul BaseClass (Modul als Objekt programmieren)
BeitragVerfasst: 10.01.2016 22:54 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Ohne UnuseModule könnte man bei Vererbung nicht die gleiche Funktion New() verwenden, da sie schon bereit in der gerbten Klasse definiert wurde, aber nicht gebraucht wird.

Man könnte auch es so schreiben
Code:
DeclareModule Adress
 
  ;UseModule User
 
  Structure sAdress Extends User::sUser
    street.s
    postal.i
    city.s
    country.s
  EndStructure
 
  Interface iAdress Extends User::iUser
    SetAdress(street.s, postal.i, city.s, country.s)
    GetStreet.s()
    GetPostal.i()
    GetCity.s()
    GetCountry.s()
    GetAll.s()
  EndInterface
 
  ;UnuseModule User
 
  Declare New()
 
EndDeclareModule

Halte mich ja an die Syntaxregeln von PB :wink:

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul BaseClass (Modul als Objekt)
BeitragVerfasst: 24.01.2016 16:59 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Update v1.16
- Code optimiert
- Debugger erweitert
:wink:

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul BaseClass (Modul als Objekt)
BeitragVerfasst: 25.01.2016 14:36 
Offline
Benutzeravatar

Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg
Besten Dank fürs updaten. :allright:

_________________
"Never run a changing system!"
PB 5.71 x64, OS: Windows 7 Pro x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Ich bin Baujahr 1968, also aktuell 51.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul BaseClass (Modul als Objekt)
BeitragVerfasst: 06.05.2016 15:44 
Offline
Benutzeravatar

Registriert: 11.08.2005 19:08
Code wird zum CodeArchiv unter OOP/HandleModulesAsObjects.pbi hinzugefügt.

_________________
Bild
Warum OpenSource eine Lizenz haben sollte
PureBasic-CodeArchiv-Rebirth: Git-Repository / Download -- Jede Hilfe ist willkommen!
Manjaro Xfce x64 (Hauptsystem) :: WindowsXP/Xubuntu x86 (VirtualBox) :: PureBasic (Linux: x86/x64, Windows: x86) :: jeweils neueste Version


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul BaseClass (Modul als Objekt)
BeitragVerfasst: 15.08.2016 14:30 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Update v1.21
- Geändert: NewClass(Extends=BaseClass) -> NewClass(CLassInterface, ClassExtends=BaseClass)
* Erster Parameter wird jetzt der Name des Interface angegeben.
+ Vorteil: Es muss nicht mehr auf die Reihenfolge von den Methoden geachtet werden.
+ CheckInterface kann das Interface besser kontrollieren.

- Debugger Funktion ShowClasses hinzugefügt
* Zeigt alles angelegten Interfaces an

:wink:

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul BaseClass (Modul als Objekt)
BeitragVerfasst: 16.08.2016 13:35 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Update v1.22
- Code aufgeräumt

Ist wohl der kleinste Code um einfach OOP in Purebasic zu verwenden ohne eine neue Syntax zu entwickeln :wink:

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul BaseClass (Modul als Objekt)
BeitragVerfasst: 16.08.2016 20:10 
Offline
Benutzeravatar

Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg
Besten Dank, mk-soft. :allright:
Habe die Includes auf meiner Platte aktualisiert.

_________________
"Never run a changing system!"
PB 5.71 x64, OS: Windows 7 Pro x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Ich bin Baujahr 1968, also aktuell 51.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul BaseClass (Modul als Objekt)
BeitragVerfasst: 17.08.2016 15:45 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Beispiel 8 Update
Objekt im Objekt verwenden.

Kurze Beschreibung:
Verwendung des Objekt "Fields" innerhalb des Objekte "MyList" mit Rückgabe das Objekt "Fields"
Abruf der Liste als Objektliste "iRows" von Type von Objekt "Fields".

P.S. Etwas vereinfacht
Code:
;-TOP

; Example 8

IncludeFile "Modul_BaseClassSmall.pb"

DeclareModule Fields
  UseModule BaseClass
 
  Structure sFields Extends sBaseClass
    text.s
    delimeter.s
    count.i
  EndStructure
 
  Interface iFields Extends iBaseClass
    Text.s()
    Field.s(index)
    Count()
  EndInterface
 
  UnuseModule BaseClass
 
  Declare New(text.s, delimiter.s=";")
 
EndDeclareModule

Module Fields
 
  UseModule BaseClass
 
  NewClass(iFields)
 
  ; -----------------------------------------------------------------------------------
 
  Procedure New(text.s, delimiter.s=";")
    Protected *object.sFields
    AllocateObject(*object, sFields)
    With *object
      \text = text
      \delimeter = delimiter
      \count = CountString(text, delimiter) + 1
    EndWith
    InitializeObject(*object)
    ProcedureReturn *object
  EndProcedure
 
  ; -----------------------------------------------------------------------------------
 
  Procedure.s Text(*this.sFields)
    With *this
      ProcedureReturn \text
    EndWith
  EndProcedure : AsMethode(Text)
   
  ; -----------------------------------------------------------------------------------
 
  Procedure.s Field(*this.sFields, index)
    With *this
      ProcedureReturn StringField(\text, index, \delimeter)
    EndWith
  EndProcedure : AsMethode(Field)
   
  ; -----------------------------------------------------------------------------------
 
  Procedure Count(*this.sFields)
    With *this
      ProcedureReturn \count
    EndWith
  EndProcedure : AsMethode(Count)
 
  ; -----------------------------------------------------------------------------------
 
  CheckInterface() 
 
EndModule

; ***************************************************************************************

DeclareModule MyList
 
  UseModule BaseClass
 
  Structure sMyList Extends sBaseClass
    List Rows.Fields::iFields()
  EndStructure
 
  Interface iMyList Extends iBaseClass
    Add(text.s, delimeter.s=";")
    First()
    Prev()
    Nxt()
    Last()
    Del()
    GetList()
  EndInterface
 
  ; Erweitere Interfaces veröffendlichen
  Interface iRow Extends Fields::iFields
  EndInterface
 
  Structure iRows
    List Rows.Fields::iFields()
  EndStructure
 
  UnuseModule BaseClass
 
  Declare New()
 
EndDeclareModule

Module MyList
 
  UseModule BaseClass
 
  NewClass(iMyList)
 
  ; -----------------------------------------------------------------------------------
 
  Procedure New()
    InitObject(sMyList)
  EndProcedure
 
  ; -----------------------------------------------------------------------------------
 
  Procedure Add(*this.sMyList, text.s, delimeter.s=";") ; Result - Object of type Fields
    With *this
      LastElement(\Rows())
      AddElement(\Rows())
      \Rows() = Fields::New(text, delimeter)
      ProcedureReturn \Rows()
    EndWith
  EndProcedure : AsMethode(Add)
 
  ; -----------------------------------------------------------------------------------
 
  Procedure First(*this.sMyList) ; Result - Object of type Fields
    With *this
      FirstElement(\Rows())
      ProcedureReturn \Rows()
    EndWith
  EndProcedure : AsMethode(First)
 
  ; -----------------------------------------------------------------------------------
 
  Procedure Prev(*this.sMyList) ; Result - Object of type Fields
    With *this
      PreviousElement(\Rows())
      ProcedureReturn \Rows()
    EndWith
  EndProcedure : AsMethode(Prev)
 
  ; -----------------------------------------------------------------------------------
 
  Procedure Nxt(*this.sMyList) ; Result - Object of type Fields
    With *this
      NextElement(\Rows())
      ProcedureReturn \Rows()
    EndWith
  EndProcedure : AsMethode(Nxt)
 
  ; -----------------------------------------------------------------------------------
 
  Procedure Last(*this.sMyList) ; Result - Object of type Fields
    With *this
      LastElement(\Rows())
      ProcedureReturn \Rows()
    EndWith
  EndProcedure : AsMethode(Last)
 
  ; -----------------------------------------------------------------------------------
 
  Procedure Del(*this.sMyList) ; Result - Object of type Fields
    With *this
      \Rows()\Release()
      DeleteElement(\Rows())
      ProcedureReturn \Rows()
    EndWith
  EndProcedure : AsMethode(Del)
 
  ; -----------------------------------------------------------------------------------
 
  Procedure GetList(*this.sMyList) ; Result - List of Object of type Rows\Fields
    With *this
      ProcedureReturn *this + OffsetOf(sMyList\Rows)
    EndWith
  EndProcedure : AsMethode(GetList)
 
  ; -----------------------------------------------------------------------------------
 
  Procedure Dispose(*this.sMyList)
    With *this
      ForEach \Rows()
        \Rows()\Release()
      Next
    EndWith
  EndProcedure : AsDisposeObject(Dispose)
 
  ; -----------------------------------------------------------------------------------
 
  CheckInterface()
 
EndModule

; ***************************************************************************************

;-Test

Define text.s, index

Debug "Objekte definieren"
Define *obj.MyList::iMyList
Define *row.MyList::iRow
Define *list.MyList::iRows

Debug "Daten einlesen"
*obj = MyList::New()
Restore Strings
Read.s text
*row = *obj\Add(text)
Debug *row\Text()

Read.s text
*row = *obj\Add(text)
Debug *row\Text()

Read.s text
*row = *obj\Add(text, ",")
Debug *row\Text()

Debug "Daten ausgeben"
*List = *obj\GetList()
ForEach *list\Rows()
  Debug "------------------------------"
  For index = 1 To *list\Rows()\Count()
    Debug *List\Rows()\Field(index)
  Next
Next

*obj\Release()

DataSection
  Strings:
  Data.s "Sonntag;Montag;Dienstag;Mitwoch;Donnerstag;Freitag;Samstag"
  Data.s "Januar;Februar;März;April;Mai;Juni;Juli;August;Septemper;Oktober;November;Dezember"
  Data.s "Eins,Zwei,Drei,Vier,Fünf,Sechs,Sieben"
EndDataSection

:wink:

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Zuletzt geändert von mk-soft am 04.05.2019 14:45, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul BaseClass (Modul als Objekt)
BeitragVerfasst: 14.09.2016 17:02 
Offline
Benutzeravatar

Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg
Hallo mk-soft,

eine kurze Frage. Für welchen realen Anwendungsfall würde man AddRef() benutzen?

Und was mir auffällt: In den Klassen/Modulen die auf der Basisklasse basieren (also in den von Dir geposteten Beispielen) fehlt jeweils das letze "UnuseModule BaseClass". Es müsste zwar theoretisch ganz ans Ende, aber evtl. ist ein "UnuseModule" auch unnötig, wenn es sich auf ein weiteres Modul bezieht, an dessen Beginn ein "UseModule BaseClass" steht. Hast Du es einfach nur vergessen oder kann man das in der Tat weglassen?

Edit: Die letzte Frage hat sich beantwortet - sie war auch etwas übereilt gestellt. Da es hier lediglich um die Bekanntmachung (UseModule) und Nicht-Bekanntmachung (UnUseModule) der Elemente eines anderen Moduls geht, kann man UnUseModule wohl gefahrlos weglassen, wenn die Bekanntmachung bis an das Ende des Quellcodes gelten soll.
"Verwirrung" und "immer wieder neues Einarbeiten" ist der Tribut den ich als zum "Multitasking verdammter" Arbeitnehmer zu zahlen habe.

Gruß Kurzer

_________________
"Never run a changing system!"
PB 5.71 x64, OS: Windows 7 Pro x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Ich bin Baujahr 1968, also aktuell 51.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul BaseClass (Modul als Objekt)
BeitragVerfasst: 16.09.2016 17:14 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Bin wieder Zuhause <)

AddRef kann man dazu verwenden wenn ein Objekt von verschiedenen Seiten (Dialoge, Threads, etc) gleichzeitig benutzt wird.
Damit erreicht man das ein Objekt erst freigeben wird, wenn keiner mehr das Objekt benötigt.

:wink:

P.S. Mal ein Beispiel mit 200 Threads

Update
Code:
;-TOP

; Example 9

CompilerIf #PB_Compiler_Thread = 0
  CompilerError "Use compiler option theadsafe"
CompilerEndIf

IncludeFile "Modul_BaseClassSmall.pb"

DeclareModule Work

  UseModule BaseClass
 
  Structure sWork Extends sBaseClass
    Value.i
  EndStructure
 
  Interface iWork Extends iBaseClass
    Add(Value)
    Sub(Value)
  EndInterface
 
  Declare New()
 
EndDeclareModule

Module Work
 
  UseModule BaseClass
 
  NewClass(iWork)
 
  ; ---------------------------------------------------------------------------
 
  Procedure Init(*this.sWork)
    Debug "Initialize Work"
  EndProcedure : AsInitializeObject(Init)
 
  ; ---------------------------------------------------------------------------
 
  Procedure Destroy(*this.sWork)
    Debug "Dispose Work"
    Debug "Result: " + *this\Value
  EndProcedure : AsDisposeObject(Destroy)
 
  ; ---------------------------------------------------------------------------
 
  Procedure Add(*this.sWork, Value)
    Protected result
    LockObject(*this)
    *this\Value + Value
    result = *this\Value
    UnlockObject(*this)
    ProcedureReturn result
  EndProcedure : AsMethode(Add)
 
  ; ---------------------------------------------------------------------------
 
  Procedure Sub(*this.sWork, Value = 0)
    Protected result
    LockObject(*this)
    *this\Value - Value
    result = *this\Value
    UnlockObject(*this)
    ProcedureReturn result
  EndProcedure : AsMethode(Sub)
 
  ; ---------------------------------------------------------------------------
 
  Procedure New()
    InitObject(sWork) ; Mehr kommt hier nicht rein!
  EndProcedure
 
  ; ---------------------------------------------------------------------------
 
  CheckInterface()
 
EndModule

; ***************************************************************************************

;-Test AddRef

Procedure thAdd(*Object.Work::iWork)
  Protected time
  *Object\AddRef()
  Delay(1000)
  ;Debug "Start"
  For i = 1 To 10
    time = Random(200)
    *Object\Add(1)
    Delay(time)
  Next
  ;Debug "Ready."
  *Object\Release()
EndProcedure

Debug "Mainscope Create Object"
Define *Object.Work::iWork
*Object = Work::New()

mutex = CreateMutex()
Debug "Start Threads"
For i = 1 To 1000
  th = CreateThread(@thAdd(), *Object)
  Delay(5)
  If th = 0
    Debug "No Thread " + i
  EndIf
Next

Debug "Mainscope Wait..."
Repeat
  Delay(200)
  ref = *Object\AddRef()
  ref = *Object\Release()
  Debug ref
  If ref = 0
    Break
  EndIf
ForEver
Debug "Mainscope Release Object"
*Object\Release()

Debug "Ready."

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Zuletzt geändert von mk-soft am 04.05.2019 14:47, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 54 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5, 6  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye