Files
TeslaRel410/BORLAND/BDE/EXAMPLES/C/ADDRESS/ADR_DLGS.C
T
CydandClaude Fable 5 63312e07f9 source410: literal 4.10 source reconstruction + BC++ 4.52 fleet toolchain archived
- BORLAND/: Borland C++ 4.52 (chosen over 4.5 by byte-match: CODE/RP/CW32.LIB
  is identical to 4.52's install lib). BCC32/TLINK32/TLIB/MAKE run natively on
  Win11; CODE/BT/OPT.MAK is the shipped BTL4OPT.EXE's exact flag recipe
  (extender = Borland PowerPack DPMI32, not Phar Lap TNT).
- restoration/source410/: the literal 1995-form reconstruction of the missing
  BT game source (never mixed into CODE/). Round 1-3 state:
  * 6 of 10 surviving original TUs COMPILE CLEAN under the period toolchain
    (BTMSSN, BTCNSL, BTSCNRL, BTTEAM, BTL4MODE, BTL4ARND) - first builds
    since 1996.
  * BT_L4/BTL4APP.CPP pilot reconstruction: 12/12 functions, Fail() lands on
    its binary-recorded line 400 exactly.
  * BT/BTCNSL.HPP: console wire IDs recovered from the binary's ctors
    (Killed=9, Damaged=10, ScoreUpdate=13, DeathWithoutHonor=15 [T1];
    TeamScore=12 flagged [T4]).
  * MUNGA/: 8 engine-header backfills back-dated from the BT412 WinTesla tree
    (VDATA numbering decomp-verified; AUDREND's OpenAL-era virtual removed -
    the period compiler is the drift detector).
  * Tooling: backdate.py (WinTesla->1995 header transform), compile410.sh
    (per-TU verification sweep under authentic OPT.MAK flags).
  * README: corrected roadmap - MECH.HPP is the capstone grown with the mech
    TU reconstructions; BTREG.CPP green = the header-family milestone.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 07:33:26 -05:00

732 lines
28 KiB
C++

// BDE - (C) Copyright 1994 by Borland International
#include "address.h"
//======================================================================
// Name: EditSubClassProc()
//
// Input: hWnd, msg, wParam, lParam
//
// Return: It returns the result of the procedure. It can return the
// result of the original edit control if the WM_CHAR is not a
// tab character.
//
// Desc: This routine will process all I/O for the Comments edit
// control. It does this by first checking if the tab key was
// hit inside of the comment edit control. If it was it moves
// control to the next control item and then does NOT let the
// original edit control process the message. However, if the
// WM_CHAR is not a tab then it lets the original edit control
// process the message.
//======================================================================
long FAR _pascal _export
EditSubClassProc(HWND hWnd, WORD msg, WORD wParam, LONG lParam)
{
LRESULT lResult = 0;
BOOL bCallOrigWndProc = TRUE;
switch (msg)
{
case WM_CHAR:
if(wParam == '\t')
{
if(GetKeyState(VK_SHIFT)<0)
{
SetFocus(GetDlgItem(hMainWnd, IDE_LAST_DATE));
}
else
{
if(!NewRecMode)
{
SetFocus(GetDlgItem(hMainWnd, ID_ORDER));
SendMessage(GetDlgItem(hMainWnd, ID_ORDER),
BM_SETSTYLE, (UINT16)BS_DEFPUSHBUTTON,
1L);
}
else
{
SetFocus(GetDlgItem(hMainWnd, IDOK));
SendMessage(GetDlgItem(hMainWnd, IDOK), BM_SETSTYLE,
(UINT16)BS_DEFPUSHBUTTON, 1L);
}
}
bCallOrigWndProc = FALSE;
}
break;
}
if(bCallOrigWndProc)
{
lResult = CallWindowProc((WNDPROC)_wpOrigWndProc, hWnd, msg, wParam,
lParam);
}
return(lResult);
}
//======================================================================
// Name: AboutDlg()
//
// Input: hWnd, msg, wParam, lParam
//
// Return: TRUE - Dialog Created.
// FALSE - Dialog Failed to create.
//
// Desc: This routine will process all I/O for the ABOUT dialog.
//======================================================================
BOOL FAR _pascal _export
AboutDlg (HWND hWnd, WORD msg, WORD wParam, LONG lParam)
{
BOOL bRet = FALSE;
// Done to clear the unused warning.
lParam = lParam;
switch (msg)
{
case WM_COMMAND:
switch (wParam)
{
case IDOK:
case IDCANCEL:
bRet = TRUE;
EndDialog(hWnd, bRet);
break;
}
break;
}
return(bRet);
}
//======================================================================
// Name: OrderDlg()
//
// Input: hWnd, msg, wParam, lParam. The lParam here also contains
// the pointer to the cursor during the WM_INITDIALOG.
//
// Return: TRUE - The Index was set.
// FALSE - Index failed or user canceled the dilaog box.
//
// Desc: This routine will process all I/O for the dialog that will
// change the order of the table (i.e. place an index).
//======================================================================
BOOL FAR _pascal _export
OrderDlg (HWND hWnd, WORD msg, WORD wParam, LONG lParam)
{
static phDBICur phCur;
static hDBIDb hDb;
static CHAR szStartIndex[DBIMAXNAMELEN];
static UINT16 iStartIndex = 0;
static pABIDXDESC pABIdxDesc = NULL;
static UINT16 iNumIdxs = 0;
UINT32 lIndex = 0;
UINT32 lSel = 0;
BOOL bRet = FALSE;
hErrorWnd = hWnd;
switch (msg)
{
case WM_INITDIALOG:
// Get the cursor and database from the lParam of the dialog
// box. It was sent in when creating the dialog box.
phCur = ((pAbHandles)(lParam))->phCur;
hDb = ((pAbHandles)(lParam))->hDb;
PostMessage(hWnd, WM_SETUP, 0, 0L);
return TRUE;
case WM_SETUP:
// Get the presently active index and fill the index structure
// with all the indexes that are open on the table.
if(FillIndexStr(*phCur, hDb, &pABIdxDesc, szStartIndex,
&iNumIdxs)!=DBIERR_NONE)
{
SendMessage(hWnd, WM_DESTROY, 0, 0L);
}
// Fill the list box with all the index names, and set
// the name of the current index in the edit control of the
// ComboBox.
iStartIndex = FillDropList(hWnd, IDE_ORDER_COMBOBOX, iNumIdxs,
pABIdxDesc, szStartIndex);
break;
case WM_DESTROY:
if(pABIdxDesc)
{
free(pABIdxDesc);
}
break;
case WM_COMMAND:
switch (wParam)
{
case IDE_ORDER_COMBOBOX:
// Add the item's position in the index array as an item
// data.
switch(HIWORD(lParam))
{
case CBN_SELCHANGE:
lSel=SendDlgItemMessage(hWnd,
IDE_ORDER_COMBOBOX,
CB_GETCURSEL, 0, 0L);
lIndex=SendDlgItemMessage(hWnd,
IDE_ORDER_COMBOBOX,
CB_GETITEMDATA, (WPARAM)lSel,
0L);
// Put the Index Key Expression in the static
// text box.
SetWindowText(GetDlgItem(hWnd, IDE_ORDER_INFO),
pABIdxDesc[(UINT16)lIndex].szKeyExp);
break;
}
break;
case IDOK:
// Get the selected item and its item data.
lSel=SendDlgItemMessage(hWnd, IDE_ORDER_COMBOBOX,
CB_GETCURSEL, 0, 0L);
lIndex=SendDlgItemMessage(hWnd, IDE_ORDER_COMBOBOX,
CB_GETITEMDATA, (WPARAM)lSel,
0L);
// Check if it is the original index or a new index.
if(iStartIndex != (UINT16)lIndex)
{
if(RangeSet)
{
if(WinMsg("You will lose the current Range "
"settings do you want to change "
"indexes anyway?", MB_ICONHAND,
MB_YESNO)== IDYES)
{
SetIndex(phCur, pABIdxDesc[(UINT16)lIndex]
.szTagName);
// Disable the Reset Range menu option.
EnableMenuItem(GetMenu(hMainWnd),
ID_CLEAR_RANGE, MF_GRAYED);
// Reset thge global RangeSet variable to
// FALSE.
RangeSet = FALSE;
bRet = TRUE;
}
else
{
bRet = FALSE;
}
}
else
{
SetIndex(phCur, pABIdxDesc[(UINT16)lIndex]
.szTagName);
bRet = TRUE;
}
}
else
{
bRet = FALSE;
}
EndDialog(hWnd, bRet);
break;
case IDCANCEL:
EndDialog(hWnd, bRet);
bRet = FALSE;
break;
}
break;
}
return(bRet);
}
//======================================================================
// Name: RangeDlg()
//
// Input: hWnd, msg, wParam, lParam. The lParam here also contains
// the pointer to the cursor during the WM_INITDIALOG.
//
// Return: TRUE - The Range was set.
// FALSE - Range failed or user canceled the dilaog box.
//
// Desc: This routine will process all I/O for the dialog that will
// change the Range of the present cursor AND Index.
//======================================================================
BOOL FAR _pascal _export
RangeDlg (HWND hWnd, WORD msg, WORD wParam, LONG lParam)
{
static phDBICur phCur;
static hDBIDb hDb;
static CHAR szStartIndex[DBIMAXNAMELEN];
static UINT16 iStartIndex;
static UINT16 iNumIdxs;
static RecordType *pHighRec = NULL;
static RecordType *pLowRec = NULL;
static pABIDXDESC pABIdxDesc = NULL;
BOOL bRet = FALSE;
BOOL bLowEmpty=FALSE;
BOOL bHighEmpty=FALSE;
CHAR szString[220];
BOOL bLowInclude;
BOOL bHighInclude;
UINT32 lRet;
UINT32 lIndex;
CHAR szTemp[ADDRESSLEN];
UINT16 iFldIndx=0;
UINT32 lSel;
hErrorWnd = hWnd;
switch (msg)
{
case WM_INITDIALOG:
// Get the cursor and database from the lParam of the dialog
// box. It was sent in when creating the dialog box.
phCur = ((pAbHandles)(lParam))->phCur;
hDb = ((pAbHandles)(lParam))->hDb;
PostMessage(hWnd, WM_SETUP, 0, 0L);
return TRUE;
case WM_SETUP:
// Get the presently active index,and fill the index structure
// with all the indexes that are open on the table.
if(FillIndexStr(*phCur, hDb, &pABIdxDesc, szStartIndex,
&iNumIdxs)!=DBIERR_NONE)
{
SendMessage(hWnd, WM_DESTROY, 0, 0L);
}
// Fill the list box with all the index names, and set
// the name of the current index in the edit control of the
// ComboBox.
iStartIndex = FillDropList(hWnd, IDE_RANGE_COMBO, iNumIdxs,
pABIdxDesc, szStartIndex);
if((pHighRec = (RecordType *) malloc(1 * sizeof(RecordType)))
== NULL)
{
WinMsg("You have run out of memory!", MB_ICONHAND, MB_OK);
SendMessage(hWnd, WM_DESTROY, 0, 0L);
}
if((pLowRec = (RecordType *) malloc(1 * sizeof(RecordType)))
== NULL)
{
WinMsg("You have run out of memory!", MB_ICONHAND, MB_OK);
SendMessage(hWnd, WM_DESTROY, 0, 0L);
}
memset(pLowRec, 0, sizeof(RecordType));
memset(pHighRec, 0, sizeof(RecordType));
// Finally set the length of the input field to the appropriate
// size based upon the present index.
SendDlgItemMessage(hWnd, IDE_LOWRANGE, EM_LIMITTEXT,
(WPARAM)pABIdxDesc[iStartIndex].aiKeyLen[0],
0L);
SendDlgItemMessage(hWnd, IDE_HIGHRANGE, EM_LIMITTEXT,
(WPARAM)pABIdxDesc[iStartIndex].aiKeyLen[0],
0L);
// Get the Range information from the RC file and display it
// into the static text field on the bottom of the dialog box.
LoadString(hInst, IDS_RANGE, szString, 220);
SetDlgItemText(hWnd, IDS_RANGE_TEXT, (pCHAR)szString);
bRet = TRUE;
break;
case WM_DESTROY:
if(pLowRec)
{
free(pLowRec);
}
if(pHighRec)
{
free(pHighRec);
}
if(pABIdxDesc)
{
free(pABIdxDesc);
}
break;
case WM_COMMAND:
switch (wParam)
{
case IDE_RANGE_COMBO:
switch(HIWORD(lParam))
{
case CBN_SELCHANGE:
// Add the item's position in the index array as
// an item data.
lSel=SendDlgItemMessage(hWnd, IDE_RANGE_COMBO,
CB_GETCURSEL, 0, 0L);
lIndex=SendDlgItemMessage(hWnd, IDE_RANGE_COMBO,
CB_GETITEMDATA, (WPARAM)lSel,
0L);
// Get the text that was entered for that index
// the last time it was chosen.
iFldIndx = (pABIdxDesc[(UINT16)lIndex].
aiKeyFld[0])-1;
GetField(pLowRec, szTemp, (UINT16)lIndex);
SetWindowText(GetDlgItem(hWnd, IDE_LOWRANGE),
szTemp);
GetField(pHighRec, szTemp, (UINT16)lIndex);
SetWindowText(GetDlgItem(hWnd, IDE_HIGHRANGE),
szTemp);
// Set the field length for the present index.
SendDlgItemMessage(hWnd, IDE_LOWRANGE,
EM_LIMITTEXT, (WPARAM)pABIdxDesc
[(UINT16)lIndex].aiKeyLen[0], 0L);
SendDlgItemMessage(hWnd, IDE_HIGHRANGE,
EM_LIMITTEXT, (WPARAM)pABIdxDesc
[(UINT16)lIndex].aiKeyLen[0], 0L);
bRet = TRUE;
break;
}
break;
case IDE_LOWRANGE:
case IDE_HIGHRANGE:
switch(HIWORD(lParam))
{
case EN_KILLFOCUS:
lSel=SendDlgItemMessage(hWnd, IDE_RANGE_COMBO,
CB_GETCURSEL, 0, 0L);
lIndex=SendDlgItemMessage(hWnd, IDE_RANGE_COMBO,
CB_GETITEMDATA,
(WPARAM)lSel, 0L);
iFldIndx = (pABIdxDesc[(UINT16)lIndex].
aiKeyFld[0])-1;
// Get the inputed range text and save that
// in the record structure to display again.
GetDlgItemText(hWnd, IDE_LOWRANGE, szTemp,
(WPARAM)pABIdxDesc
[(UINT16)lIndex].aiKeyLen[0]);
PutField(pLowRec, szTemp, iFldIndx);
GetDlgItemText(hWnd, IDE_HIGHRANGE, szTemp,
(WPARAM)pABIdxDesc
[(UINT16)lIndex].aiKeyLen[0]);
PutField(pHighRec, szTemp, iFldIndx);
bRet = TRUE;
break;
}
break;
case IDOK:
// Get the present state of the check boxes.
lRet = SendDlgItemMessage(hWnd, IDE_BM_LOW, BM_GETCHECK,
0, 0L);
if(lRet == 1)
{
bLowInclude = TRUE;
}
else
{
bLowInclude = FALSE;
}
lRet = SendDlgItemMessage(hWnd, IDE_BM_HIGH,
BM_GETCHECK, 0, 0L);
if(lRet == 1)
{
bHighInclude = TRUE;
}
else
{
bHighInclude = FALSE;
}
memset(pLowRec, 0, sizeof(RecordType));
memset(pHighRec, 0, sizeof(RecordType));
lSel=SendDlgItemMessage(hWnd, IDE_RANGE_COMBO,
CB_GETCURSEL, 0, 0L);
lIndex=SendDlgItemMessage(hWnd, IDE_RANGE_COMBO,
CB_GETITEMDATA, (WPARAM)lSel,
0L);
GetDlgItemText(hWnd, IDE_LOWRANGE, szTemp, ADDRESSLEN);
// If the range was left empty then set the bool to
// TRUE.
if(strlen(szTemp)==0)
{
bLowEmpty = TRUE;
}
// Put the text into the correct field of the
// record structure, that is to be used by the
// SetRange function.
iFldIndx = (pABIdxDesc[(UINT16)lIndex].aiKeyFld[0])-1;
PutField(pLowRec, szTemp, iFldIndx);
GetDlgItemText(hWnd, IDE_HIGHRANGE, szTemp, ADDRESSLEN);
// If the range was left empty then set the bool to
// TRUE.
if(strlen(szTemp)==0)
{
bHighEmpty = TRUE;
}
PutField(pHighRec, szTemp, iFldIndx);
if(iStartIndex != (UINT16)lIndex)
{
SetIndex(phCur,
pABIdxDesc[(UINT16)lIndex].szTagName);
}
// Set the range.
if(SetRange(pHighRec, pLowRec, bHighInclude,
bLowInclude, *phCur, bHighEmpty,
bLowEmpty)==DBIERR_NONE)
{
if(AtEOF(*phCur))
{
MessageBox(hWnd, "No Records exist within the"
" specified range. Resetting to"
" original range.", "Range Error",
MB_ICONHAND | MB_OK);
// Reset the range.
ResetRange(*phCur);
// Reset the index.
SetIndex(phCur,
pABIdxDesc[iStartIndex].szTagName);
// Set the return value to RANGEERROR, which is
// defined in the header file.
bRet = RANGEERROR;
}
else
{
bRet = TRUE;
// move one record forward to move past the
// crack that SetRange puts you at.
GetNextRec(*phCur);
}
}
else
{
bRet = FALSE;
}
if(bRet!=RANGEERROR)
{
EndDialog(hWnd, bRet);
}
break;
case IDCANCEL:
EndDialog(hWnd, FALSE);
bRet = TRUE;
break;
}
break;
}
return bRet;
}
//======================================================================
// Name: SearchDlg()
//
// Input: hWnd, msg, wParam, lParam. The lParam here also contains
// the pointer to the cursor during the WM_INITDIALOG.
//
// Return: TRUE - The Search was successful.
// FALSE - The search failed or user canceled the dilaog box.
//
// Desc: This routine will process all I/O for the dialog that will
// search for a record in the table.
//======================================================================
BOOL FAR _pascal _export
SearchDlg (HWND hWnd, WORD msg, WORD wParam, LONG lParam)
{
static pABIDXDESC pABIdxDesc = NULL;
static BOOL bErrorRet = FALSE;
static phDBICur phCur;
static hDBIDb hDb;
static CHAR szStartIndex[DBIMAXNAMELEN];
static UINT16 iStartIndex;
static UINT16 iNumIdxs;
static RecordType *pIndexRec = NULL;
BOOL bRet = FALSE;
DBISearchCond eSearch;
UINT32 lIndex;
UINT32 lSel;
DBIResult rslt;
CHAR szKey[ADDRESSLEN];
CHAR szString[220];
hErrorWnd = hWnd;
switch (msg)
{
case WM_INITDIALOG:
// Get the cursor and database from the lParam of the dialog
// box. It was sent in when creating the dialog box.
phCur = ((pAbHandles)(lParam))->phCur;
hDb = ((pAbHandles)(lParam))->hDb;
PostMessage(hWnd, WM_SETUP, 0, 0L);
return TRUE;
case WM_SETUP:
if((pIndexRec = (RecordType *) malloc(1 * sizeof(RecordType)))
== NULL)
{
WinMsg("You have run out of memory!", MB_ICONHAND, MB_OK);
SendMessage(hWnd, WM_DESTROY, 0, 0L);
}
// Get the presently active index, and fill the index structure
// with all the indexes that are open on the table.
if(FillIndexStr(*phCur, hDb, &pABIdxDesc, szStartIndex,
&iNumIdxs)!=DBIERR_NONE)
{
SendMessage(hWnd, WM_DESTROY, 0, 0L);
}
// Fill the list box with all the index names, and set
// the name of the current index in the edit control of the
// ComboBox.
iStartIndex = FillDropList(hWnd, IDE_SEARCH_COMBO, iNumIdxs,
pABIdxDesc, szStartIndex);
// Set the field length to the appropriate size.
SendDlgItemMessage(hWnd, IDE_SEARCH, EM_LIMITTEXT,
(WPARAM)pABIdxDesc[iStartIndex].aiKeyLen[0],
0L);
// Set the Checkbox to Greater than or equal.
SendDlgItemMessage(hWnd, IDC_GREATEREQ, BM_SETCHECK,
(WPARAM)TRUE, 0L);
LoadString(hInst, IDS_SEARCH, szString, 220);
SetDlgItemText(hWnd, IDS_SEARCH_TEXT, (pCHAR)szString);
break;
case WM_DESTROY:
if(pABIdxDesc)
{
free(pABIdxDesc);
}
if(pIndexRec)
{
free(pIndexRec);
}
break;
case WM_COMMAND:
switch (wParam)
{
case IDE_SEARCH_COMBO:
switch(HIWORD(lParam))
{
case CBN_SELCHANGE:
// Get the new index that was chosen and set
// the edit control's limit to the index's
// limit.
lSel=SendDlgItemMessage(hWnd, IDE_SEARCH_COMBO,
CB_GETCURSEL, 0, 0L);
lIndex=SendDlgItemMessage(hWnd,
IDE_SEARCH_COMBO,
CB_GETITEMDATA,
(WPARAM)lSel, 0L);
// Set the field length on this index.
SendDlgItemMessage(hWnd, IDE_SEARCH,
EM_LIMITTEXT, (WPARAM)pABIdxDesc
[(UINT16)lIndex].aiKeyLen[0], 0L);
// Clear the edit control.
SendDlgItemMessage(hWnd, IDE_SEARCH,
WM_SETTEXT, (WPARAM)0, NULL);
break;
}
break;
case IDOK:
// Get the new index to search on.
lSel=SendDlgItemMessage(hWnd, IDE_SEARCH_COMBO,
CB_GETCURSEL, 0, 0L);
lIndex=SendDlgItemMessage(hWnd, IDE_SEARCH_COMBO,
CB_GETITEMDATA, (WPARAM)lSel,
0L);
// If it is the same as the original index do NOT
// reindex.
if(iStartIndex != (UINT16)lIndex)
{
SetIndex(phCur,
pABIdxDesc[(UINT16)lIndex].szTagName);
}
GetDlgItemText(hWnd, IDE_SEARCH, szKey, ADDRESSLEN);
// Get the Condition checkbox.
eSearch = GetCond(hWnd);
memset(pIndexRec, 0, sizeof(RecordType));
PutField(pIndexRec, szKey,
(pABIdxDesc[((UINT16)lIndex)].aiKeyFld[0])-1);
// Search based upon the condition and the search
// string.
rslt = Search(*phCur, eSearch, FALSE, 0, 0, pIndexRec);
if(rslt == DBIERR_NONE)
{
bRet = TRUE;
bErrorRet = FALSE;
}
else
{
// Check if no match was found.
if (rslt == DBIERR_RECNOTFOUND)
{
MessageBox(hWnd, "Could not find a match",
"Search Error",
MB_ICONINFORMATION | MB_OK);
// Go to the first record as the failed search
// has left us at a the end of the table.
GoTop(*phCur, TRUE);
bErrorRet = TRUE;
}
}
if(!bErrorRet)
{
EndDialog(hWnd, bRet);
}
break;
case IDCANCEL:
EndDialog(hWnd, FALSE);
break;
}
break;
}
return bRet;
}