.tab文件中被删除的记录怎么还在?

luyiping 2003-09-15 09:27:32
.tab文件中被删除的记录怎么还在?
我把某图元删了,用mapinfo打开时是灰色的空列
在加如一个图元时怎么会加到这个记录的后面呢?
明明是删掉了,为什么计算ds.RowCount的时候还是吧它加进去的呢?
...全文
81 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
banner90 2003-10-09
  • 打赏
  • 举报
回复
第一个已经解决了,怎么还不结贴
klbt 2003-10-08
  • 打赏
  • 举报
回复
学习,帮你顶。
shansheng 2003-09-15
  • 打赏
  • 举报
回复
紧缩表,lovelyant原创
三思而行(3S2Go)论坛
vc+mapx 4.5

希望大家多多指教,此函数有一个缺点,对于有索引的图层,紧缩后,索引就没了。请教如何在程序中添加索引?
希望多多交流bodyhfp@163.com

void PackTab(CString strLayername/*需要被紧缩的层名*/)
{
COleVariant sd;
CMapXLayer layer;
CMapXDataset ds;
layer = map->GetLayers().Item(strLayername);
sd.vt = VT_DISPATCH;
sd.pdispVal = layer.m_lpDispatch;
sd.pdispVal->AddRef();
long count = map->GetDatasets().GetCount();
int flag=-1; //数据集中是否存在该层
for(int k=1;k<=count;k++)
{
if(map->GetDatasets().Item(k).GetName()==strLayername)
{
flag=1;
break;
}
}
if(flag==-1)
ds = map->GetDatasets().Add(miDataSetLayer,sd,map->GetLayers().Item(strLayername).GetName());
else
ds = map->GetDatasets().Item(strLayername);
long nreccount = ds.GetRowCount();
long nfeacount = layer.AllFeatures().GetCount();
if(nreccount!=nfeacount) /*是否需要紧缩的判断条件*/
{
CWaitCursor cursor;
// map->GetDatasets().Remove(1);
CMapXLayer layer = map->GetLayers().Item(strLayername);
long layercount = map->GetLayers().GetCount();
long layerindexOrign;
for(int k=1;k<=layercount;k++)
{
if(map->GetLayers().Item(k).GetName()==strLayername)
{
layerindexOrign = k; //该层所在的位置
break;
}
}
VARIANT vtLayer;
vtLayer.vt = VT_DISPATCH;
vtLayer.pdispVal = layer.m_lpDispatch;
vtLayer.pdispVal->AddRef();
CMapXDataset dataSet = map->GetDatasets().Item(layer.GetName());//map->GetDatasets().Add(miDataSetLayer, vtLayer,"pack";
// CString dsname = map->GetDatasets().Item(1).GetName();
CString layername = layer.GetName();
CString layerFilespec = layer.GetFilespec();
////////////////将选中的layer上的内容复制到临时建立的表templayer中(开始)/////////////////////////
CMapXLayerInfo m_LayerInfo;
m_LayerInfo.CreateDispatch(m_LayerInfo.GetClsid());
m_LayerInfo.SetType(miLayerInfoTypeNewTable);
CString tempstr;
layerFilespec.TrimLeft();
layerFilespec.TrimRight();
int pos;
pos = layerFilespec.ReverseFind('\\');
CString routeStr;
routeStr = layerFilespec.Mid(0,pos+1);
tempstr = routeStr+"\\templayer.tab";
VARIANT name;
name.vt=VT_BSTR;
name.bstrVal = tempstr.AllocSysString();
m_LayerInfo.AddParameter("filespec",name);
VARIANT vlayername;
vlayername.vt = VT_BSTR;
vlayername.bstrVal = CString("templayer".AllocSysString();
m_LayerInfo.AddParameter("Name",vlayername);
VARIANT m_Fields;
CMapXFields n_Fields;
n_Fields.CreateDispatch(n_Fields.GetClsid());
n_Fields=dataSet.GetFields();
m_Fields.vt = VT_DISPATCH;
m_Fields.pdispVal = n_Fields.m_lpDispatch;
m_Fields.pdispVal->AddRef();
m_LayerInfo.AddParameter("Fields", m_Fields);
VARIANT m_Features;
CMapXFeatures n_Features=layer.AllFeatures();
m_Features.vt = VT_DISPATCH;
m_Features.pdispVal=n_Features.m_lpDispatch;
m_Features.pdispVal->AddRef();
m_LayerInfo.AddParameter("Features", m_Features);
CMapXLayer packlyr = map->GetLayers().Add(m_LayerInfo.m_lpDispatch);
// map->GetLayers().LayersDlg(COptionalVariant(),COptionalVariant());
//packlyr为加入的临时层对象
//////////////////已将layer复制到临时建立的表templayer中///////////////////////////
map->GetDatasets().Remove(layername); //从Datasets中去除先前帮定的需紧缩的层
map->GetLayers().Remove(layername); //先把原始层(未紧缩的层)从层集中去除
//创建dataset for packlyr
vtLayer.vt = VT_DISPATCH;
vtLayer.pdispVal = packlyr.m_lpDispatch;
vtLayer.pdispVal->AddRef();
dataSet = map->GetDatasets().Add(miDataSetLayer, vtLayer,"pack";
//创建新表
CMapXLayerInfo newlayerInfo;
newlayerInfo.CreateDispatch(newlayerInfo.GetClsid());
newlayerInfo.SetType(miLayerInfoTypeNewTable);
newlayerInfo.AddParameter("filespec",COleVariant(layerFilespec));
newlayerInfo.AddParameter("Name", COleVariant(layername));
n_Fields=dataSet.GetFields();
m_Fields.vt = VT_DISPATCH;
m_Fields.pdispVal = n_Fields.m_lpDispatch;
m_Fields.pdispVal->AddRef();
newlayerInfo.AddParameter("Fields", m_Fields);
CMapXFeatures features = packlyr.AllFeatures();
VARIANT fs;
fs.vt = VT_DISPATCH;
fs.pdispVal=features.m_lpDispatch;
fs.pdispVal->AddRef();
newlayerInfo.AddParameter("features",fs);
newlayerInfo.AddParameter("OverwriteFile",COleVariant("1"; //永久写入原表
CString tempstr1,tempstr2,tempstr3,tempstr4,tempstr5;

tempstr1 = routeStr+"\\"+layername+".tab";
tempstr2 = routeStr+"\\"+layername+".dat";
tempstr3 = routeStr+"\\"+layername+".map";
tempstr4 = routeStr+"\\"+layername+".id";
tempstr5 = routeStr+"\\"+layername+".ind";
DeleteFile(tempstr1);
DeleteFile(tempstr2);
DeleteFile(tempstr3);
DeleteFile(tempstr4);
DeleteFile(tempstr5);

map->GetLayers().Add(newlayerInfo.m_lpDispatch);
map->GetLayers().Move(1,layerindexOrign+1); //把层从添加的位置移回到原来的位置
// map->GetLayers().LayersDlg(COptionalVariant(),COptionalVariant());
//删除临时表
map->GetDatasets().Remove("pack";
map->GetLayers().Remove("templayer";

tempstr1 = routeStr+"\\templayer.tab";
tempstr2 = routeStr+"\\templayer.dat";
tempstr3 = routeStr+"\\templayer.map";
tempstr4 = routeStr+"\\templayer.id";
tempstr5 = routeStr+"\\templayer.ind";
DeleteFile(tempstr1);
DeleteFile(tempstr2);
DeleteFile(tempstr3);
DeleteFile(tempstr4);
DeleteFile(tempstr5);
DataBand(strLayername);
}

}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
刷屏,我的最爱!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
navtech 2003-09-15
  • 打赏
  • 举报
回复
的确是这样的。在mapinfo里菜单的选择Table->Maintancence->Pack Table,可以紧缩表。
在MapX5.2.25里有Pack方法,MapX4.5里面就只能自己写了。
1.linux系统介绍 以windows为内核的操作系统有哪些:win10   win8   win7  xp  系统    windows server 以linux为内核的操作系统有哪些:centos  ubuntu  debian   windows和linux  linux:服务器   安全    稳定 高效    windows:办公  家用  2.安装linux注意事项 对centos系统 的基本使用   有哪些文件夹   对文件/文件夹 进行操作  创建 删除  修改 移动 复制   写入 home 存放所有用户文件的根目录  soft :安装软件 cd  ll mkdir 创建文件  touch 空文件  echo sdsd>a.txt       vi a.txt vi c.txt  打开文件  按下i键  改为写入的模式    写完之后保存: 先按下esc 按键再按下:w 保存 :q退出  :wq    写完之后不想保存 强制退出  esc  :q! 删除文件/文件夹 rm -rf a.txt  b.txt rm -rf soft 复制 如果复制文件 cp  要复制的文件名   复制出来的文件名子    cp  a.txt   a1.txt 如果复制的是文件夹的 cp -r soft/   soft1 展示一个文件的内容 cat  移动文件  mv  temp1   temp2 重命名 mv  temp1   temp2 查找: find /(查找的路径)  -name   *.txt    b 清屏  clear tab 按键 可以帮助我们把输入的内容补全   3.配置局域网  需要通过ssh软件远程操作linux系统 远程操作centos系统  在windows操作系统通过一款软件来远程操作虚拟电脑的centos系统  ssh软件: xshell  secureCRT 第一步在win10系统下载并且安装ssh软件 secureCRT    第二步:只要知道centos系统所在电脑的公网IP  登录账户和密码      /  win10和centos系统所在的两台电脑在同一个局域网内  局域网IP  登录账户和密码 第三步:centos系统 进行局域网的设置 往网卡写入一些数据   win10写入的方式:桌面的化操作和centos系统写入的方式是不一样的  ip 网关 子网掩码 NM_conteolle。。。 命令  找到往网卡写入数据的文件    重新启动网络服务 开启22端口   重启防火墙服务 网络桥接网络  *************************端口是否开启  4.配置外网  下载软件1.下载并且安装到系统 node.js环境   npm install bootstrap   默认的镜像库 centos系统    yum install  服务名     默认的镜像库  2.自己下载服务  wget 服务的网络地址 自己单独安装  比较灵活 安装难度大 windows系统  exe文件 linux       rpm包

2,142

社区成员

发帖
与我相关
我的任务
社区描述
它是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集、储存、管理、运算、分析、显示和描述的技术系统。
社区管理员
  • 地理信息系统
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧