📄 dlgeditattributes.cpp
字号:
///////////////////////////////////////////////////////////////////////////////
long CDlgEditAttributes::GetFeature(int iRow)
{
long lFeature = 0;
CString s = m_Grid.GetValue(COL_FEATUREID, iRow);
sscanf(s, "%i", &lFeature);
return lFeature;
}
///////////////////////////////////////////////////////////////////////////////
//
// Validates and retrieves data into a pre-defined CAttrArray object. Returns
// the column number containing an error or zero if no error occurred
//
BOOL CDlgEditAttributes::RetrieveRow(int iRow, CAttrArray& aAttr)
{
int iCol = COL_DATE+1;
int iRet = 0;
CString sValue;
long lValue;
CLongLines* pMapLines = NULL;
int iSel = 0;
aAttr.m_lOrder = iRow;
for (int i = 0; iRet == 0 && i < aAttr.GetSize(); i++)
{
CAttribute* pAttr = aAttr.GetAt(i);
// Retrieve text
switch (pAttr->GetDataType())
{
case BDTEXT :
{
sValue = m_Grid.GetValue(iCol, iRow);
sValue.TrimLeft(" ");
pAttr->SetString(sValue);
}
break;
// Long text
case BDLONGTEXT :
{
sValue = m_Grid.GetValue(iCol, iRow);
sValue.TrimLeft(" ");
pAttr->SetLongText(sValue);
}
break;
// Get File name
case BDHOTLINK :
{
sValue = m_Grid.GetValue(iCol, iRow);
sValue.TrimLeft();
pAttr->SetFile(sValue);
}
break;
// Retrieve numbers
case (BDNUMBER) :
{
sValue = m_Grid.GetValue(iCol, iRow);
sValue.TrimLeft();
sValue.TrimRight();
if (!pAttr->AsAttr(sValue))
{
iRet = iCol;
}
}
break;
// Retrieve link
case (BDLINK) :
{
iSel = m_Grid.ComboBoxSendMessage(iCol, iRow, CB_GETCURSEL, 0,0);
if (iSel != CB_ERR)
{
if (m_aFTypeLink[iCol][iSel] != -1)
{
pAttr->SetLink(m_aFTypeLink[iCol][iSel]);
} else
{
iRet = iCol;
}
} else
{
iRet = iCol;
}
}
break;
// Retrieve map lines
case (BDMAPLINES) :
{
CLongBinary longbinary; // Re-initialised each iteration
m_Grid.GetInteger(iCol, iRow, &lValue);
pMapLines = (CLongLines*)lValue;
if (pMapLines != NULL)
{
pMapLines->GetLongBinary(longbinary);
}
pAttr->SetLongBinary(&longbinary);
longbinary.m_hData = NULL; // prevents deletion of memory
}
break;
// Retrieve image
case BDIMAGE :
{
CLongBinary longbinary;
CImageFile* pImageFile = NULL;
m_Grid.GetInteger(iCol, iRow, &lValue);
pImageFile = (CImageFile*)lValue;
if (pImageFile != NULL)
{
pImageFile->AsLongBinary(longbinary);
}
pAttr->SetLongBinary(&longbinary);
longbinary.m_hData = NULL; // prevents deletion of memory
}
break;
// Retrieve file object
case BDFILE :
{
CLongBinary longbinary;
CFileObj* pFileObj = NULL;
m_Grid.GetInteger(iCol, iRow, &lValue);
pFileObj = (CFileObj*)lValue;
if (pFileObj != NULL)
{
pFileObj->GetLongBinary(longbinary);
}
pAttr->SetLongBinary(&longbinary);
longbinary.m_hData = NULL; // prevents deletion of memory
}
break;
// Retrieve coordinates
case BDCOORD :
{
CCoord coord;
sValue = m_Grid.GetValue(iCol, iRow);
sValue.TrimLeft();
sValue.TrimRight();
if (sValue == "")
{
coord.SetNull();
pAttr->SetCoord(coord);
}
else if (BDProjection()->StringAsCoord(sValue, &coord))
{
pAttr->SetCoord(coord);
} else
{
iRet = iCol;
}
}
break;
// Retrieve boolena
case (BDBOOLEAN) :
{
sValue = m_Grid.GetValue(iCol, iRow);
sValue.TrimRight();
if (sValue.CompareNoCase(BDString(IDS_YES)) == 0 || sValue.CompareNoCase(BDString(IDS_YES1)) == 0)
{
pAttr->SetBoolean(TRUE);
}
else if (sValue.CompareNoCase(BDString(IDS_NO)) == 0 || sValue.CompareNoCase(BDString(IDS_NO1)) == 0)
{
pAttr->SetBoolean(FALSE);
}
else if (sValue == "")
{
pAttr->SetBoolean(AFX_RFX_BOOL_PSEUDO_NULL);
}
else
{
iRet = iCol;
}
}
break;
default:
{
ASSERT(FALSE);
}
};
iCol++;
};
return iRet;
}
///////////////////////////////////////////////////////////////////////////////
void CDlgEditAttributes::DisplayError(int iCol, int iRow, LPCSTR sError)
{
CString s;
long lData;
CString sMsg;
if (sError == NULL) sMsg = BDString(IDS_INVALIDVALUE);
else sMsg = sError;
m_Grid.GetColUserData(iCol, &lData);
for (int i = 0; i < sizeof(CAttrTypes::m_aAttrType) / sizeof(CAttrTypes); i++)
{
if (lData == CAttrTypes::m_aAttrType[i].m_nId) break;
}
if (iCol != COL_DATE)
{
// Output type of error
CString s1 = BDString(IDS_OFTYPE);
CString s2 = BDString(IDS_ONROW);
s.Format("%s \"%s\" %s %s %s %i. ", sMsg, m_Grid.GetValue(iCol, 0),
(LPCSTR)s1, (LPCSTR)CAttrTypes::GetDesc(lData),(LPCSTR)s2, iRow);
s += "\r\n\r\n";
// Describe correct format
switch (CAttrTypes::m_aAttrType[i].m_nId)
{
case BDNUMBER : s += BDString(IDS_NUMFORMAT); break;
case BDCOORD : s += BDString(IDS_COORDFORMAT); break;
case BDLINK : s += BDString(IDS_LINKFORMAT); break;
case BDHOTLINK : s += BDString(IDS_FILEFORMAT); break;
}
} else
{
// Output error for dates
s.Format("%s \"%s\" %s %i. ", (LPCSTR)sMsg, m_Grid.GetValue(iCol, 0),
(LPCSTR)BDString(IDS_ONROW), iRow);
s += "\r\n\r\n" + BDString(IDS_DATEFORMAT);
}
AfxMessageBox(s);
m_Grid.SetActiveCell(iCol, iRow);
m_Grid.SetFocus();
}
/////////////////////////////////////////////////////////////////////////////
LRESULT CDlgEditAttributes::OnResetProgress(WPARAM wParam, LPARAM lParam)
{
BDGetProgressBar()->SetRange32(wParam, lParam);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
LRESULT CDlgEditAttributes::OnUpdateProgress(WPARAM wParam, LPARAM)
{
BDGetProgressBar()->SetPos(wParam);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
LRESULT CDlgEditAttributes::OnLeaveCell(WPARAM,LPARAM)
{
PostMessage(WM_CHANGECELL);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
LRESULT CDlgEditAttributes::OnChangeCell(WPARAM,LPARAM)
{
long lRow, lCol, lData, lValue;
BOOL bData = FALSE;
m_Grid.GetActiveCell(&lCol, &lRow);
GetDlgItem(IDC_STATUS)->SetWindowText(m_Grid.GetValue(lCol, 0));
// Determine the column type
m_Grid.GetColUserData(lCol, &lData);
// Disable if the row contains no date
BOOL bDate = m_Grid.GetValue(COL_DATE, lRow) != "";
// Determine if the cell contains data
if (lData == BDMAPLINES || lData == BDIMAGE || lData == BDFILE)
{
m_Grid.GetInteger(lCol, lRow, &lValue);
bData = lValue != 0;
};
// Disable import except for map lines
GetDlgItem(IDC_IMPORT)->EnableWindow((lData == BDMAPLINES || lData == BDHOTLINK || lData == BDIMAGE || lData == BDFILE) && bDate);
GetDlgItem(IDC_EXPORT)->EnableWindow(lData == BDMAPLINES && bDate && bData);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
LRESULT CDlgEditAttributes::OnDataChange(WPARAM,LPARAM)
{
// If the last row then add a new one
return 0;
}
/////////////////////////////////////////////////////////////////////////////
//
// Professional version, can insert new rows for current type
//
void CDlgEditAttributes::OnInsert()
{
long lCol, lRow;
m_Grid.GetActiveCell(&lCol, &lRow);
CString sFeature = m_Grid.GetValue(COL_FEATURE, lRow);
CString sID = m_Grid.GetValue(COL_FEATUREID, lRow);
if (sID != "")
{
//m_Grid.SetMaxRows(m_Grid.GetMaxRows()+1);
m_Grid.InsRow(lRow+1);
m_Grid.SetValue(COL_FEATURE, lRow+1, sFeature);
m_Grid.SetValue(COL_FEATUREID, lRow+1, sID);
};
}
/////////////////////////////////////////////////////////////////////////////
//
// Provide option for adding new links
//
LRESULT CDlgEditAttributes::OnComboSelChange(WPARAM wParam, LPARAM lParam)
{
CAttrArray aAttr;
int index;
CFeature feature;
// Retrieve selected link
long iRow, iCol;
m_Grid.GetActiveCell(&iCol, &iRow);
int iSel = m_Grid.ComboBoxSendMessage(iCol, iRow, CB_GETCURSEL, 0,0);
// If link is 'new' then display add dialog
if (iSel != CB_ERR && m_aFTypeLink[iCol][iSel] == -1)
{
BDFTypeAttrInit(BDHandle(), m_lFType, &aAttr);
BDEnd(BDHandle());
long lAttrFType = aAttr.GetAt(iCol-COL_DATE-1)->GetFTypeLink();
CDlgEditFeature dlg(lAttrFType);
if (dlg.DoModal() == IDOK)
{
feature.m_lId = dlg.GetId();
feature.m_lFeatureTypeId = lAttrFType;
BDFeature(BDHandle(), &feature, BDSELECT);
BDEnd(BDHandle());
// Add new string to each list
m_aFTypeLink[iCol].Add(feature.m_lId);
index = m_Grid.ComboBoxSendMessage(iCol, -1, CB_ADDSTRING, 0, (long)(LPCSTR)feature.m_sName);
// Set active row to new selection
m_Grid.ComboBoxSendMessage(iCol, iRow, CB_SETCURSEL,m_aFTypeLink[iCol][index],0);
}
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////
void CDlgEditAttributes::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// Resize the grid
if (!IsWindow(m_Grid)) return;
//if (GetDlgItem(IDC_GRID) == NULL) return;
CRect rectGrid, rectForm, rect, rectCForm;
GetDlgItem(IDC_GRID)->GetWindowRect(&rectGrid);
GetWindowRect(&rectForm);
GetClientRect(&rectCForm);
int nBorder = (rectForm.Height() - rectCForm.Height());
rect.left = rectGrid.left-rectForm.left;
rect.top = rectGrid.top - rectForm.top - nBorder;
rect.right = rectForm.Width() - nBorder;
rect.bottom = rectForm.Height() - nBorder*2;
if (nType == SIZE_MAXIMIZED || nType == SIZE_RESTORED)
{
m_Grid.SetWindowPos(NULL,rect.left,rect.top,rect.Width(),rect.Height(),
SWP_NOOWNERZORDER);
};
}
/////////////////////////////////////////////////////////////////////////////
void CDlgEditAttributes::OnClose()
{
int nRet = AfxMessageBox(BDString(IDS_SAVECHANGES), MB_YESNOCANCEL);
if (nRet == IDYES)
{
OnOK();
}
else if (nRet == IDNO)
{
CDialog::OnClose();
};
}
void CDlgEditAttributes::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnLButtonDown(nFlags, point);
}
/////////////////////////////////////////////////////////////////////////////////////////
BOOL CDlgEditAttributes::PreTranslateMessage(MSG* pMsg)
{
return CDialog::PreTranslateMessage(pMsg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -