Globalsettings

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
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

Globalsettings

Beitrag von AUGE_OHR »

hi,

Code: Alles auswählen

CLASS  HX_Button FROM XbpPushButton           // FROM XbpActiveXControl
METHOD HX_Button:Activate()
METHOD HX_Button:Init(oParent, oOwner, aPos, aSize, aPP, lVisible)
   ::HX_PushButton     := XbpActiveXControl():new( oParent, oOwner, aPos, aSiz
METHOD HX_Button:Create(oParent, oOwner, aPos, aSize, aPP, lVisible)
   ::oGLobSet  := XbpActiveXControl():new(,, {0,0}, {0,0} )
   ::oImgList    := XbpActiveXControl():new(,, {0,0}, {0,0} )
das wäre der Anfang der Class

um ein "Bildchen" aus einen HX_Button zu bekommen muss ich noch 2 weiter activeX laden.
Das würde nun jeder Button machen ... und das will/brauche ich nicht den die gilt praktisch
für alle "folgenden" HX_ Class ebenfalls ...

so nun könnte ich ja eine HX_InitGlobal machen so das alle auf die Class zugreifen könnten,
aber dann müsste der User auch die Zeile HX_InitGlobal() einfügen. Das ist zwar nicht viel
aber für einen DAU schon zuviel (2 Sachen geht nicht).

also suche ich nach einer Lösung, wie ich wenn ich das erste Mal ein HX_Control aufrufe,
dieses dann "automatische" die HX_InitGlobal() aufruft ... aber nur 1 mal ...

... und ich dachte dabei NICHT an eine PUBLIC weil es evtl. Thread fähig sein müsste ...
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Globalsettings

Beitrag von brandelh »

Hi Jimmy,

ist dafür nicht die CLASS METHOD initClass vorgesehen ?
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Globalsettings

Beitrag von Martin Altmann »

Yup :!:
: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
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: Globalsettings

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: ist dafür nicht die CLASS METHOD initClass vorgesehen ?
Ja, aber das ist doch "nur" für eine Class dann gedacht.

Ich will/wollte zu jedem CJ Controll eine Class machen, also sowas wie

Code: Alles auswählen

::HX_PushButton
::HX_CheckBox
::HX_ComboBox
::HX_FlatEdit
::HX_GroupBox
::HX_ListBox
::HX_ListView
::HX_Popup
::HX_ProgressBar
::HX_RadioButton
::HX_ScrollBar
::HX_Slider
::HX_Tab
::HX_TabPage
::HX_MonthCalendar
::HX_TaskDialog
::HX_TrayIcon
::HX_TreeView
::HX_UpDown
::HX_WebBrowser
::HX_Resizer
::HX_Markup
::HX_Label
::HX_ImageManager
::HX_HexEdit
::HX_FormExtender
::HX_DateTimePicker
::HX_CommonDialog
::HX_ColorPicker

::oGLobSet
::oImgList
Alle HX_Class(en) benötigen die ::oGLobSet und alle die Icon´s haben die ::oImgList.

Wenn ich die nun alle in einer Class hätte, dann könnte ich CLASS METHOD initClass verwenden,
aber dann wird das PRG "so gross". Also würde ich es gerne in je ein *.PRG schreiben.

Also doch eine HX_InitGlob() am Anfang schreiben ..., oder ?
gruss by OHR
Jimmy
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: Globalsettings

Beitrag von AUGE_OHR »

brandelh hat geschrieben:CLASS METHOD initClass ???

Code: Alles auswählen

::oInitGlob := HX_InitGlob():new()
::oInitGlob:initActiveX()


CLASS HX_InitGlob
   EXPORTED:
   CLASS VAR oGlobalSettings
   CLASS METHOD initClass()

   METHOD initActiveX()
   VAR oImageManagerIcons
ENDCLASS

CLASS METHOD HX_InitGlob:initClass()
   IF NIL == ::oGlobalSettings
        ::oGlobalSettings := 
CreateObject("Codejock.SuiteControlsGlobalSet
       ::oGlobalSettings:Office2007Images := "c:\Programme\Codejock...
   ENDIF
RETURN self

METHOD HX_InitGlob:initActiveX()
   IF NIL == ::oImageManagerIcons
      ::oImageManagerIcons    := XbpActiveXControl():new(,, {0,0}, {0,0} )
      ::oImageManagerIcons:CLSID := "Codejock.ImageManager.13.0.0"
//
// and here the Problem
//
      ::oImageManagerIcons:create()          // <- hängt hier ... warum ???
   ENDIF
RETURN self
ein CreateObject() geht und ein XbpActiveXControl() hängt beim Create() ...
ich habe es auch mit CLASS METHOD initActiveX() versucht und das selbe ...

... klar funktioniert es wenn ich es in die "normale" Create() packe, aber das mit dem "mehrfach"
passt mir nicht ... und mit PUBLIC will ich wegen evtl. Thread nicht ...

ich denken ein Array wäre jetzt "angebracht" wo ich mit ASCAN() dann "irgendwas" suchen
kann ... sowas wie {"XbpPushbutton",oActivex) -> ASCAN(aGlobal,{|x| x[1] = cSeek } sonst
AADD() / Create() ...

kann man ein activeX Object "clonen" ?
also nicht nur Reference darauf sodas bei einem :Clear() dann nur in einem Thread erfolgt ?
gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Globalsettings

Beitrag von Martin Altmann »

Hallo Jimmy,
hmmm - die Globale Klasse nimmst Du eigentlich nur, um grundlegende Dinge zu definieren!
Das, was Du dort also als CLASS VAR und CLASS METHOD hast, wäre dort richtig, da es nur ein einziges Mal aufgerufen wird! Das Prüfen auf NIL kannst Du Dir dann bei der Implementuierung der Method Class auch sparen!
Wenn Du nun also HX_PushButtton, HX_CheckBox,... hast und bei denen die HX_InitGlob als Superclass, dann würde nach dem ersten Init einer der von HX_InitGlob erzeugten Subklassen diese Methode als erstes einmalig ausgeführt werden - bei weiteren Inits auch anderer Subklassen wäre das nicht mehr der Fall!
Deine Methode InitActiveX jedoch ist eine ganz normale Methode, die in jeder Subklasse zur Verfügung steht und auch dort aufgerufen wird - sofern Du dies dort machst.

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
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: Globalsettings

Beitrag von AUGE_OHR »

hi,
Martin Altmann hat geschrieben: Deine Methode InitActiveX jedoch ist eine ganz normale Methode, die in jeder Subklasse zur Verfügung steht und auch dort aufgerufen wird - sofern Du dies dort machst.
Das es nur noch ein "ganz normale Methode" ist liegt daran das ich versucht habe es umzuschreiben
Auge_Ohr hat geschrieben: ein CreateObject() geht und ein XbpActiveXControl() hängt beim Create() ...
ich habe es auch mit CLASS METHOD initActiveX() versucht und das selbe ...
wärend die Globalsettings immer gleich sein sollten, "könnte" ImageManagerIcons verschiedene
Icon enthalten so wie eine Resource.RES. Ich will also im Grunde 1x die Resource.ARC "laden".
(tatsächlich kann ich nur CJ:LoadFile() ICO / Bitmap machen und habe es noch nicht geschafft
die Resource.RES für CJ zu benutzen.)

Die Frage die aber offen ist : Warum geht ein CreateObject(), aber ein XbpActiveXControl() versagt ?
gruss by OHR
Jimmy
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: Globalsettings

Beitrag von AUGE_OHR »

hi,
AUGE_OHR hat geschrieben: Die Frage die aber offen ist : Warum geht ein CreateObject(), aber ein XbpActiveXControl() versagt ?
Tja wenn man das Problem 1x hatte und man es per Workaround behoben hat, rächt sich das ganze
denn man sollte ja nicht glauben das es einmalig wäre ...

Xbase++ hat ja "nur" Tabpages die wir "einfach" übereinander legen. Das geht so lange gut wie wir
Platz für die TABs haben. "Hätten" wir mehr bräuchten wir dafür einen "Manager".

Bei den Codejock Controls ist das nun bei den Tabpages so, also versuche ich den "Manager" in
der HX_Tabpage:InitClass zu laden. Da der "Manager" Event sendet, muss ich XbpActiveXControl()
verwenden ... und genau das geht NICHT in einer :InitClass

... und was nun ? (ausser warten bis Alaska das behebt)

1.) ich will nicht, wie bei XCodejock, vor den "Tabpage" noch den "Manager" im "Source"
aktivieren sondern das soll bitte die Class tun.
2.) alle Class(en) werden jeweils 1 PRG werden (nix mit Fieldwide STATIC)
3.) PUBLIC wird wegen Thread evtl. Probleme machen
4.) ich habe eine HX_INIT() Class die ich eigentlich nur "intern" mit :InitClass ansprechen wollte

wie bekomme ich das nun "elegant" unter einen Hut ?
gruss by OHR
Jimmy
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: Globalsettings

Beitrag von AUGE_OHR »

Code: Alles auswählen

//
// diese Zeile leitet eine XbpTabpage um
//
#xtranslate XbpTabpage => HX_Tabpage
//
// Codejock Konstanten
//
#include "suite.ch"

#include "Appevent.ch"
#include "Xbp.ch"
#include "Gra.ch"

PROCEDURE AppSys ; RETURN

PROCEDURE Main
LOCAL nEvent, mp1, mp2, oXbp
LOCAL oDlg,drawingArea
LOCAL aSize := {600,550}
LOCAL aPos  := {100,100}
LOCAL aPP   := {}

   AAdd ( aPP, { XBP_PP_COMPOUNDNAME, "8.Arial" } )
   AAdd ( aPP, { XBP_PP_FGCLR, GRA_CLR_BLUE } )
   AAdd ( aPP, { XBP_PP_BGCLR, GRA_CLR_PINK } )

*   aPos  := HX_CenterPos( aSize, AppDesktop():currentSize() )

   oDlg           := XbpDialog():new( ,,aPos,aSize,aPP )
   oDlg:title     := "Codejock Tabpage Class"
   oDlg:titleBar  := .T.
   oDlg:taskList  := .T.
   oDlg:icon    := 1
   oDlg:create()
//
// diese Zeile ersetzen durch
//
  drawingArea := oDlg:drawingArea

***************************************************************************
//
// diese Zeile stört mich ... aber ich brauche das activeX
//
   drawingArea := HX_Tab():new(oDlg:drawingArea,,{0,0}, {600,480} ):create()

***************************************************************************

   oXbp := XbpTabpage():new(drawingArea , , {0, 10}, {600,480} )
   oXbp:caption := "xtpOverlay"
   oXbp:tabactivate:= {| uNIL1, uNIL2, self | msgbox("hallo 1","Hinweis 1") }
   oXbp:create()

   oXbp := XbpTabpage():new(drawingArea , , {0, 10}, {600,480} )
   oXbp:caption := "xtpImageAboveText"
   oXbp:tabactivate:= {| uNIL1, uNIL2, self | msgbox("hallo 2","Hinweis 2") }
   oXbp:create()

   oXbp := XbpTabpage():new(drawingArea , , {0, 10}, {600,480} )
   oXbp:caption := "xtpTextAboveImage"
   oXbp:tabactivate:= {| uNIL1, uNIL2, self | msgbox("hallo 3","Hinweis 3") }
   oXbp:create()

   oXbp := XbpTabpage():new(drawingArea , , {0, 10}, {600,480} )
   oXbp:caption := "xtpImageBeforeText"
   oXbp:tabactivate:= {| uNIL1, uNIL2, self | msgbox("hallo 4","Hinweis 4") }
   oXbp:create()

   oXbp := XbpTabpage():new(drawingArea , , {0, 10}, {600,480} )
   oXbp:caption := "xtpTextBeforeImage"
   oXbp:Icon    := "star32.ico"
   oXbp:tabactivate:= {| uNIL1, uNIL2, self | msgbox("hallo 5","Hinweis 5") }
   oXbp:create()

   SetAppWindow(oDlg)
   SetappFocus(oDlg)

   // Event loop = Programmsteuerung
   nEvent := 0
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      oXbp:HandleEvent( nEvent, mp1, mp2 )
   ENDDO

   oDlg:Destroy()
RETURN
gruss by OHR
Jimmy
Antworten