Bibliotheken

Inhalt

Allgemeines

Basisklasse einer Applikation (LR_APP)

Datenbank / Arraybrowser (LR_BROWSE)

Editierbare Dialogklasse (LR_EDITDLG)

Hotkey-Klasse (LR_HOTKEYS)

Indexdatei-Klasse (LR_INDEX)

Maskierung von Editelementen (LR_MASKED)

nichtmodale Messagebox (LR_MSG)

netzwerkfähige Datenbank-Klasse
(LR_NETTABLE)

selbstzeichnende Schalter (Ownerdraw Buttons)
(LR_OD_BUTTON)

Statuszeile (Status Bar) (LR_STATUSBAR)

Dialoge mit TAB Reitern (Tabbed Dialoges) (LR_TABDLG)

Hinweise durch Tip-Fenster (Tool Tips) (LR_TIP)

Schalterleiste (Tool Bar) (LR_TOOLBAR)

Basisklasse für Dialoge (LR_WDIALOG)

Beispiel:
Adressenverwaltung (inkl. Quellcode!)
Einführung
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)
Beschreibung der einzelnen Klassen
Klasse für die Verwaltung von Applikationen -
LR_APP
Applikationsklasse, die alle notwendigen Aufgaben zur korrekten Erzeugung,
Verwaltung und Beendigung einer Applikation übernimmt, inklusive 3D Effekte,
Focusumschaltung zwischen aktiven Dialogen und dem Hauptfenster, Behalten von
Position/Größe und automatische Anpassung an die Windowsfarben.
Syntax:
LR_APP{cClassName, cCaptionText}

Beispiel:
.
.
.
oApp := LR_APP{"Adressen", ;
"Adressen Demo Programm}
.
.
.

zum Inhaltsverzeichnis
Klasse für das Betrachten von
Datenbankinhalten - LR_BROWSE
Datenbank / Arraybrowser, der nicht nur Datenbankfelder oder Arrayelemente
anzeigen kann, sondern auch Bitmaps in den Listenelementen, inklusive frei
konfigurierbare Spaltenbreite, Spaltenanordnung, Spaltenuntermengenbildung und
Umschaltung von Editier / Nichteditiermodus während der Laufzeit. Des weiteren
können im Editiermodus einzelne Spalten als nichteditierbar markiert werden. Die
zur Zeit unterstützten RDDs sind DBFNTX (CA-CLIPPER dBase) und DBFNTXAX
(Advantage Database Server von Extend Systems)
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
}

zum Inhaltsverzeichnis
Klasse für Datenbankdialoge -
LR_EDITDLG
Eine von TC_WDIALOG abgeleitete Dialogklasse, die alle notwendigen
Mechanismen für das Lesen, Speichern, Hinzufügen und Löschen von
(Datenbank-) Daten beinhaltet. Dazu gehört auch die vollautomatische
Überwachung der Veränderung der Daten und die Reaktion auf die
Veränderung
(Anzeige entsprechender Hinweisdialoge)
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.

zum Inhaltsverzeichnis
Klasse für Datenbankdialoge -
LR_HOTKEYS
Sehr einfach zu definierende Hotkeys, die natürlich nicht nur auf dem
Hauptfenster der Applikation funktionieren (wie die Accelerators), sondern auch auf
allen Dialogen
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

zum Inhaltsverzeichnis
Klasse für Datenbankdialoge -
LR_INDEX
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()

zum Inhaltsverzeichnis
Klasse für Datenbankdialoge -
LR_MASKED
Klasse zur Maskierung von Editelementen (PICTURE Klauseln)
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.

zum Inhaltsverzeichnis
Klasse für Datenbankdialoge -
LR_MSG
Klasse zur Ausgabe einfacher nicht modaler Dialoge. Enspricht nicht modaler
MessageBox
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)}

zum Inhaltsverzeichnis
Klasse für Datenbankdialoge -
LR_NETTABLE
Datenbank Klasse, inklusive Netzwerkunterstützung und Indexe
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

zum Inhaltsverzeichnis
Klasse für Datenbankdialoge -
LR_OD_BUTTON
Klasse zur Erzeugung von Ownerdraw Buttons
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)

zum Inhaltsverzeichnis
Klasse für Datenbankdialoge -
LR_STATUSBAR
Sehr einfach zu definierende Statuszeile, inklusive konfigurierbare Anzeigen über
Numlockstatus, Einfügen/Überschreiben, Rolltaste und Capslockstatus
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{}

zum Inhaltsverzeichnis
Klasse für Datenbankdialoge -
LR_TABDLG
Eine von TC_EDITDLG abgeleitete Dialogklasse für mehrzeilige "Tabbed Dialoge".
Die Definition der einzelnen TAB-Reiter geschieht vollständig grafisch im
Resource Bereich. Der Programmierer muß dafür keine einzige Zeile Code
schreiben !
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)

zum Inhaltsverzeichnis
Klasse für Datenbankdialoge -
LR_TIP
Tip Klasse
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
.
.
.

zum Inhaltsverzeichnis
Klasse für Datenbankdialoge -
LR_TOOLBAR
Sehr einfach zu definierende ToolBar, inklusive konfigurierbare ToolTips und
Statuszeilenhilfe.
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

zum Inhaltsverzeichnis
Klasse für Datenbankdialoge -
LR_WDIALOG
Basis Dialogklasse, die alle notwendigen Aufgaben zur korrekten Erzeugung,
Verwaltung und Beendigung von Dialogen übernimmt, inklusive Behalten von
Position/Größe und automatische Anpassung an die Windowsfarben
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"}

zum Inhaltsverzeichnis
|