Studio Controls for COM via ActivX einbinden?

Nutzung, Komponenten, .NET

Moderator: Moderatoren

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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

Wolfgang Ciriack hat geschrieben:Dann mal vielleicht:
oTest:ActiveXControl1:SetProperty("ColumnWidth",1,50)
Danke, so funktioniert es.
Gruß
Markus
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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

Grundsätzlich bin ich mal deutlich weiter gekommen und kann das ActiveX Control anzeigen, mit Daten versorgen und einige Eigenschaften verändern.

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") )
Die folgende Zeile bringt aber immer einen Runtime Error (inzwischen habe ich 2 so Propertys mit dem gleichen Verhalten):

Code: Alles auswählen

oTest:ActiveXControl1:SetProperty("TimeScroll",38718 ,600 )  //Werte extra aus Hilfebeispiel übernommen
Aus der Visual Basic Hilfe:

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)
 
Der Runtime Fehler

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)
Man sollte meinen in dieser Zeile kann man keinen Fehler machen, was könnte hier die Ursache sein?
Gruß
Markus
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
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?

Beitrag von Wolfgang Ciriack »

Ich würde es mal mit

Code: Alles auswählen

oTest:ActiveXControl1:SetProperty("TimeScroll",1,38718 ,600 )
probieren, wobei ich nicht weiss, wie die num. Dispatch-ID (hier jetzt mal 1 angenommen) der Eigenschaft ist.
Die kann man wohl laut Alaska-Hilfe durch :getDsOfNames() ermitteln.
Viele Grüße
Wolfgang
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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

So kann es eigentlich nicht gehen, laut Hilfe muss ich entweder "TimeScroll" oder die Num ID verwenden.

aber auch das funktioniert nicht:

Code: Alles auswählen

myID:= oTest:ActiveXControl1:getIDsOfNames("TimeScroll")
oTest:ActiveXControl1:SetProperty(myID,38718 ,600 ) //Fehler
Gruß
Markus
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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

Wieder mal mein Fehler ....

TimeScroll ist eine Methode und kein Property.... Folgender Aufruf funktioniert daher:

Code: Alles auswählen

oTest:ActiveXControl1:CallMethod("TimeScroll",38718 ,600 )
Gruß
Markus
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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

Wie komme ich an die Events?

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
Ratlos...
Gruß
Markus
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
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?

Beitrag von Wolfgang Ciriack »

Schau dir mal in der Alaska Hilfe COM/ActiveX-Ereignisse und :subscribeEvent() an.
Viele Grüße
Wolfgang
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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

Irgendwie komme ich da gar nicht weiter...

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
Mit

Code: Alles auswählen

oDlg:keyBoard := {|nKey| DEkeys(nKey,oDlg,aSpcl,@lExit, oAppMenu, oAppDlg)}
gebe ich meine Funktion bekannt in der die eigentliche Logik des Dialoges steckt. Bis hierher kann ich noch einigermaßen folgen.

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.

Da habe ich nun genau 0 Idee wie ich das angehen könnte.

Gruß
Markus
Gruß
Markus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Studio Controls for COM via ActivX einbinden?

Beitrag von AUGE_OHR »

hi,
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
nicht vergessen das du alle Hooks wieder mit o:unsubscribeEvent() entfernst bevor du das ActiveX löscht.

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)
...
für das Detail Fenster gibt es beim Codejock Calender ein eigenes activeX ist welche du aber nicht im Formdesigner findest.

Code: Alles auswählen

::oDialogs := CreateObject( "Codejock.CalendarDialogs"+HX_VERSION()  )
oder du schreibst dir eben dein eigenes Detail Fenster.
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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

Danke Jimmy, das hat mich wieder einen großen Schritt weitergebracht! Funktioniert einwandfrei.

Das war eigentlich nur ein "Beispielevent", zufällig aus der Hilfe entnommen.

Gruß
Markus
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Studio Controls for COM via ActivX einbinden?

Beitrag von brandelh »

MouseDown() braucht man normalerweise als Anfang einer Markier- oder Verschiebeaktion.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Studio Controls for COM via ActivX einbinden?

Beitrag von Jan »

Markus,

da das hier ein Thema war: Wie ist denn die Performance?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

Jan hat geschrieben:Markus,

da das hier ein Thema war: Wie ist denn die Performance?

Jan
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.

Gruß
Markus
Gruß
Markus
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Studio Controls for COM via ActivX einbinden?

Beitrag von Manfred »

Hi,


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ß.
Gruß Manfred
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!!
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Studio Controls for COM via ActivX einbinden?

Beitrag von Koverhage »

Manfred,

die Frage ist was Dein Kalender können muss.
Gruß
Klaus
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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

Ich brauche eine Ressourcen Ansicht, also in der linken Spalte die Ressourcen, rechts davon die Stunden oder Tage.

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
Gruß
Markus
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Studio Controls for COM via ActivX einbinden?

Beitrag von Jan »

815 € für einen Kalender, das ist eine Ansage.

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 Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Studio Controls for COM via ActivX einbinden?

Beitrag von AUGE_OHR »

satmax hat geschrieben:Ich brauche eine Ressourcen Ansicht, also in der linken Spalte die Ressourcen, rechts davon die Stunden oder Tage.
optisch so was mit einer Timeline von links nach rechts ?
TAL.JPG
TAL.JPG (29.92 KiB) 16225 mal betrachtet
Das ist nun ein Array in einem Browse ( ohne Ownerdraw )
tal.zip
(51.39 KiB) 440-mal heruntergeladen
satmax hat geschrieben:Solutions Schedule for COM trifft das ziemlich genau: http://www.dbi-tech.com/ProductPage.aspx
irgendwie bekomme ich bei der Website nur schlecht eine Verbingung ...
satmax hat geschrieben:Leider gibt es keine für mich verwendbaren Beispiele, nur VB6 und Foxpro.
wenn du Sample postest können wir dir helfen ;)
gruss by OHR
Jimmy
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
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?

Beitrag von Wolfgang Ciriack »

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.
Dateianhänge
urlaub.gif
urlaub.gif (51.27 KiB) 16220 mal betrachtet
Viele Grüße
Wolfgang
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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

Jan hat geschrieben:815 € für einen Kalender, das ist eine Ansage.
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.

Eventuell riskiere ich doch ein paar Tage mit dem OwnerDraw, weiter unten sind ja 2 gute Beispiele wie so etwas aussieht.
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
Wenn es im Süden Deutschlands liegt (München/Nürnberg bis Passau) eventuell...
Gruß
Markus
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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

AUGE_OHR hat geschrieben:optisch so was mit einer Timeline von links nach rechts Das ist nun ein Array in einem Browse ( ohne Ownerdraw )
So ungefähr, dein Beispiel ist schon ein ganz guter Ansatz.
Gruß
Markus
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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

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.
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...

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?
Gruß
Markus
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
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?

Beitrag von Wolfgang Ciriack »

Ich brauche halt 2-3 verschiedenen Ansichten (1-5 Tage, Wochen und Monatsansicht)
Da brauchst du nur verschieden zu "malen", ich versuche mal, etwas Code dazu zu posten.
Mein Zeitaufwand war dafür ca. 1-2 Tage.
Viele Grüße
Wolfgang
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
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?

Beitrag von Wolfgang Ciriack »

Hier auf die Schnelle mal ein paar Codeschnipsel:
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}
Das Array für den Browser besteht aus folgenden Daten:

Code: Alles auswählen

{{Name, ....., Monatstring1, Monatstring2....,...,Monatstring12},
{Name2,...  }}
Ein Monatstring besteht aus 31 Zeichen, für jeden status eines Tages ein unterschiedlicher Buchstabe

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 */
Hier nun die abgeleitete Klasse von DC_XbpBrowse (Kann man natürlich auch von XbpBrowse ableiten):

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
Die wichtigste Methode ist natürlich customDrawCell.
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
Viele Grüße
Wolfgang
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: Studio Controls for COM via ActivX einbinden?

Beitrag von satmax »

Hallo Wolfgang,

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 fr 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)
Hier auch noch mein Testcode:

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
Hängt das eventuell damit zusammen, weil ich direkt von xbpBrowse ableite und nicht von DC_xbpBrowse?
Gruß
Markus
Antworten