Session D-CODE
Codebook 3.0
Erste Stolperübungen
Hartmut "Teddy"
Billewicz
Wizards & Builders GmbH
EINFÜHRUNG
Da viele Leute mit der Step-by-Step Anleitung von Paul Biennick Probleme haben hier einige Vorübungen, die ein bißchen Geschmack für die Codebook Praxis geben sollen und durch die man einen langsameren Einstieg in die CB3-Praxis bekommen kann. Folgendes soll erreicht werden:
Schritt: Dateistruktur erweitern:
open data
Neue Datei erstellen mit New Table Wizard - Books,
alle Felder, erstes Feld und Caption BookCollId umbenennen als CID
Index on CID und Titel
modify structure - Feldnamen an Namenskonventionen angleichen
index benamung, primary index
Als DEFAULT für CID NewID() einstellen
Neuen Datensatz in ID.DBF eingeben für BUCH
in BUCH.ID ein paar Datensätzte eingeben
Schritt: View erstellen für neue DBF
modi data
rechte Maustaste - new local view
mit Wizard
Buch
alle
Order buch.Cid
save local view and modify it
benennen als lv_buch
Einstellung duplizieren
Die abgebildeten Einstellungen duplizieren
Schritt: Erweitern der CB3 Datenumgebung:
Im CD Projekt unter CODE das Programm CDATAENV.PRG modifizieren:
Die folgende Klasse wird für Reindizier- und Pack-Funktionen benuzt und muß erweitert werden.
DEFINE CLASS LocalTablesEnvironment AS CodebookEnvironment
FUNCTION LoadCursors()
DIMENSION this.aCursors[6]
this.aCursors[1] = "Musician"
this.aCursors[2] = "CompactDisc"
this.aCursors[3] = "Customer"
this.aCursors[4] = "Invoice"
this.aCursors[5] = "Purchase"
this.aCursors[6] = "Repolist"
ENDFUNC
ENDDEFINE
*************************************************************
Verändern auf:
*************************************************************
DEFINE CLASS LocalTablesEnvironment AS CodebookEnvironment
FUNCTION LoadCursors()
DIMENSION this.aCursors[7]
this.aCursors[1] = "Musician"
this.aCursors[2] = "CompactDisc"
this.aCursors[3] = "Customer"
this.aCursors[4] = "Invoice"
this.aCursors[5] = "Purchase"
this.aCursors[6] = "Repolist"
this.aCursors[7] = "Buch"
ENDFUNC
ENDDEFINE
************************************************************
Für die Klasse BuchEnvironment läßt sich CustomerEnvironment
als Quelle benutzen, da ähnlich in Struktur (eine Datei, keine Relationen)
************************************************************
DEFINE CLASS CustomerEnvironment AS CodebookEnvironment
FUNCTION LoadCursors()
DIMENSION this.aCursors[1]
this.aCursors[1] = "v_Customer"
ENDFUNC
ENDDEFINE
DEFINE CLASS BuchEnvironment AS CodebookEnvironment
FUNCTION LoadCursors()
DIMENSION this.aCursors[1]
this.aCursors[1] = "v_Buch"
ENDFUNC
ENDDEFINE
*********************************************************
In der folgenden Section eine Klasse für Buch einstellen
*********************************************************
*-----------------------------------------
* Cursors that represent tables in a DBC
*-----------------------------------------
DEFINE CLASS Buch AS CTableCursor
CursorSource = "Buch"
ENDDEFINE
*-------------------------------
* Cursors that represent views
*-------------------------------
DEFINE CLASS v_CompactDisc AS CDynamicViewCursor
cCursorSource = "v_CompactDisc"
ENDDEFINE
DEFINE CLASS v_Buch AS CDynamicViewCursor
cCursorSource = "v_Buch"
ENDDEFINE
*--------------------------
* Cursors used in reports
*--------------------------
DEFINE CLASS v_CompactDiscListing AS CReportDynamicViewCursor
cCursorSource = "v_compact_disc_listing"
Alias = "compact_disc_listing"
ENDDEFINE
DEFINE CLASS v_BuchListing AS CReportDynamicViewCursor
cCursorSource = "v_Buch_listing"
Alias = "buch_listing"
ENDDEFINE
Nach diesem Schritt kann man das Programm laufen lassen mit DO MAIN (ohne das Projekt zu erstellen). Falls es nicht geht, dann erst DO STARTCB laufen lassen und dann DO MAIN (normalerweise ist das aber schon aktiv).
Unter FILE und Database Utilities kann man jetzt reindizieren und packen (einschließlich der Tabelle BUCH.DBF).
Schritt: Business Object für unser Formular erstellen
Sicherstellen, daß CCONTROLS.VCX und CCUSTCTL.VCX in den VFP OPTIONS registriert sind (VFP unter TOOLS, OPTIONS, Visual Class Libraries) - \cdbk30\common30\libs\...
Ein Business Object erstellen, damit wir was zum aufrufen haben.
(vorher vielleicht CUSTOMEROBJ in Klassenbibliothek ABIZNESS anschauen)
Im Project unter Klassen und Bibliothek ABIZNESS eine neue Klasse BuchObj erstellen (sie auch Step-by-Step Nr. 4)
basieren auf Klasse CBIZOBJ in CBIZNESS.VCX (unter \common30\libs)
Das Ding hat automatisch (vererbt) CsessionEnvironment und CDELoader Objekte.
Das cDataEnvironment property im CDELoader dieser neuen Klasse auf BuchEnvironment stellen
Unter Toolbar Button "View Classes" die anderen registrierten ansteuern, insbesondere cContrls.
Damit ein paar Felder auf die BuchObj Klasse droppen und mit dem control source v_buch.cid, v_buch.cTitle, v_buch.cAuthorId, usw. versehen. Aus dem Feld für v_buch.CID ein nur-lese Feld machen (im property sheet data tab read-only auf .t. setzen). In der Praxis sollte dieses Feld dem Anwender wahrscheinlich gar nicht gezeigt werden.
Klasse abspeichern
Schritt: Formular(klasse) erstellen
Eine neue Klasse (soll unser eigentliches Formular werden) erstellen, basierend auf cBizObjMaintForm in CFORMS.VCX (unter \cdbk30\common\libs\). Diese dann im Klassendesigner vervollständigen. Mit rechter Maustaste auf "Edit", dann 2. Seite (Data Entry) anklicken. Mit Drag'n Drop unsere Business Object Klasse "BuchObj" (in der ABIZNESS.VCX) auf diese 2. Seite der Formularklasse fallen lassen.
Mit Drag 'n Drop unsere Klasse v_buch in die Formularklasse reinziehen.
Auf die erste Seite (die Suchmaske) aus CCONTRLS.VCX die Klasse cTextBox zweimal droppen, damit wir Suchfelder für Author-ID und Titel bekommen können.
Das Formular kann folgenderweise ausprobiert werden (auch ohne vorher die Toolbar oder das Hauptmenu: zu erweitern:
Das CD Programm ablaufen lassen mit "DO MAIN". Ohne sonst irgenwas aufzurufen vom Menüpad Utilities Suspend auswählen (Hinweis: Das Utilities Menüpad erscheint nur, wenn die Datei DEBUG.TXT im aktiven Verzeichnis existiert). In diesem suspendierten Zustand im Befehlsfenster eintippen =DoForm("BuchForm"). Wenn dies aus irgendeinem Grunde schiefläuft, das gleiche einfach mit =DoForm("CustomerForm") versuchen. Damit müßte es laufen.
Schritt: Toolbarerweiterung:
Im Projekt CD unter Klassen in der Klassenbibiliothek ATOOLBAR (Application Toolbar) die Klasse MAINTOOLBAR modifizieren:
Mit Cut & Paste einfach einen der Buttons kopieren (damit automatisch genauso subgeclassed wie notwendig).
Im Property Sheet unter Layout dem PICTURE property eine neue Bitmap zuordnen (z.B. in \vfp\graphics\bmps\fox\library.bmp)
Tooltiptext auf BÜCHER umstellen. NAME unter OTHER auf cmdBuch stellen
cForm custom property auf BuchForm (damit wird der Aufruf des entsprechenden Formulars gesteuert).
Methoden werden keine gebraucht (nur die Parent Methoden werden ausgeführt)
An dieser Stelle das Programm nur ausführen, wenn das Business Object, d.h. unsere Formularklasse schon existiert. Die Benutzung der Toolbar ohne die ensprechende Klasse führt zu Crash wenn Bücher angeklickt wird (oder werden - je nachdem wie Sie es mit der deutschen Sprache halten).
Schritt: Menüerweiterung:
Im Projektmanager unter dem KLASSEN Tab in der Bibliothek AMENUS.VCX die Klassee MAINMENU modifizieren
Mit der rechten Maustaste das Mainmenu Objekt anklicken und Builder auswählen (Steuerelementassisten).
Jetzt mit Hilfe des Menu builders das Menü erweitern:
Mit der rechten Maustaste auf dem Administration Pad "Add Bar..." auswählen (Hinweis: je nachem worüber man die rechte Maustaste aktiviert reagiert der Menu Builder mit anderen Menüdialogen - bitte anschauen).
Dann auf der "Item"-Seite des Dialoges auf den Command Button "New Class" (den rechten - siehe ToolTip). Als Namen "AdminBuchBar" eingeben und zum speichern per Dialog die AMENUS.VCX Klassenbibliothek (unter \cdbk30\cd\libs\) auswählen (Basierend auf CBAR is OK). Mit dem "Schließen" Commandbutton (den linkesten) diesen Dialog schließen. Mit der linken Taste in das leere neue Feld klicken und "\<Bücher" eintippen.
Zum Spaß bitte noch mit der rechten Mautaste auf die neue Bücher bar gehen und nach ober verschieben (Drag'n Drop) um alphabethisch in die richtige Position zu kommen
Damit kann jeder Menüeintrag beliebig verschoben werden (Cool!).
Die dickpfeiligen Commandbuttons des Menübuilders beziehen sich auf die Darstellung des Menüs. Bei einer komplizierten Menüstruktur läßt sich alles in allen Richtungen scrollen, bzw. wieder in die HOME-Position zurückbringen.
Mit dem "Schließen" Command Button des Menü Builders diesen selber schließen (Achtung: da tut sich einiges im Hintergrund - nicht nervös werden). Dann nacheinander jede der nun noch im Classdesigner offenen Klassen abspeichern (am einfachsten mit Ctrl-W).
Vom Befehlsfenster (auch wenn der Projektmanager offen ist) mit DO MAIN das Programm ablaufen lassen.
Beispiel von Fehlern die Auftauchen können und wo man sich an ganz neue Debugging Methoden gewöhnen muß:
Durch den (relativ komplizierten) Überbau des CB3 Frameworks passieren viele Fehler "auf höherer Ebene". Die Fehlermeldungen beziehen sich auf das lokale Problem (nicht z.B. auf die falschen Metadaten) und sind oft recht unbrauchbar. Dies ist aber ein Problem, welches sich in jeder Programmierumgebung ergibt, in der mit vielen sehr generischen Elementen gearbeitet wird. Als persönliches Beispiel kann ich da TRO 2.6 (Tom Rettig's Office) erwähnen.
Schritt: Formularbau
("normales" Stammdatenformular):
[Dieser Teil war zur Drucklegung leider noch nicht verfügbar und kann per Compuserve vom Referenten angefordert werden]
Codebook-Menüs
* Program...........: MENUBLDR (Menu Builder)
* Author............: Ken R. Levy
* Copyright.........: (c) Flash Creative Management, Inc., 1995
To edit a menu with the Menu Builder:
1) Open a subclass of CMenu in the Class Designer.
2) Run the Builder.
To add a new pad:
1) Right click anywhere on the pageframe of the menu area.
2) Select Add Pad...
3) In the Menu Pad Item Builder that appears, either select an existing
class to edit or create a new subclass. Then select the class you want
that pad to be an instance of.
4) You may the close the Menu Pad Item Builder.
5) You may edit the caption of the pad, right click over the pad to
delete it, or you can launch the Menu Pad Builder. Note the Menu Popup
Builder has no specific functionality at this time, but may be used to save
the instance as a class, or to launch the Class Browser for that instance.
6) In the Menu Pad Builder, you many set the related Pad properties the
pad class. There is currently no special properties in the Pad page of the
builder.
To add a new bar:
1) Right click the pad relating to the popup to contain the new bar.
2) Select Add Bar...
3) In the Menu Bar Item Builder that appears, either select an existing
class to edit or create a new subclass. Then select the class you want
that bar to be an instance of.
4) You may the close the Menu Bar Item Builder. Note that the Menu Bar Item Builder allows the Click method of that bar to be edited in the Bar page of the Builder using an editbox.
5) You may edit the caption of the bar, right click over the bar to
delete it, or you can launch the Menu Pad Builder.
6) In the Menu Bar Builder, you many set the related Bar properties the
pad class.
To move a pad to a new location:
1) Drag the pad using the right mouse button over an existing pad or bar
to move the pad to the position before the target pad. All bars contained
in the pads popup will automatically be moved also to the new pad position.
To move a bar to a new location:
1) Drag the bar using the right mouse button over an existing bar to move
the bar to the position before the target bar, or drop the bar over an
existing pad to insert the bar in the first location of that popup.
To delete a pad:
1) Right click the pad to delete.
2) Select Delete Pad...
3) Select Yes in the confirmation dialog.
4) Note that the class relating to that pad will not be deleted, only the
instance for that menu class.
To delete a bar:
1) Right click the bar to delete.
2) Select Delete Bar...
3) Select Yes in the confirmation dialog.
4) Note that the class relating to that bar will not be deleted, only the
instance for that popup class.