{ BookMark.pas } program BookMark; {$IfDef VER80} uses SnipTool, SnipData, SysUtils, WinTypes, WinProcs, DbiProcs, DbiTypes, DbiErrs; {$Else} uses WinTypes, WinCrt, Strings, DbiProcs, DbiTypes, DbiErrs, SnipTool, SnipData; {$EndIf} const szTblName = 'customer'; { Name of table to be opened. } szTblType = szPARADOX; { Table type to use. } {===================================================================== Procedure: BookMark(); Input: None. Return: None. Description: This example shows how to save the current position within a cursor (the current record). The position within the cursor will then be changed and reset to that location. Note: A bookmark only works with the current cursor. If the cursor is changed - such as changing the active index, then the bookmark may become corrupt or invalid. Therefore, if you switch indexes you will need to regenerate the bookmark. ===================================================================== } var hDb: hDBIDb; { Handle to the database } hCur: hDBICur; { Handle to the table } TblProps: CURProps; { Table properties } const pBookBuf: pBYTE = nil; { Pointer to the bookmark } begin Screen('*** BookMark Example ***'); Screen(''); Screen(' Initializing IDAPI... '); if (InitAndConnect(hDb) <> DBIERR_NONE) then { Terminate example if } begin { Initialization fails } Screen(''); Screen('*** End of Example ***'); exit; end; Screen(' Setting the Database directory... '); ChkRslt(DbiSetDirectory(hDb, pCHAR(szTblDirectory)), DBIERR_NONE, ' Error - SetDirectory.'); Screen(' Opening the '+szTblName+' table... '); if (ChkRslt(DbiOpenTable(hDb, pCHAR(szTblName), pCHAR(szTblType), nil, nil, 0, dbiREADWRITE, dbiOPENSHARED, xltFIELD, FALSE, nil, hCur), DBIERR_NONE, ' Error - OpenTable.') <> DBIERR_NONE) then begin Screen(' Close the Database and exit IDAPI... '); CloseDbAndexit(hDb); Screen(''); Screen('*** End of Example ***'); exit; end; { Get the properties of the table so that we can create the correct bookmark size for the present condition of the table. Since the bookmark is cursor related it can change with any change to the cursor, such as a change to the index or filters. } ChkRslt(DbiGetCursorProps(hCur,TblProps), DBIERR_NONE, ' Error - GetCursorProperties.'); { Move forward one record } ChkRslt(DbiGetNextRecord(hCur, dbiNOLOCK, nil, nil), DBIERR_NONE, ' Error - GetNextRecord.'); Screen(' Displaying the first record in the table...'); ChkRslt(DisplayNextRecord(hCur), DBIERR_NONE, ' Error - DisplayNextRecord.'); Screen(''); Screen(' Jumping to the third record in the table... '); ChkRslt(DbiGetRelativeRecord(hCur, 2, dbiNOLOCK, nil, nil), DBIERR_NONE, ' Error - GetRelativeRecord.'); { Create the bookmark buffer. The size comes from the table property BookMarkSize. } GetMem (pBookBuf, TblProps.iBookMarkSize); if not Assigned(pBookBuf) then begin Screen(' Error: Out of memory.'); CloseDbAndexit(hDb); Screen(''); Screen('*** End of Example ***'); exit; end; { Display the record that we will set a bookmark on. } Screen(' Getting a bookmark on this record...'); ChkRslt(DbiGetBookMark(hCur, pBookBuf), DBIERR_NONE, ' Error - GetBookMark.'); ChkRslt(DisplayNextRecord(hCur), DBIERR_NONE, ' Error - DisplayNextRecord.'); Screen(''); Screen(' Jumping to the end of the table...'); ChkRslt(DbiSetToEnd(hCur), DBIERR_NONE, ' Error - SetToend. '); { Set to end moves past the last record } ChkRslt(DbiGetPriorRecord(hCur, dbiNOLOCK, nil, nil), DBIERR_NONE, ' Error - DbiGetPriorRecord.'); Screen(' Display the record...'); ChkRslt(DisplayCurrentRecord(hCur), DBIERR_NONE, ' Error - DisplayCurrentRecord.'); Screen(''); Screen(' Going back to the bookmarked record...'); ChkRslt(DbiSetToBookMark(hCur, pBookBuf), DBIERR_NONE, ' Error - SetToBookMark.'); Screen(' Displaying the bookmarked record...'); ChkRslt(DisplayNextRecord(hCur), DBIERR_NONE, ' Error - DisplayNextRecord.'); Screen(''); Screen(' Close the Table ...'); ChkRslt(DbiCloseCursor(hCur), DBIERR_NONE, ' Error - CloseCursor.'); FreeMem(pBookBuf, TblProps.iBookMarkSize); Screen(' Close the database and exit IDAPI...'); CloseDbAndexit(hDb); Screen(''); Screen('*** End of Example ***'); end.