Danke, so funktioniert es.Wolfgang Ciriack hat geschrieben:Dann mal vielleicht:
oTest:ActiveXControl1:SetProperty("ColumnWidth",1,50)
Studio Controls for COM via ActivX einbinden?
Moderator: Moderatoren
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
Markus
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
So Sachen funktionieren:
Code: Alles auswählen
oTest:ActiveXControl1:SetProperty("DayNames","Mo;Di;Mi;Do;Fr;Sa;So")
oTest:ActiveXControl1:SetProperty("StartWeekDay",1) // Montag beginnen
oTest:ActiveXControl1:SetProperty("WeekendDates",.t.)
oTest:ActiveXControl1:SetProperty("MilitaryTime",.t.) //24 Stunden anzeige
oTest:ActiveXControl1:SetProperty("DateStart",Date()-1 - CTOD("1/1/1900") )
oTest:ActiveXControl1:SetProperty("DateEnd",Date()+7 - CTOD("1/1/1900") )
Code: Alles auswählen
oTest:ActiveXControl1:SetProperty("TimeScroll",38718 ,600 ) //Werte extra aus Hilfebeispiel übernommen
Code: Alles auswählen
Public Sub TimeScroll( _
ByVal lDate As Long, _
ByVal lTime As Long _
)
Example
The following will adjust the horizontal scroll bar so that 10 am on January 1, 2006 starts the view.
[Visual Basic and Access]
Me.ctSchedule.TimeScroll 38718, 600
[Visual FoxPro]
thisform.ctSchedule.TimeScroll(38718, 600)
Code: Alles auswählen
------------------------------------------------------------------------------
FEHLERPROTOKOLL von "c:\dev\DevSrc\Test ActiveX\sample.exe" Datum: 11.08.2014 00:10:49
Xbase++ Version : Xbase++ (R) Version 1.90.355
Betriebssystem : Windows 7 06.02 Build 09200
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: C VALUE: TimeScroll
-> VALTYPE: N VALUE: 38718
-> VALTYPE: N VALUE: 600
oError:canDefault : J
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Typenkonflikt.
Parameter hat falschen Typ
oError:filename : NIL
oError:genCode : NIL
oError:operation : setProperty
oError:osCode : -2147352571
oError:severity : 2
oError:subCode : 6500
oError:subSystem : Automation
oError:thread : 1
oError:tries : NIL
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Called from MAIN(130)
Markus
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2936
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Studio Controls for COM via ActivX einbinden?
Code: Alles auswählen
oTest:ActiveXControl1:SetProperty("TimeScroll",1,38718 ,600 )
Die kann man wohl laut Alaska-Hilfe durch :getDsOfNames() ermitteln.
Wolfgang
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
aber auch das funktioniert nicht:
Code: Alles auswählen
myID:= oTest:ActiveXControl1:getIDsOfNames("TimeScroll")
oTest:ActiveXControl1:SetProperty(myID,38718 ,600 ) //Fehler
Markus
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
TimeScroll ist eine Methode und kein Property.... Folgender Aufruf funktioniert daher:
Code: Alles auswählen
oTest:ActiveXControl1:CallMethod("TimeScroll",38718 ,600 )
Markus
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
Ich kann inzwischen die Propertys setzen und lesen und Methoden aufrufen:
Code: Alles auswählen
oDlg:AXCScheduler:CallMethod("TimeScroll",Date()- CTOD("1/1/1900") ,0 )
oDlg:AXCScheduler:SetProperty("TimeType",0) // 0 = Stunden, 1= Tag // 2 = Woche 3 Monat 4 Jahr
Wie komme ich nun an die Events? Da fehlt mir im Moment noch jede Idee. Das einzige das ich habe ist die Hilfe:
ScheduleClick Event
Code: Alles auswählen
Description
Occurs when the schedule area of the control is clicked on.
Syntax
Visual Basic
Public Event ScheduleClick( _
ByVal nxPoint As Integer, _
ByVal nyPoint As Integer, _
ByVal nButton As Integer _
)
Parameters
nxPoint
Returns a number that specifies the current x location of the mouse pointer.
nyPoint
Returns a number that specifies the current y location of the mouse pointer.
nButton
Returns an integer that identifies the button that was pressed to cause the event. The button argument is a bit field with bits corresponding to the left button (bit 0), right button (bit 1), and middle button (bit 2). These bits correspond to the values 1, 2, and 4, respectively. Only one of the bits is set, indicating the button that caused the event.
Remarks
Markus
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2936
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Studio Controls for COM via ActivX einbinden?
Wolfgang
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
Ich habe eine Event Schleife, in etwa so:
Code: Alles auswählen
DO WHILE ! lExit
nEvent := AppEvent(@mp1,@mp2,@oXbp)
oXbp:handleEvent(nEvent,mp1,mp2)
ENDDO
Code: Alles auswählen
oDlg:keyBoard := {|nKey| DEkeys(nKey,oDlg,aSpcl,@lExit, oAppMenu, oAppDlg)}
Aber wie soll ich auf einen Maus Event reagieren wenn in der Hilfe steht:
MouseDown Event
Code: Alles auswählen
Syntax
Visual Basic
Public Event MouseDown( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal x As Long, _
ByVal y As Long _
)
Button
Returns an integer that identifies the button that was pressed to cause the event. The button argument is a bit field with bits corresponding to the left button (bit 0), right button (bit 1), and middle button (bit 2). These bits correspond to the values 1, 2, and 4, respectively. Only one of the bits is set, indicating the button that caused the event.
Shift
Returns an integer that corresponds to the state of the SHIFT, CTRL, and ALT keys when the button specified in the button argument is pressed or released. A bit is set if the key is down. The shift argument is a bit field with the least-significant bits corresponding to the SHIFT key (bit 0), the CTRL key (bit 1), and the ALT key (bit 2 ). These bits correspond to the values 1, 2, and 4, respectively. The shift argument indicates the state of these keys. Some, all, or none of the bits can be set, indicating that some, all, or none of the keys are pressed. For example, if both CTRL and ALT were pressed, the value of shift would be 6.
x
Returns a number that specifies the current x location of the mouse pointer.
y
Returns a number that specifies the current y location of the mouse pointer.
Gruß
Markus
Markus
- AUGE_OHR
- Marvin
- Beiträge: 12911
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Studio Controls for COM via ActivX einbinden?
du musst die Parameter in den Codeblock übernehmen.
Code: Alles auswählen
xVar := oDlg:AXCScheduler:isEventPublished("MouseDown")
IF xVar <> Nil
oDlg:AXCScheduler:SubscribeEvent( "MouseDown", {|Button,Shift,X,Y| oDlg:My_MouseDown(Button,Shift,X,Y) })
ENDIF
allerdings ist mir nicht klar was du mit dem Event "Mousedown" anfangen willst ?
normal wäre doch eher das du einen "DblClick" in den Calender machst um einen neuen Termin anzulegen oder zu editieren.
In Codejock Calender wird danach ein "Hit" Test gemacht ( was ist da wo du geklickt hast )
Code: Alles auswählen
METHOD VOBWORK:CalBlock(o,nAction)
LOCAL oActiveView
LOCAL oHitInfo
LOCAL cName
LOCAL nNo
DEFAULT nAction TO 0
IF o = NIL
RETURN .F.
ENDIF
oActiveView := o:ActiveView()
IF oActiveView = NIL
RETURN .F.
ENDIF
cName := oActiveView:interfaceName
IF EMPTY(cName)
RETURN .F.
ELSEIF cName == "CalendarDayView"
ELSEIF cName == "CalendarWeekView"
ELSEIF cName == "CalendarMonthView"
ELSE
RETURN .F.
ENDIF
//
// when Click me make a :HitTest()
//
oHitInfo := oActiveView:HitTest()
//
// now let see what :HitCode() we have
//
nNo := oHitInfo:HitCode()
DO CASE
CASE nNo = 8224 // in ":DayView" update a Entry
::CalEditCell(oHitInfo,nAction)
...
Code: Alles auswählen
::oDialogs := CreateObject( "Codejock.CalendarDialogs"+HX_VERSION() )
Jimmy
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
Das war eigentlich nur ein "Beispielevent", zufällig aus der Hilfe entnommen.
Gruß
Markus
Markus
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Studio Controls for COM via ActivX einbinden?
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Studio Controls for COM via ActivX einbinden?
da das hier ein Thema war: Wie ist denn die Performance?
Jan
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
Im Moment noch absolut ok, ich habe aber nur einige Beispieleinträge, ca. 20 Ressourcen und 5 Termine dazu. Im Moment kommen die Daten auch noch nicht aus der DB, das sollte sich aber auf die Performance nicht auswirken.Jan hat geschrieben:Markus,
da das hier ein Thema war: Wie ist denn die Performance?
Jan
Gruß
Markus
Markus
- Manfred
- Foren-Administrator
- Beiträge: 21214
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: Studio Controls for COM via ActivX einbinden?
ich muß jetzt auch mal kurz meine Frage hier los werden. Ich habe den Thread hier bisher nur recht oberflächlich verfolgt. Es geht doch hier um einen Kalender? Was ist jetzt wie und womit gelöst worden? Ich muß nämlich auch demnächst einen Kalender bauen und habe noch nicht so den richtigen Durchblick, wie ich das anstellen soll/muß.
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 103 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Studio Controls for COM via ActivX einbinden?
die Frage ist was Dein Kalender können muss.
Klaus
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
Solutions Schedule for COM trifft das ziemlich genau: http://www.dbi-tech.com/ProductPage.aspx
Ich habe mir das Demo geladen und die Beispiele mal angesehen, Nun versuche ich mit der Demo einen Prototypen zu programmieren um zu entscheiden ob ich mir dieses nicht ganz billige ActiveX Control kaufe.
Danke Eure, insbesondere Jimmy&Wolfgang, sieht das schon ganz vielversprechen aus. Leider gibt es keine für mich verwendbaren Beispiele, nur VB6 und Foxpro.
Gruß
Markus
Markus
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Studio Controls for COM via ActivX einbinden?
Vielleicht kannst Du beim nächsten Forentreffen (April 2015) oder anderswo mal kurz zeigen, was dabei rumkommt. Und in Ansätzen, wie Du das erledigt hast. Ich denke, das da einige sind die sich dafür interessieren könnten.
Jan
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12911
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Studio Controls for COM via ActivX einbinden?
optisch so was mit einer Timeline von links nach rechts ? Das ist nun ein Array in einem Browse ( ohne Ownerdraw )satmax hat geschrieben:Ich brauche eine Ressourcen Ansicht, also in der linken Spalte die Ressourcen, rechts davon die Stunden oder Tage.
irgendwie bekomme ich bei der Website nur schlecht eine Verbingung ...satmax hat geschrieben:Solutions Schedule for COM trifft das ziemlich genau: http://www.dbi-tech.com/ProductPage.aspx
wenn du Sample postest können wir dir helfensatmax hat geschrieben:Leider gibt es keine für mich verwendbaren Beispiele, nur VB6 und Foxpro.
Jimmy
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2936
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Studio Controls for COM via ActivX einbinden?
- Dateianhänge
-
- urlaub.gif (51.27 KiB) 16673 mal betrachtet
Wolfgang
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
So is es, und wie immer, der Teufel steckt im Detail. Rufe ich aus dem ActiveX Control ein tdMsg() auf erhalte ich nur einen leeren Dialog. ein MsgBox() hingegen arbeitet einwandfrei.Jan hat geschrieben:815 € für einen Kalender, das ist eine Ansage.
Eventuell riskiere ich doch ein paar Tage mit dem OwnerDraw, weiter unten sind ja 2 gute Beispiele wie so etwas aussieht.
Wenn es im Süden Deutschlands liegt (München/Nürnberg bis Passau) eventuell...Jan hat geschrieben: Vielleicht kannst Du beim nächsten Forentreffen (April 2015) oder anderswo mal kurz zeigen, was dabei rumkommt. Und in Ansätzen, wie Du das erledigt hast. Ich denke, das da einige sind die sich dafür interessieren könnten.
Jan
Markus
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
So ungefähr, dein Beispiel ist schon ein ganz guter Ansatz.AUGE_OHR hat geschrieben:optisch so was mit einer Timeline von links nach rechts Das ist nun ein Array in einem Browse ( ohne Ownerdraw )
Markus
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
Das sieht schon fast perfekt aus. Ich brauche halt 2-3 verschiedenen Ansichten (1-5 Tage, Wochen und Monatsansicht). Mir ist bei der Aufwandsschätzung nicht ganz wohl, auf einmal vergehen da gleich 2-3 Monate bis ich das grob beisammen habe, das kann ich mir dann nicht leisten... Andererseits wird würde man so am meisten Flexibilität erreichen...Wolfgang Ciriack hat geschrieben:Hier ist auch mal eine kleine Ansicht mit Browse und Ownerdraw (Urlaubsplaner), den man sicher noch optimieren kann, aber für meine Bedürfnisse reicht er so.
Hast Du das in einer Klasse realisiert? Wie groß war grob der zeitliche Aufwand? In wie weit ist die Ansicht dynamisch an die Fenstergröße anpassbar?
Markus
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2936
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Studio Controls for COM via ActivX einbinden?
Da brauchst du nur verschieden zu "malen", ich versuche mal, etwas Code dazu zu posten.Ich brauche halt 2-3 verschiedenen Ansichten (1-5 Tage, Wochen und Monatsansicht)
Mein Zeitaufwand war dafür ca. 1-2 Tage.
Wolfgang
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2936
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Studio Controls for COM via ActivX einbinden?
Durch die Presentationparameter lege ich die Höhe der Zeilen für den Browser fest.
Code: Alles auswählen
aPP:={ ;
{XBP_PP_COMPOUNDNAME,12.Arial Fett" }, ;
{XBP_PP_COL_DA_FGCLR, GRA_CLR_BLACK }, ;
{XBP_PP_COL_DA_BGCLR, GRA_CLR_WHITE}, ;
{XBP_PP_HILITE_FGCLR, GRA_CLR_BLACK }, ;
{XBP_PP_HILITE_BGCLR, GraMakeRGBColor({255,204,153}) }, ;
{XBP_PP_COL_HA_COMPOUNDNAME, "10.Arial Fett Kursiv" } ;
{XBP_PP_COL_HA_HEIGHT, 56 };
{XBP_PP_COL_DA_ROWHEIGHT, 28 };
{XBP_PP_COL_DA_CELLHEIGHT, 28 } }
@5.4,1 DCBROWSE oBrowse ;
DATA aAktBrw ;
SIZE br, ho ;
HEADLINES 2 ;
PRESENTATION aPP ;
TABSTOP ;
FREEZELEFT {1} ;
SUBCLASS 'XbpBrowseUrlaub()' ;
EVAL {|o| o:UseVisualStyle:=.F. }
DCBROWSECOL ELEMENT i HEADER ntocmonth(i)+";1-31" ;
WIDTH int((br-20-12*2)/12) PARENT oBrowse EVAL {|o|o:DataArea:DrawMode := XBP_DRAW_OWNER,o:Heading:DrawMode := XBP_DRAW_OWNER}
Code: Alles auswählen
{{Name, ....., Monatstring1, Monatstring2....,...,Monatstring12},
{Name2,... }}
Code: Alles auswählen
#define T_OHNE chr(113) /* kein Termin*/
#define T_FEST chr(114) /* Fester Urlaub */
#define T_PLAN chr(98) /* geplanter Urlaub */
#define T_WE chr(103) /* Wochenende */
Code: Alles auswählen
***************************************
CLASS XbpBrowseUrlaub FROM DC_XbpBrowse
***************************************
PROTECTED:
VAR oFontMonat
VAR oFontTage
EXPORTED:
INLINE METHOD destroy
*********************
::DC_XbpBrowse:destroy()
RETURN self
INLINE METHOD init( oParent, oOwner, aPos, aSize, aPP, lVisible, oGetList )
*****************************************************************
::DC_XbpBrowse:init( oParent, oOwner, aPos, aSize, aPP, lVisible, oGetList )
::drawMode:= XBP_DRAW_OWNER
::oFontMonat := XbpFont():New():Create("12.Arial Fett")
::oFontTage := XbpFont():New():Create("6.Arial")
RETURN self
INLINE METHOD create( oParent, oOwner, aPos, aSize, aPP, lVisible )
*******************************************************************
::DC_XbpBrowse:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
RETURN self
INLINE METHOD customDrawCell( oPS, aInfo )
******************************************
LOCAL xData, nFound, aPP, pos, ep, i, tagbreite
IF aInfo[XBP_DRAWINFO_AREA] == aInfo[XBP_DRAWINFO_COLUMN]:Heading
*** Header
xData:= aInfo[ XBP_DRAWINFO_AREA ]:getCell( aInfo[ XBP_DRAWINFO_ITEM ] )
if xData=="1-31"
* 2. Headerzeile mit Tagesnummern
tagbreite:=(aInfo[ XBP_DRAWINFO_RECT, 3 ]-aInfo[ XBP_DRAWINFO_RECT, 1 ])/31
oPs:SetFont(::oFontTage)
oPs:SetColor(GRA_CLR_WHITE)
i:=1
pos:={ aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite,aInfo[ XBP_DRAWINFO_RECT, 2 ]}
ep:= { aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite+2*tagbreite, aInfo[ XBP_DRAWINFO_RECT, 4 ]}
GraCaptionStr( oPS, pos, ep, "1", XBPALIGN_LEFT+XBPALIGN_BOTTOM )
i:=9
pos:={ aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite,aInfo[ XBP_DRAWINFO_RECT, 2 ]}
ep:= { aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite+2*tagbreite, aInfo[ XBP_DRAWINFO_RECT, 4 ]}
GraCaptionStr( oPS, pos, ep, "10", XBPALIGN_HCENTER+XBPALIGN_BOTTOM )
i:=19
pos:={ aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite,aInfo[ XBP_DRAWINFO_RECT, 2 ]}
ep:= { aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite+2*tagbreite, aInfo[ XBP_DRAWINFO_RECT, 4 ]}
GraCaptionStr( oPS, pos, ep, "20", XBPALIGN_HCENTER+XBPALIGN_BOTTOM )
i:=29
pos:={ aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite,aInfo[ XBP_DRAWINFO_RECT, 2 ]}
ep:= { aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite+2*tagbreite, aInfo[ XBP_DRAWINFO_RECT, 4 ]}
GraCaptionStr( oPS, pos, ep, "30", XBPALIGN_HCENTER+XBPALIGN_BOTTOM )
else
** Monatsname
pos:={ aInfo[ XBP_DRAWINFO_RECT, 1 ], aInfo[ XBP_DRAWINFO_RECT, 2 ]}
ep:= { aInfo[ XBP_DRAWINFO_RECT, 3 ], aInfo[ XBP_DRAWINFO_RECT, 4 ]}
oPs:SetFont(::oFontMonat)
oPs:SetColor(GRA_CLR_WHITE)
GraCaptionStr( oPS, pos, ep, xData, XBPALIGN_HCENTER )
endif
RETURN .F.
ELSE
******* Zelle
aPP := aInfo[ XBP_DRAWINFO_COLUMN ]:presArray
nFound := AScan(aPP,{|a|Valtype(a[1])=='N'.AND. ;
(a[1]==XBP_PP_COL_DA_ROWHEIGHT .OR. ;
a[1]==XBP_PP_COL_DA_CELLHEIGHT) } )
IF nFound == 0
aPP := ::setPresParam()
nFound := AScan(aPP,{|a|Valtype(a[1])=='N'.AND. ;
(a[1]==XBP_PP_COL_DA_ROWHEIGHT .OR. ;
a[1]==XBP_PP_COL_DA_CELLHEIGHT) } )
ENDIF
* get column data
xData:= aInfo[ XBP_DRAWINFO_AREA ]:getCell( aInfo[ XBP_DRAWINFO_ITEM ] )
IF xData <> nil
if len(xData)=31
tagbreite:=(aInfo[ XBP_DRAWINFO_RECT, 3 ]-aInfo[ XBP_DRAWINFO_RECT, 1 ])/31
for i:=1 to len(xData)
if xData[i]=T_OHNE
oPs:SetColor(GRA_CLR_WHITE)
elseif xData[i]=T_WE
oPs:SetColor(GRA_CLR_LIGHTGRAY)
elseif xData[i]=T_FEST
oPs:SetColor(GRA_CLR_DARKGREEN)
elseif xData[i]=T_PLAN
oPs:SetColor(GRA_CLR_GREEN)
endif
pos:={ aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite,aInfo[ XBP_DRAWINFO_RECT, 2 ]}
ep:= { aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite+tagbreite, aInfo[ XBP_DRAWINFO_RECT, 4 ]}
GraBox(oPS, pos,ep,GRA_FILL)
next
RETURN .F.
endif
endif
ENDIF
RETURN .T.
ENDCLASS
Hier müssen die für das Ownerdrawing wichtigen Daten in den Daten des Arrays vorhanden sein.
Das heißt, du kannst hier x-beliebige Daten in das Arrayelement schreiben, wichtig ist nur, wie du die interpretierst.
So könntest du z.B. auch ein Subarray für diese Zelle benutzen, in der du Iconnr, Text oder Grafik übergibst.
Da du ja das Array erstellst, weißt du auch, was es ist und kannst dann die einzelnen Elemente in der Zelle platzieren.
Mir hat dabei ein bischen debuggen sehr geholfen, da man dann sieht, was für Werte in xData oder auch aInfo übergeben werden.
Viel Spaß beim experimentieren
Wolfgang
- satmax
- 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: Studio Controls for COM via ActivX einbinden?
danke für dein umfangreiches Beispiel. Ich versuche gerade mir daraus ein kleines Beispielprogramm zu basteln.
Ich leite die Klasse XbpBrowseUrlaub direkt von XbpBrowse ab, erstelle ein Array mit ein paar Demodaten.
Beim Aufruf oBrowse:show() erhalte ich die Fehlermeldung:
Member-Variable ist für dieses Objekt unbekannt: presArray
Code: Alles auswählen
Xbase++ Version : Xbase++ (R) Version 1.90.355
Betriebssystem : Windows 7 06.02 Build 09200
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: O CLASS: XbpColumn
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Member-Variable ist fr dieses Objekt unbekannt
oError:filename :
oError:genCode : 26
oError:operation : presArray
oError:osCode : 0
oError:severity : 2
oError:subCode : 2240
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von XBPBROWSEURLAUB:CUSTOMDRAWCELL(184)
Aufgerufen von XBPBROWSE:HANDLEEVENT(1566)
Aufgerufen von FORWARDCUSTOMDRAWCELL(1522)
Aufgerufen von (B)XBPCOLUMN:CREATE(502)
Aufgerufen von (B)XBPBROWSE:FORCESTABLE(1176)
Aufgerufen von XBPBROWSE:FORCESTABLE(1176)
Aufgerufen von XBPBROWSE:HANDLEEVENT(1536)
Aufgerufen von XBPBROWSE:SHOW(3281)
Aufgerufen von MAIN(88)
Code: Alles auswählen
#include "Appevent.ch"
#include "Common.ch"
#include "Gra.ch"
#include "Xbp.ch"
#pragma Library( "XppUi2.lib" )
#define T_OHNE chr(113) /* kein Termin*/
#define T_FEST chr(114) /* Fester Urlaub */
#define T_PLAN chr(98) /* geplanter Urlaub */
#define T_WE chr(103) /* Wochenende */
STATIC aData
STATIC nLastRec
STATIC nRecno
PROCEDURE AppSys
RETURN
FUNCTION Main()
LOCAL oDlg, oBrowse, oColumn, oXbp, mp1, mp2, nEvent
LOCAL aPP:={ ;
{XBP_PP_COMPOUNDNAME,"12.Arial Fett" }, ;
{XBP_PP_COL_DA_FGCLR, GRA_CLR_BLACK }, ;
{XBP_PP_COL_DA_BGCLR, GRA_CLR_WHITE}, ;
{XBP_PP_HILITE_FGCLR, GRA_CLR_BLACK }, ;
{XBP_PP_HILITE_BGCLR, GraMakeRGBColor({255,204,153}) }, ;
{XBP_PP_COL_HA_COMPOUNDNAME, "10.Arial Fett Kursiv" }, ;
{XBP_PP_COL_HA_HEIGHT, 56 },;
{XBP_PP_COL_DA_ROWHEIGHT, 28 },;
{XBP_PP_COL_DA_CELLHEIGHT, 28 } }
// Beipieldaten
// {{Name, ....., Monatstring1, Monatstring2....,...,Monatstring12},
// {Name2,... }}
aData := {{'Name 1',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},;
{'Name 2',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},;
{'Name 3',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},;
{'Name 4',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},;
{'Name 5',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},;
{'Name 6',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}}
nRecno := 1
nLastRec := Len(aData)
oDlg := XbpDialog():new(,,,,, .F. )
oDlg:taskList := .T.
oDlg:clientSize := { 800, 600 }
oDlg:drawingArea:clipChildren := .T.
oDlg:title := 'Beispiel Kalender'
oDlg:create()
oDlg:drawingArea:setFontCompoundName( '9.Arial' )
CenterControl( oDlg )
SetAppWindow( oDlg )
oBrowse := XbpBrowseUrlaub():new( oDlg:drawingArea,, { 0, 0 }, oDlg:drawingArea:currentSize(),, .F. )
oBrowse:SkipBlock := {|nSkip,oBrowse| DoSkip(nSkip,oBrowse) }
oBrowse:GoBottomBlock := {|| nRecno := Len(aData) }
oBrowse:GoTopBlock := {|| nRecno := 1 }
oBrowse:PosBlock := {|| nRecno }
oBrowse:PhyPosBlock := {|| nRecno }
oBrowse:LastPosBlock := {|| Len(aData) }
oBrowse:FirstPosBlock := {|| 1 }
// oBrowse:CursorMode := XBPBRW_CURSOR_ROW
oBrowse:SetPresParam(aPP)
oBrowse:create()
oColumn := oBrowse:AddColumn( {|| aData[nRecno,1]}, 10, "Name" )
oColumn := oBrowse:AddColumn( {|| aData[nRecno,2]}, 10, "J" )
oColumn := oBrowse:AddColumn( {|| aData[nRecno,3]}, 20, "F" )
oColumn := oBrowse:AddColumn( {|| aData[nRecno,4]}, 20, "M" )
oColumn := oBrowse:AddColumn( {|| aData[nRecno,5]}, 20, "A" )
oColumn := oBrowse:AddColumn( {|| aData[nRecno,6]}, 20, "M" )
oColumn := oBrowse:AddColumn( {|| aData[nRecno,7]}, 20, "J" )
oColumn := oBrowse:AddColumn( {|| aData[nRecno,8]}, 20, "J" )
oColumn := oBrowse:AddColumn( {|| aData[nRecno,9]}, 20, "A" )
oColumn := oBrowse:AddColumn( {|| aData[nRecno,10]},20, "S" )
oColumn := oBrowse:AddColumn( {|| aData[nRecno,11]},20, "O" )
oColumn := oBrowse:AddColumn( {|| aData[nRecno,12]},20, "N" )
oColumn := oBrowse:AddColumn( {|| aData[nRecno,13]},20, "D" )
oBrowse:show()
oDlg:show()
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
QUIT
RETURN NIL
FUNCTION DoSkip( nSkip )
LOCAL nCanSkip
IF nRecno + nSkip < 1 // "BoF"
nCanSkip := 1 - nRecno
ELSEIF nRecno + nSkip > nLastRec // "EoF"
nCanSkip := nLastRec - nRecno
ELSE
nCanSkip := nSkip
ENDIF
nRecno += nCanSkip
RETURN nCanSkip
****************************************************************************************
*
****************************************************************************************
***************************************
CLASS XbpBrowseUrlaub FROM XbpBrowse
***************************************
PROTECTED:
VAR oFontMonat
VAR oFontTage
EXPORTED:
INLINE METHOD destroy
*********************
::XbpBrowse:destroy()
RETURN self
INLINE METHOD init( oParent, oOwner, aPos, aSize, aPP, lVisible, oGetList )
*****************************************************************
::XbpBrowse:init( oParent, oOwner, aPos, aSize, aPP, lVisible, oGetList )
::drawMode:= XBP_DRAW_OWNER
::oFontMonat := XbpFont():New():Create("12.Arial Fett")
::oFontTage := XbpFont():New():Create("6.Arial")
RETURN self
INLINE METHOD create( oParent, oOwner, aPos, aSize, aPP, lVisible )
*******************************************************************
::XbpBrowse:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
RETURN self
INLINE METHOD customDrawCell( oPS, aInfo )
******************************************
LOCAL xData, nFound, aPP, pos, ep, i, tagbreite
IF aInfo[XBP_DRAWINFO_AREA] == aInfo[XBP_DRAWINFO_COLUMN]:Heading
*** Header
xData:= aInfo[ XBP_DRAWINFO_AREA ]:getCell( aInfo[ XBP_DRAWINFO_ITEM ] )
if xData=="1-31"
* 2. Headerzeile mit Tagesnummern
tagbreite:=(aInfo[ XBP_DRAWINFO_RECT, 3 ]-aInfo[ XBP_DRAWINFO_RECT, 1 ])/31
oPs:SetFont(::oFontTage)
oPs:SetColor(GRA_CLR_WHITE)
i:=1
pos:={ aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite,aInfo[ XBP_DRAWINFO_RECT, 2 ]}
ep:= { aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite+2*tagbreite, aInfo[ XBP_DRAWINFO_RECT, 4 ]}
GraCaptionStr( oPS, pos, ep, "1", XBPALIGN_LEFT+XBPALIGN_BOTTOM )
i:=9
pos:={ aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite,aInfo[ XBP_DRAWINFO_RECT, 2 ]}
ep:= { aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite+2*tagbreite, aInfo[ XBP_DRAWINFO_RECT, 4 ]}
GraCaptionStr( oPS, pos, ep, "10", XBPALIGN_HCENTER+XBPALIGN_BOTTOM )
i:=19
pos:={ aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite,aInfo[ XBP_DRAWINFO_RECT, 2 ]}
ep:= { aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite+2*tagbreite, aInfo[ XBP_DRAWINFO_RECT, 4 ]}
GraCaptionStr( oPS, pos, ep, "20", XBPALIGN_HCENTER+XBPALIGN_BOTTOM )
i:=29
pos:={ aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite,aInfo[ XBP_DRAWINFO_RECT, 2 ]}
ep:= { aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite+2*tagbreite, aInfo[ XBP_DRAWINFO_RECT, 4 ]}
GraCaptionStr( oPS, pos, ep, "30", XBPALIGN_HCENTER+XBPALIGN_BOTTOM )
else
** Monatsname
pos:={ aInfo[ XBP_DRAWINFO_RECT, 1 ], aInfo[ XBP_DRAWINFO_RECT, 2 ]}
ep:= { aInfo[ XBP_DRAWINFO_RECT, 3 ], aInfo[ XBP_DRAWINFO_RECT, 4 ]}
oPs:SetFont(::oFontMonat)
oPs:SetColor(GRA_CLR_WHITE)
GraCaptionStr( oPS, pos, ep, xData, XBPALIGN_HCENTER )
endif
RETURN .F.
ELSE
******* Zelle
aPP := aInfo[ XBP_DRAWINFO_COLUMN ]:presArray
nFound := AScan(aPP,{|a|Valtype(a[1])=='N'.AND. ;
(a[1]==XBP_PP_COL_DA_ROWHEIGHT .OR. ;
a[1]==XBP_PP_COL_DA_CELLHEIGHT) } )
IF nFound == 0
aPP := ::setPresParam()
nFound := AScan(aPP,{|a|Valtype(a[1])=='N'.AND. ;
(a[1]==XBP_PP_COL_DA_ROWHEIGHT .OR. ;
a[1]==XBP_PP_COL_DA_CELLHEIGHT) } )
ENDIF
* get column data
xData:= aInfo[ XBP_DRAWINFO_AREA ]:getCell( aInfo[ XBP_DRAWINFO_ITEM ] )
IF xData <> nil
if len(xData)=31
tagbreite:=(aInfo[ XBP_DRAWINFO_RECT, 3 ]-aInfo[ XBP_DRAWINFO_RECT, 1 ])/31
for i:=1 to len(xData)
if xData[i]=T_OHNE
oPs:SetColor(GRA_CLR_WHITE)
elseif xData[i]=T_WE
oPs:SetColor(GRA_CLR_YELLOW /*GRA_CLR_LIGHTGRAY*/)
elseif xData[i]=T_FEST
oPs:SetColor(GRA_CLR_DARKGREEN)
elseif xData[i]=T_PLAN
oPs:SetColor(GRA_CLR_GREEN)
endif
pos:={ aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite,aInfo[ XBP_DRAWINFO_RECT, 2 ]}
ep:= { aInfo[ XBP_DRAWINFO_RECT, 1 ]+(i-1)*tagbreite+tagbreite, aInfo[ XBP_DRAWINFO_RECT, 4 ]}
GraBox(oPS, pos,ep,GRA_FILL)
next
RETURN .F.
endif
endif
ENDIF
RETURN .T.
ENDCLASS
Markus