Die OO-4-WIN Klassenbibliothek ist für Programmierer gedacht, die mit der
CLIP-4-WIN
Library von John Skelton arbeiten. OO-4-Win bietet umfangreiche GUI-Klassen für das
einfache Erstellen von Windows-Programmen.
Die OO-4-WIN ist eine auf TopClass basierende, objektorientierte Klassenbibliothek.
(TopClass ist Bestandteil der CLIP-4-WIN Librarys von John Skelton)
Syntax:
LR_APP{cClassName, cCaptionText}
Beispiel:
.
.
.
oApp := LR_APP{"Adressen", ;
"Adressen Demo Programm}
.
.
.
Syntax:
LR_BROWSE{ hWndParent | oParent, ID_LISTBOX, nArea | aBrowse,
aDBFelder, cBrowserName }
hWndParent: Parent - Fensterbezug
- oder -
oParent: Parent - Dialogobjekt
ID_LISTBOX: ID Der Listbox, die das LR_Browseobjekt aufnimmt
nArea: Arbeitsbereich für die Datenbank
- oder -
aBrowse: Array, auf dem gebrowsed werden soll
aDBFelder: Beschreibendes Array für die Anzeige des
Browsers
cBrowserName: Eindeutige Zeichenkette, um die
Benutzereinstellungen abzuspeichern
Bild 1: ein Objekt der Klasse LR_BROWSE
Bild 2: Änderung der Spaltenanordnung
Bild 3: Änderung der Spaltenbreite
Beispiel:
LOCAL aDBFelder := {}
AADD(aDBFelder, {"NAME", "C", NO_EDIT,;
GetFieldWidth(::hwnd, 30), "Name", NO_BITMAP})
AADD(aDBFelder, {"VNAME", "C", NO_EDIT,;
GetFieldWidth(::hwnd, 20), "Vorname", NO_BITMAP})
AADD(aDBFelder, {"PLZ", "C", NO_EDIT,;
GetFieldWidth(::hwnd, 5), "PLZ", NO_BITMAP})
AADD(aDBFelder, {"ORT", "C", NO_EDIT,;
GetFieldWidth(::hwnd, 40), "Ort", NO_BITMAP})
AADD(aDBFelder, {"STRASSE", "C", NO_EDIT,;
GetFieldWidth(::hwnd, 40), "Strasse", NO_BITMAP})
AADD(aDBFelder, {"TEL", "C", NO_EDIT,;
GetFieldWidth(::hwnd, 20), "Telefon", NO_BITMAP})
AADD(aDBFelder, {"FAX", "C", NO_EDIT,;
GetFieldWidth(::hwnd, 20), "Telefax", NO_BITMAP})
// Browserobjekt erzeugen
::oVListe := LR_Browse{;
self, ; // Parent Object
IDL_LISTBOX, ; // ID of Listbox in Dialog
::oPers:Area, ; // Workarea
aDBFelder, ; // Array of DBF Fields
"ADRDLG" ; // Unique String for saving
// Custom settings
}
Syntax:
LR_EDITDLG{ oParent, cnDlgName [, hDll ]}
oParent: Parentobjekt
cnDlgName: Numerische Templatebezug oder Resourcestring
hDll: optionaler Bezug auf die Instanz, die das Template
enthält. Default ist die Modulinstanz
( _GetInstance() ).
Bild 1: Dialog im Editiermodus. Das Editiericon wird automatisch im
Dialog eingefügt.
Syntax:
LR_HotKeys{ aHotKeyArray )
aHotKeyArray: Array von Arrays mit HotKeybeschreibung
aHotKeyArray kann folgende Elemente enthalten ( als Array! ):
1. Element: Extended Key Code
2. Element: Key
3. Element: Ausführungscodeblock
Beispiel:
oApp:oHotKeys := LR_HOTKEYS{HKHotKeys()}
FUNCTION HKHotKeys()
LOCAL aHotKeys := {}
AADD(aHotKeys, {TC_HK_NO_EXTEND, VK_F2, ;
{||PostMessage(oApp:hwnd, WM_COMMAND, ;
USR_EDIT, 0)}})
AADD(aHotKeys, {TC_HK_NO_EXTEND, VK_F3, ;
{||PostMessage(oApp:hwnd, WM_COMMAND, ;
USR_NEW , 0)}})
.
.
.
RETURN aHotKeys
Syntax:
LR_Index{ [cReorg | aReorg] [, cDatDir] [, lCloseApp] [, cIndexExt] }
cReorg: optionaler Name der Datenbank, die die
Indexerstellungsinformationen enthält
Default ist "INDEX.DBF"
- oder -
aReorg: Array mit Indexerstellungsinformationen
cDatDir: optionaler Datenpfad der Datenbanken
Default ist aktuelles Verzeichnis
lCloseApp: optionales Flag. Default ist .T.
cIndexExt: optionale Indexerweiterung. Default ist
INDEXEXT()
LR_Index sucht im aktuellen Verzeichnis nach der Datenbank
"INDEX .DBF". Die Datenbank ***MUSS*** folgende Struktur
haben:
DBF-> DATABASE : MSDOS Datenbankname
DBF-> INDEXFILE : MSDOS Indexdateiname
DBF-> INDEX : Indexschlüssel
Es kann auch alternativ ein Array mit Indexerstellungsinformationen
angegeben werden. Dieses Array ***MUSS*** folgende Struktur
haben:
{{cDBFName, cIndexName, cIndexKey}
[, {cDBFName, cIndexName, cIndexKey}]}
Hat lCloseApp den Wert .T., wird die Applikation beim Abbruch der
Indexerstellung durch den Benutzer beendet.
Klasse zur Erstellung beliebiger Indexdateien, inklusive grafische Darstellung
über den Fortschritt der Indexerstellung (Progress Bar)
Beispiel:
LR_INDEX():Init()
Syntax:
LR_MASKED{ hControl, cInitValue, cPicture, ;
bPreBlock, bPostBlock, bRetBlock }
hControl: Fensterbezug auf das Dialogelement, welches die
Maskierung enthalten soll.
cInitValue: Initaler Wert des Dialogelements.
cPicture: Pictureklausel.
bPreBlock: Codeblock der ausgeführt wird, bevor das
Dialogelement den neuen Wert enthält.
bPostBlock: Codeblock der ausgeführt wird, nachdem das
Dialogelement den neuen Wert enthält.
bRetBlock: Codeblock der beim Drücken der Returntaste
ausgeführt wird.
Beispiel:
LR_MASKED{GetDlgItem(::hwnd, 1008),SPACE(5),'99999'}
Hier wird ein Editcontrol eines Dialogs mit der ID 1008 maskiert. Der maximale
Eingabelänge beträgt fünf Zeichen, der Initialisierungswert sind
fünf Leerzeichen und es können nur Numerische Zeichen eingegeben
werden.
Syntax:
LR_MSG{ cMessage [, hFocus][, Timer]}
cMessage: Die anzuzeigende Zeichenkette
hFocus: optionaler Fensterbezug, der nach Schliessen
der Meldung den Fokus bekommen soll
nTimer : optionaler Timeout in Sekunden, nachdem die
Meldung automatisch beendet wird. Default ist 20
Sekunden
Beispiel:
LR_MSG():Init("Bitte geben Sie den Nachnamen ein",;
GetDlgItem(::hwnd, 101))
oder
oMsg :=LR_MSG{"Bitte geben Sie den Nachnamen ein",;
GetDlgItem(::hwnd, 101)}
Syntax:
LR_NETTABLE{oParent, cDBF, lShared, lNew, lReadOnly, aIndex}
oParent: Parentobjekt
cDBF: Datenbankname
lShared: .F. -> Datenbank wird EXCLUSIVE geöffnet
.T. -> Datenbank SHARED geöffnet
Default ist .T.
lNew: .T. -> neuer Arbeitsbereich wird benutzt
.F. -> vorhandener Arbeitsbereich wird benutzt
Deafault ist .T.
lReadOnly: .F. -> Datenbank wird readwrite geöffnet
.T. -> Datenbank wird readonly geöffnet
Default ist .F.
aIndex: Array mit Indexnamen, die mit der Datenbank
cDBF geöffnet werden. Das erste Element dieses
Arrays ist der führende Index
Beispiel:
LOCAL aIndex := {}, oPers
AADD(aIndex, "ADR1")
AADD(aIndex, "ADR2")
oPers := LR_NETTABLE{self, "ADR",,,,aIndex}
IF !oPers:lOK
// Datenbank kann nicht geöffnet werden.
ErrorHandler(1)
RETURN self
ENDIF
Syntax:
LR_OD_BUTTON{ hwnd, IDButton, cBmp_unpressed, ;
cBmp_pressed, hDLL)
hwnd: Fensterbezug des Parent, auf dem der Button liegt
IDButton: Button ID
cBmp_unpressed: Bitmapresourcestring des ungedrückten Buttons
cBmp_pressed: Bitmapresourcestring des gedrückten Buttons
hDLL: Handle auf Bitmapresource (z.B. eine DLL)
Default ist _GetInstance().
Beispiel:
LR_OD_BUTTON():Init( ::hwnd, ;
1041, ;
"SEARCH_U", ;
"SEARCH_P", ;
hBtnDll)
Syntax:
LR_STATUSBAR{ [oParent] [, aText] [, u_WM] }
oParent: optinonaler Bezug auf das Parentobjekt.
Default ist oApp.
aText: optionales Array mit
Statusbaranzeigeinformationen.
Default ist linksbündiger Infotext und rechtsseitige
Tastaturzustandsanzeige für
Einfügen/Überschreiben, NUM-Lock und
Feststelltaste.
u_WM: optionale Nachrichtennummer, die bei einer
Mausaktion ( Bewegen der Maus über und Klicken
auf die Statusbar ) an das Hauptfenster geschickt
wird. Default ist WM_STATUSBAR.
Bild: Standard Anzeige der StatusBar beinhaltet:
· Linksbündiger Infotext
· Tastaturzustandsanzeige für Einfügen/Überschreiben,
NUM-Lock und Feststelltaste
Beispiel:
oApp:oStatusBar := LR_StatusBar{}
Syntax:
LR_TABDLG{ oParent, cnDlgName [, hDll ]}
oParent: Parentobjekt
cnDlgName: Numerische Templatebezug oder Resourcestring
hDll: optionaler Bezug auf die Instanz, die das Template
enthält. Default ist die Modulinstanz
( _GetInstance() ).
Bild: Tabbed Dialog mit zwei TAB Reitern
Bild: Dialogschablone (Template) und Definition des ersten TABs im Resource Bereich
Bild: Definition des zweiten TABs im Resource Bereich
Die einzelnen TABs werden im Dialog durch Gruppenrahmen definiert, deren ID
ganzahlig durch 1000 teilbar sind. Der Text auf den TAB Reitern entspricht dem Text
des Gruppenrahmens. Alle Kontrollelemente, die mit einem TAB geschaltet werden
sollen müssen numerisch im ID Bereich des TAB reiters liegen ( TAB: 1000,
Kontrollelemente 1001, 1005, 1010 ; TAB 2000, Kontrollelemente 2001, 2006 2024,
usw)
Syntax:
LR_Tip{ cTipText, x, y}
cTipText: Text, den das Tipobjekt anzeigen soll
x: x - Koordinate des Tipobjekts
y: y - Koordinate des Tipobjekts
Beispiel:
.
.
.
case wparam == SB_THUMBTRACK
i := C4W_LoWord(lparam)
GetCurPos(@aPT)
aPT[1] += GetSystemMetrics(SM_CXCURSOR)/2
aPT[2] += GetSystemMetrics(SM_CYCURSOR)/2
IF ::oTip == NIL
::oTip := LR_Tip{"Datensatz "+ALLTRIM(STR(i)),;
aPT[1], aPT[2]}
ELSE
::oTip:MoveTip("Datensatz "+ALLTRIM(STR(i)),;
aPT[1], aPT[2])
ENDIF
.
.
.
Syntax:
LR_TOOLBAR{ aButtons [, hInstance] }
aButtons: Array von Array(s) für die Buttonbeschreibung
hInstance: optionaler Instanzbezug für die Buttonbitmaps
( typischerweise DLL - Handle).
Das aButtonsarray ***MUSS*** folgende Struktur haben:
1. Element: ResourceString des Bitmaps für den ungedrückten
Zustand des Buttons.
2. Element: ResourceString des Bitmaps für den gedrückten
Zustand des Buttons.
3. Element: CodeBlock der nach dem Drücken des Buttons
ausgeführt wird.
4.Element: Numerischer Resourcenbezug für den
buttonbezogenen ToolTip - String.
Ist dieser Wert NIL, wird kein ToolTip angezeigt.
5.Element: Numerischer Resourcenbezug für den
statusbarbezogenen Infotext - String.
Ist dieser Wert NIL, wird kein Infotext angezeigt.
6. Element: ToolBarButton - Stil.
Dieser Stil ist einer bzw. eine sinnvolle Kombination
vom folgenden Werten:
TC_BUTTON : Arrayelement ist ein Button
TC_SEPARATOR : Arrayelement ist ein Separator
TCF_DISABLED : Button ist disabled ( grau )
TCF_ENABLED : Button ist enabled ( aktiv,
default)
Bild: Toolbar des Adressen Demo Programms. Die Buttons 2 bis 9 sind inaktiv
geschaltet, da der Adressendialog nicht aktiv ist.
Bild: Toolbar während aktivem Adressendialog. Die Buttons 2 bis 9 sind aktiv.
Beispiel:
.
.
.
oApp:oToolBar := LR_Toolbar{TBButtons()}
.
.
.
FUNCTION TBButtons()
LOCAL aButtons := {}
// Adressendialog aufrufen
AADD(aButtons, {"BU_ADR_U", "BU_ADR_P", ;
{||PostMessage(oApp:hwnd, WM_COMMAND, ;
IDD_ADR_DIALOG, 0)}, ;
TOOLTIP_ADR, STATUSBAR_ADR, TC_BUTTON})
// Separator
AADD(aButtons, {NIL, NIL, NIL, NIL, NIL, TC_SEPARATOR})
// Editieren
AADD(aButtons, {"BU_EDIT_U", "BU_EDIT_P", ;
{||PostMessage(oApp:hwnd, WM_COMMAND, ;
USR_EDIT, 0)}, ;
TOOLTIP_EDIT, STATUSBAR_EDIT, ;
TC_BUTTON + TCF_DISABLED})
.
.
.
RETURN aButtons
Syntax:
LR_WDIALOG{ oParent, cnDlgName [, hInstDll] }
oParent: Parentobjekt
cnDlgName: Numerische Templatebezug oder Resourcestring
hDll: optionaler Bezug auf die Instanz, die das Template
enthält. Default ist die Modulinstanz
( _GetInstance() ).
Beispiel:
oInfo := LR_WDIALOG{self, "TC_INFO"}