Session D-OCX

Neue ActiveX Controls
in VFP 5.0

Hartmut Billewicz
Wizards & Builders GmbH, PCL-Data


EINLEITUNG

ActiveX-Control ist der neue Name seitens Microsoft für das, was "früher" in Foxpro als OLE-Objekt bezeichnet wurde. ActiveX ist ein sehr weitreichender Begriff, der sich besonders in Internetstrukturen immer wieder findet. Von ActiveX-Dokumenten, von ActiveX-Controls, von ActiveX-Scripting und von ActiveX Internet Information Servers ist die Rede. Im Rahmen dieser Session beziehen wir uns auf den Begriff ActiveX-Controls wie es sie heute in Visual Foxpro 5.0 gibt. Im allgemeinen Sprachgebrauch bisher als OCXe bezeichnet sind die ActiveX-Controls eine wertvolle Erweiterung der Visual Foxpro Sprache und nicht nur auf die Verwendung unter VFP beschränkt, sondern auch in anderen Sprachen, z.B. Visual Basic verwendbar.

Woher kommen die ActiveX-Controls, die in VFP 5.0 verwendet werden können?

Typischerweise sind sie in Visual Basic oder in C++ geschrieben. Eine für VFP Programmierer recht verträgliche Methode selber ActiveX-Controls zu schreiben und damit etwaige Beschränkungen von VFP zu umgehen, ist die Benutzung der Visual Basic Control Construction Edition (VBCCE), welche als 6 MB down-load von Microsoft per Internet an interessierte VFP Programmierer kostenlos zur Verfügung gestellt wird. Der ActiveX-Construction-Wizard von C++ ist eine andere Möglichkeit sich die Arbeit etwas zu vereinfachen. Eine ganze Reihe solcher Controls wird mit Visual Foxpro 5.0 ausgeliefert. Weitere sind auf dem 3rd Party Markt erhältlich.

Installation

Installiert werden sie normalerweise im Verzeichnis \WINDOWS\SYSTEM\ als Dateien mit einer Endung .OCX, welche dann auch in VFP registriert werden können (unter TOOLS, OPTIONEN, CONTROLS, ACTIVEX CONTROLS).

Danach sind sie für die Form Controls Toolbar zur Benutzung im Formulardesigner und Klassendesigner verfügbar. Sie können auch mit Hilfe von "OLE-Container-Control" aus der normalen Form Controls Toolbar heraus gefunden und benutzt werden.

Mit VFP 5.0 mitgelieferte ActiveX-Controls

Treeview, Outline, Picture, Sysinfo, ProgressBar, Slider, StatusBar, TabStrip, Toolbar, ComboBox und Datalist, Mail, Kommunikation, Grid, Kalender, Multimedia, RichText, Mehrere 3-D Controls und einige andere werde direkt mit VFP Professional ausgeliefert. Bis auf eine Ausnahme, die nur intern für die Online-Dokumentation verwendet wird, lassen sich alle in eigene Programme einbauen und in dem Zustand auch an Kunden ausliefern.

Außerdem gibt es einen schnell wachsenden Markt von z.T. recht exotischen 3rd-Party ActiveX-Controls, die mitlerweile auch viel weniger Kompatibilitätsprobleme haben als unter VFP 3.0. Sie sind "i-Simple-Frame" kompatibel und bieten oft Funktionalitäten, die sonst nicht unter VFP verfügbar wären.

Programmatische Instanziierung

In einem Programm könnten die relevanten Teile z.B. folgendermaßen aussehen:

oMyForm = CREATEOBJECT("form")
oMyForm.AddObject("oleOutline","olecontrol", "MSOutl.Outline")

... * z.B. Outline Control vorbereiten
THIS.OleOutline.AddItem(LOWER(m.path))
THIS.OleOutline.Indent(m.cnt-1)= m.lvl

... * z.B. Nodes vorbereiten
IF cnt = 1
oNode = o.nodes.add(,1,LOWER(m.path)+"_",LOWER(m.path),,)
oNode.Image = "world"
ELSE
oNode = o.nodes.add(m.pkey,4,LOWER(m.path)+"_",LOWER(m.path),,)
* oNode.Image = "fldr"
ENDIF

... * z.B. Array der zu zeigenden Info erzeugen und Baum-Elemente aufbauen
DIMENSION DirArr[1,1]
nTotDir=ADIR(DirArr,m.path+"*.","D")
ASORT(DirArr)

FOR i = 1 TO m.nTotDir
IF DirArr[m.i,1] != '.' AND ATC('D',DirArr[m.i,5])#0
THIS.FillTree(m.path+DirArr[m.i,1]+'\', m.lvl, m.cnt)
ENDIF
ENDFOR

...

oMyForm.oleOutline.Visible = .T.
oMyForm.Show

Eigenschaften, Ereignisse und Methoden

Die PEMs (Properties, Events und Methods) eines ActiveX-Controls hängen natürlich von dem entsprechenden Control bzw. seinem Design ab. Mit einem rechten Mausklick auf dem Conrol kommt man an die ActiveX-Properties ran, mit dem normalen Propertysheet an den Rest.

Beispiele (mit VFP gelieferte):

Einige repräsentative 3rd-Party Beispiele:

ProgressBar-Beispiel mit Code:

Code für ProgressBar-Beispiel:

**************************************************
*-- Form: form1 (d:\activex\progress.scx)
*-- ParentClass: form
*-- BaseClass: form
*
DEFINE CLASS form1 AS form

DoCreate = .T.
Caption = "ProgressBar-Beispiel"
Name = "Form1"

*-- Counter für interne Prozesse
ncount = .F.
*-- Flag für sekundäre ProgressBar
lalle = .F.

ADD OBJECT olecontrol1 AS olecontrol WITH ;
Top = 132, ;
Left = 32, ;
Height = 24, ;
Width = 319, ;
Visible = .F., ;
Name = "Olecontrol1"

ADD OBJECT cmdalle AS commandbutton WITH ;
Top = 36, ;
Left = 48, ;
Height = 27, ;
Width = 84, ;
Caption = "Alle Prozesse", ;
Name = "cmdAlle"

ADD OBJECT command1 AS commandbutton WITH ;
Top = 84, ;
Left = 48, ;
Height = 27, ;
Width = 84, ;
Caption = "Prozess 1", ;
Name = "Command1"

ADD OBJECT command2 AS commandbutton WITH ;
Top = 84, ;
Left = 156, ;
Height = 27, ;
Width = 84, ;
Caption = "Prozess 2", ;
Name = "Command2"

ADD OBJECT command3 AS commandbutton WITH ;
Top = 84, ;
Left = 264, ;
Height = 27, ;
Width = 84, ;
Caption = "Prozess 3", ;
Name = "Command3"

ADD OBJECT cmdende AS commandbutton WITH ;
Top = 216, ;
Left = 276, ;
Height = 27, ;
Width = 84, ;
Caption = "Ende", ;
Name = "cmdEnde"

ADD OBJECT olecontrol2 AS olecontrol WITH ;
Top = 168, ;
Left = 31, ;
Height = 19, ;
Width = 319, ;
Visible = .F., ;
Name = "Olecontrol2"

PROCEDURE Init
thisform.nCount = 0
ENDPROC

PROCEDURE cmdalle.Click
thisform.lAlle = .t.
thisform.nCount = 0
thisform.olecontrol2.visible = .t.

thisform.command1.click()
thisform.command2.click()
thisform.command3.click()

thisform.olecontrol2.visible = .f.
ENDPROC

PROCEDURE command1.Click
thisform.olecontrol1.visible = .t.

for lni1 = 1 to 2000
thisform.nCount = thisform.nCount + 1
wait window nowait str(lni1)
thisform.olecontrol1.value = lni1/20
if thisform.lAlle
thisform.olecontrol2.value = thisform.nCount/60
endif
next

thisform.olecontrol1.visible = .f.
ENDPROC

PROCEDURE command2.Click
thisform.olecontrol1.visible = .t.

for lni1 = 1 to 3000
thisform.nCount = thisform.nCount + 1
wait window nowait str(lni1)
thisform.olecontrol1.value = lni1/30
if thisform.lAlle
thisform.olecontrol2.value = thisform.nCount/60
endif
next

thisform.olecontrol1.visible = .f.
ENDPROC

PROCEDURE command3.Click
thisform.olecontrol1.visible = .t.
for lni1 = 1 to 1000
thisform.nCount = thisform.nCount + 1
wait window nowait str(lni1)
thisform.olecontrol1.value = lni1/10
if thisform.lAlle
thisform.olecontrol2.value = thisform.nCount/60
endif
next

thisform.olecontrol1.visible = .f.
ENDPROC

PROCEDURE cmdende.Click
thisform.release
ENDPROC

ENDDEFINE
*-- EndDefine: form1
**************************************************