Beispiel - Editieren in einem RecList-Objekt
Beispiel - Editieren in einem RecList-Objekt Eintrag in einem RecList-Objekt ändern
- Siehe:
WinLstEdit (),EvtLstEditStart,EvtLstEditCommit,EvtLstEditFinished
In diesem Beispiel wird gezeigt, wie ein Eintrag in einem RecList -Objekt verändert werden kann.
Das Beispiel besteht aus fünf Funktionen:
- main In dieser Funktion wird der verwendete Dialog angezeigt.
- sub EvtMouseItem Das Anklicken eines Datensatzes führt zum Editieren der angeklickten Spalte.
- sub EvtLstEditStart Der entsprechende Datensatz wird gesperrt.
- sub EvtLstEditCommit Die Änderungen am Datensatz werden übernommen oder verworfen.
- sub EvtLstEditFinished Der Datensatz wird gespeichert und entsperrt.
main
In dieser Funktion wird lediglich das Fenster des Beispiels geladen und angezeigt. Das Fenster beinhaltet nur ein RecList -Objekt. Dem Objekt sind in den Ereignissen EvtMouseItem, EvtLstEditStart, EvtLstEditCommit und EvtLstEditFinished die entsprechenden Ereignis-Funktionen zugeordnet.
@A+
@C+
main
{
WinDialog('RecListEdit');
}
sub EvtMouseItem
In diesem Ereignis wird der Editiervorgang gestartet.
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;
{
Zunächst wird überprüft, ob mit der Maus ein Datensatz doppelt angeklickt wurde. Damit die Funktion später einfacher erweitert werden kann, erfolgt die Prüfung innerhalb eines switch...case...default-Konstruktes.
switch (true)
{
case ((aButton = _WinMouseLeft | _WinMouseDouble) and
(aHitTest = _WinHitLstView)) :
{
Mit dem Befehl WinLstEdit () wird der Editiervorgang gestartet. Der Befehl benötigt den Deskriptor des RecList-Objekts (aEvt :Obj) und der angeklickten Spalte (aItem).
WinLstEdit(aEvt:Obj, aItem);
}
}
return(true);
}
Der Befehl WinLstEdit () löst das Ereignis EvtLstEditStart aus.
sub EvtLstEditStart
In diesem Ereignis werden die Vorbereitungen zum Editieren getroffen. In diesem Beispiel wird dabei lediglich der aktuell selektierte Datensatz in der Liste gelesen und gesperrt. Hier können aber auch ComboBoxen mit Inhalten gefüllt werden.
sub EvtLstEditStart
(
aEvt : event; // Ereignis
aColumn : int; // Spalte
aEdit : int; // Eingabefeld
aList : int; // Datalist
) : logic;
{
Die Datensatz-ID des aktuell in der Liste selektierten Datensatzes ist in der Eigenschaft DbRecID des RecList -Objekts enthalten. In dem Übergabeparameter aEvt :Obj wird der Deskriptor des RecList -Objekts übergeben. Die notwendigen Informationen zum Lesen des Datensatzes können so aus den Eigenschaften der Liste entnommen werden.
RecRead(aEvt:Obj->wpDbFileNo, 0, _RecID | _RecLock, aEvt:Obj->wpDbRecID);
return(true);
}
Der Deskriptor des Eingabeobjektes wird in dem Parameter (aEdit) übergeben. Mit Hilfe dieses Deskriptors können die Eigenschaften des Eingabeobjektes (Farben, Standardwert usw.) verändert werden.
sub EvtLstEditCommit
Das Ereignis EvtLstEditCommit wird aufgerufen, sobald der Eingabefokus das Eingabeobjekt verlässt. Die Taste, mit der das Objekt verlassen wurde, wird als Parameter (aKey) der Funktion übergeben. Der Rückgabewert der Funktion entscheidet darüber, ob der Inhalt des Eingabeobjektes in die Liste übertragen wird. In diesem Beispiel wird der Inhalt des Eingabeobjektes nur dann nicht in die Liste übertragen, wenn der Benutzer das Objekt mit der Taste verlässt.
sub EvtLstEditCommit
(
aEvt : event; // Ereignis
aColumn : int; // Spalte
aKey : int; // Taste
aFocusObject : int;
) : logic;
{
return(aKey != _WinKeyEsc);
}
sub EvtLstEditFinished
Nach dem Ereignis EvtLstEditCommit wird das Ereignis EvtLstEditFinished aufgerufen. Hier kann der Editiermodus abgeschlossen oder eine weitere Spalte der Liste editiert werden. In diesem Beispiel wird der gesperrte Datensatz zurückgeschrieben und der Editiermodus beendet.
sub EvtLstEditFinished
(
aEvt : event; // Ereignis
aColumn : int; // Spalte
aKey : int; // Taste
aRecID : bigint; // Datensatz-ID
aChanged : logic; // true, wenn eine Änderung vorgenommen wurde
) : logic;
local
{
tErg : int;
}
{
Unabhängig davon, ob Änderungen am Datensatz vorgenommen wurden, wird der Datensatz zurückgeschrieben. Die notwendigen Informationen werden aus den Eigenschaften der Liste gelesen. Anschließend wird die Liste aktualisiert, um den geänderten Datensatz anzuzeigen.
tErg # RecReplace(aEvt:Obj->wpDbFileNo, _RecUnlock);
aEvt:Obj->WinUpdate(_WinUpdOn, _WinLstFromSelected | _WinLstPosSelected | _WinLstRecDoSelect);
return(true);
}
Soll durch einfaches Anklicken einer Spalte mit einem logischen Wert dieser geändert werden, kann dazu nicht der Befehl WinLstEdit () verwendet werden. Der Befehl würde ein Eingabeobjekt mit einer ComboBox erzeugen. Statt dessen kann in dem Ereignis EvtMouseItem der einfache Klick abgefangen und die notwendigen Operationen zum Ändern des Datensatzes durchgeführt werden.