Beispiel - switch / EvtMouseItem / EvtLstDataInit
Beispiel - switch / EvtMouseItem / EvtLstDataInit Mehrfachauswahl in einem RecList-Objekt
In diesem Beispiel soll die Implementierung einer Mehrfachauswahl in einem RecList -Objekt vorgestellt werden.
Die Datei, deren Datensätze in der RecList angezeigt werden, wurde um ein logisches Feld erweitert. Dieses Feld hat den Wert true, wenn der Datensatz selektiert ist, andernfalls den Wert false. Damit die hier vorgestellten Funktionen auch für RecList-Objekt in anderen Dateien verwendet werden können, wurde der Name des logischen Feldes in der Eigenschaft Custom des RecList-Objektes hinterlegt.
In dem Ereignis EvtMouseItem werden die Mausaktionen verarbeitet. Um einen selektierten Datensatz zu kennzeichnen, wird in der Funktion EvtLstDataInit die Hintergrundfarbe der markierten Datensätze verändert. Die beiden Funktionen müssen den entsprechenden Ereignissen des RecList-Objektes zugewiesen werden.
Im switch-Konstrukt des Ereignisses EvtMouseItem wird nicht wie üblich ein Ausdruck (angegeben hinter dem switch) mit mehreren Konstanten (angegeben hinter dem case) verglichen, sondern das Prinzip umgekehrt. Eine Konstante wird mit mehreren Ausdrücken verglichen. In diesem speziellen Fall können so mehrere Übergabeparameter in einem switch-Konstrukt überprüft werden.
Folgende Fälle werden unterschieden:
- Datensatz mit rechter Maustaste angeklickt In dem angeklickten Datensatz wird das Markierungsfeld verändert. Ein nicht markierter Satz wird markiert, bei einem markiertem Satz wird die Markierung entfernt.
- Datensatz mit linker Maustaste doppelt angeklickt Der angeklickte Datensatz wird in einem Dialog angezeigt. Wird der Dialog mit der OK-Taste verlassen, wird der Datensatz zurückgeschrieben. Wird der Dialog abgebrochen, erfolgt keine Speicherung des Datensatzes.
Bei allen Datensatz-Befehlen wurde aus Gründen der Einfachheit, die Überprüfung der Ergebnisse der Datensatzoperationen weggelassen.
In dem Ereignis EvtLstDataInit wird Aufgrund des Markierungsfeldes die Hintergrund Farbe der Spalten gesetzt. Die Spalten werden dabei über eine Schleife ermittelt.
sub EvtMouseItem
(
aEvt : event; // Ereignis
aButton : int; // Maustaste
aHitTest : int; // Hittest-Code
aItem : int; // Spalte oder Gantt-Interval
aID : bigint; // RecID nur bei RecList
) : logic;
local
{
tHdlFrame : int;
}
{
switch (true)
{
case ((aButton = _WinMouseRight) and (aHitTest = _WinHitLstView)) :
{
// Datensatz mit rechter Maustaste angeklickt -> Markierung ändern
RecRead(aEvt:Obj->wpDbFileNo, 0, _RecLock, aID);
// Markierungsfeld ermitteln und ändern
FldDefByName(aEvt:Obj->wpCustom, !FldLogicByName(aEvt:Obj->wpCustom));
RecReplace(aEvt:Obj->wpDbFileNo, _RecUnlock);
// Liste aktualisieren
aEvt:Obj->WinUpdate(_WinUpdOn, _WinLstFromTop);
}
case ((aButton = _WinMouseLeft | _WinMouseDouble) and (aHitTest = _WinHitLstView)) :
{
// Datensatz mit linker Maustaste doppelt geklickt -> Datensatz ändern
RecRead(aEvt:Obj->wpDbFileNo, 0, _RecLock, aID);
// Frame der RecList ermitteln
tHdlFrame # aEvt:Obj->WinInfo(_WinRoot);
// Dialog zum Ändern des Datensatzes aufrufen
if (WinDialog('frmRecord', _WinDialogCenter, tHdlFrame) = _WinIdOk)
{
// Dialog mit [OK] verlassen -> Datensatz speichern
RecReplace(aEvt:Obj->wpDbFileNo, _RecUnlock);
}
else
{
// Dialog mit [Abbrechen] oder [X] verlassen -> Änderungen verwerfen
RecRead(aEvt:Obj->wpDbFileNo, 0, _RecUnlock, aID);
}
// Liste aktualisieren
aEvt:Obj->WinUpdate(_WinUpdOn, _WinLstFromTop);
}
}
return(true);
}
sub EvtLstDataInit
(
aEvt : event; // Ereignis
aRecID : bigint; // Record-ID des Datensatzes.
) : logic;
local
{
tFgColor : int;
tBkgColor : int;
tHdlClm : int;
}
{
RecRead(aEvt:Obj->wpDbFileNo, 0, _RecId, aRecID);
if (FldLogicByName(aEvt:Obj->wpCustom))
{
// Datensatz ist markiert -> Farbe ändern
tFgColor # _WinColWhite;
tBkgColor # _WinColLightBlue;
}
else
{
// Datensatz ist nicht markiert -> Farbe nicht verändern
tFgColor # _WinColParent;
tBkgColor # _WinColParent;
}
// Spaltenfarbe für alle Spalten setzen
tHdlClm # aEvt:Obj->WinInfo(_WinFirst);
while (tHdlClm != 0)
{
tHdlClm->wpClmColFg # tFgColor;
tHdlClm->wpClmColBkg # tBkgColor;
tHdlClm # tHdlClm->WinInfo(_WinNext);
}
return(true);
}