📄 gridctrldemodlg.cpp
字号:
ar[in][0]=p3->gg3;
ar[in++][1]=10;
WriteDetail (tit);
}
else
{
//change data
p3->con-=(con1*10);
//write the result
m_Grb.SetRowCount (++m_baoc);
m_index2++;
//write
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = m_index2;
Item.col = 0;
Item.szText.Format("B%ld",m_baoc-2);
tit=Item.szText;
m_Grb.SetItem(&Item);
Item.col = 1;
Item.szText.Format("%ld",con1);
m_Grb.SetItem(&Item);
Item.col = 2;
Item.szText.Format("T11×4+T3%d×10",t3);
m_Grb.SetItem(&Item);
m_Grb.AutoSize ();
con1=0;
//try to write to detial grid
for(i=0;i<6;++i)
for(int j=0;j<2;++j)
ar[i][j]=0;
in=0;
ar[in][0]=1800;
ar[in++][1]=4;
ar[in][0]=p3->gg1;
ar[in++][1]=10;
ar[in][0]=p3->gg2;
ar[in++][1]=10;
ar[in][0]=p3->gg3;
ar[in++][1]=10;
WriteDetail (tit);
break;
}
}//for
sl[find(1800)]+=con1*4;
}
/////////////////////////////////////////////////////////////
// the way of T1*2+T2*4+T3*8
for(p2=h2->next,t2=1;p2;p2=p2->next,t2++)
{
int con2=p2->con/4;
if(con2<=0) continue;
con1=sl[find(1800)]/2;
if(con1<=0) break;
for(p3=h3->next,t3=1;p3;p3=p3->next,t3++)
{
int con3=p3->con/8;
if (con3<=0) continue;
if(con1<=0) break;
//change data
int mm=GetMin(con1,con2,con3);
p3->con-=(mm*8);
p2->con-=(mm*4);
sl[find(1800)]-=mm*2;
con2=p2->con/4;
con1=sl[find(1800)]/2;
if((con1<=0)||(con2<=0)) break;
//write the result
m_Grb.SetRowCount (++m_baoc);
m_index2++;
//write
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = m_index2;
Item.col = 0;
Item.szText.Format("B%d",m_baoc-2);
tit=Item.szText;
m_Grb.SetItem(&Item);
Item.col = 1;
Item.szText.Format("%ld",mm);
m_Grb.SetItem(&Item);
Item.col = 2;
Item.szText.Format("T11×2+T2%d×4+T3%d×8",t2,t3);
m_Grb.SetItem(&Item);
m_Grb.AutoSize ();
//try to write to detial grid
for(i=0;i<6;++i)
for(int j=0;j<2;++j)
ar[i][j]=0;
in=0;
ar[in][0]=1800;
ar[in++][1]=2;
ar[in][0]=p2->gg1;
ar[in++][1]=4;
ar[in][0]=p2->gg2;
ar[in++][1]=4;
ar[in][0]=p3->gg1;
ar[in++][1]=8;
ar[in][0]=p3->gg2;
ar[in++][1]=8;
ar[in][0]=p3->gg3;
ar[in++][1]=8;
WriteDetail (tit);
}//for
}//for
///////////////////////////////////////////////
//写入剩余量
//write title
m_Grb.SetRowCount (++m_baoc+1);
m_index2++;
for(i=0;i<2;++i)
for(int j=0;j<3;j++)
{
m_Grb.SetItemBkColour (m_index2+i,j,RGB(0,255,0));
m_Grb.SetItemFgColour (m_index2+i,j,RGB(0,0,0));
}
m_Grb.SetItemText (m_index2,0,"总剩余量");
m_index2++;
m_Grb.SetItemText (m_index2,0,"规格");
m_Grb.SetItemText (m_index2,1,"剩余量");
int g;
for (g=300; g<=1500; g+=50)
{
val=sl[find(g)];
for(p2=h2->next;p2;p2=p2->next)
{
if(p2->gg1==g) val+=p2->con;
if(p2->gg2==g) val+=p2->con;
}
for(p3=h3->next;p3;p3=p3->next)
{
if(p3->gg1==g) val+=p3->con;
if(p3->gg2==g) val+=p3->con;
if(p3->gg3==g) val+=p3->con;
}
m_Grb.SetRowCount (++m_baoc+1);
m_index2++;
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = m_index2;
Item.col = 0;
Item.szText.Format("%d",g);
m_Grb.SetItem(&Item);
Item.col = 1;
Item.szText.Format("%d",val);
m_Grb.SetItem(&Item);
}
m_Grb.SetRowCount (++m_baoc+1);
m_index2++;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = m_index2;
Item.col = 1;
Item.szText.Format("%ld",sl[find(1800)]);
m_Grb.SetItem(&Item);
Item.col = 0;
Item.szText="1800";
m_Grb.SetItem(&Item);
m_Grb.AutoSize ();
}
void CGridctrlDemoDlg::OnButton3()
{
// TODO: Add your control notification handler code here
if (AfxMessageBox("在您打包之前您必须在最左边的表格中填写完整所有规格对应的数量!!您确定已经填写完整了吗??",MB_YESNO+MB_DEFBUTTON2)==6)
computedata();
}
int CGridctrlDemoDlg::find(int data)
{
for(int i=1;i<=m_total;i++)
if(gg[i]==data) break;
return i;
}
long CGridctrlDemoDlg::findmin(long x, long y, long z)
{
if(x>y) x=y;
if(x>z) x=z;
return x;
}
void CGridctrlDemoDlg::setrowcolor(int row,unsigned long c1,unsigned long c2)
{
}
long CGridctrlDemoDlg::GetMin(long x, long y, long z)
{
if(x>y) x=y;
if(x>z) x=z;
return x;
}
void CGridctrlDemoDlg::OnRadio2()
{
// TODO: Add your control notification handler code here
m_way=1;
}
void CGridctrlDemoDlg::OnRadio3()
{
// TODO: Add your control notification handler code here
m_way=2;
}
void CGridctrlDemoDlg::OnRadio4()
{
// TODO: Add your control notification handler code here
m_way=3;
}
void CGridctrlDemoDlg::show(int row)
{
}
void CGridctrlDemoDlg::WriteDetail(CString tit)
{
int ind=1;
m_Gre.SetRowCount (m_index3+2);
//write title
for(int j=0;j<=6;j++)
{
m_Gre.SetItemBkColour (m_index3,j,65535);
m_Gre.SetItemFgColour (m_index3,j,100);
}
m_Gre.SetItemText (m_index3,0,"包编号");
m_Gre.SetItemText (m_index3+1,0,tit);
for(int i=0;i<6;i++)
{
if((ar[i][0]!=0)&&(ar[i][1]!=0)){
for(int j=i+1;j<6;j++)
if(ar[j][0]==ar[i][0])
{
ar[i][1]+=ar[j][1];
ar[j][1]=0;
}
tit.Format("%ld",ar[i][0]);
m_Gre.SetItemText (m_index3,ind,tit);
tit.Format("%ld",ar[i][1]);
m_Gre.SetItemText (m_index3+1,ind,tit);
ind++;
}
}
m_index3+=2;
}
void CGridctrlDemoDlg::OnCancel()
{
// TODO: Add extra cleanup here
exit(0);
//CDialog::OnCancel();
}
void CGridctrlDemoDlg::OnWkh()
{
// TODO: Add your control notification handler code here
if (AfxMessageBox("退出程序时将丢失一切打包数据!!您确定退出吗??",MB_YESNO+MB_DEFBUTTON2)==6)exit(0);
}
void CGridctrlDemoDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
OnWkh();
//CDialog::OnClose();
}
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
//m_tex.SetText("欢迎使用智能打包系统(简易版)Welcome To Wkh");
CString cst;
cst=" ★★★欢迎使用智能打包系统(简易版)★★★\r\n";
//text
cst+=" 使用前请详细阅读本说明\r\n";
cst+="1、问题背景:\r\n";
cst+=" 为简易起见,本系统采用固定参数设计(即:规格的起";
cst+="始,步长,标准条的大小及每包内的层数等都固定)。规格共有";
cst+="6种,具体为300到1500及1800,规格变化步长为50;包长度(即";
cst+="标准条的长度)限定为1800;包内层数限定为7层。本系统根据";
cst+="用户提供的各种规格的产品数量,采用智能算法计算出最佳打包";
cst+="方案。特别说明:本算法只计算到小包方案,因为由42个小包组";
cst+="成盘再由24个盘组成盘柜相对简单的多,在打成小包的基础上由";
cst+="人工完成也比较方便。\r\n\r\n";
cst+="2、算法思想:\r\n";
cst+=" 分析问题知:要想使得每包内的块数恰为34而且要两排";
cst+="和7层,则,我们可以用6层由3块组成的标准条和8层由2块组成";
cst+="的标准条(3×6+2×8=34);或用10层由3块组成的标准条和4层";
cst+="由1块组成的标准条(3×10+1×4=34);或用8层由3块组成的标";
cst+="准条和4层由2块组成的标准条和2层由1块组成的标准条(3×8+2";
cst+="×4+1×2=34)。所以我们先根据用户提供的数据来尽可能多的";
cst+="组成标准条,同时根据组成标准条的快数给标准条分类,显示在";
cst+="中间的表格中。再根据打成的标准条来组成包(即安上面的三种";
cst+="组合方法),然后显示在最右边的表格中(其中包括最后总剩余";
cst+="量)。并且在下面的表格中显示出每种包内的详细情况。\r\n\r\n";
cst+="3、系统内参数及术语说明:\r\n";
cst+=" 标准条:指长度为1800的条或长度为1800的组合条。比";
cst+="如一条长度为1800的条就称为标准条,而由一个1200的和一个";
cst+="600的条组成的一个新的组合条也成为一个标准条,同理由三个";
cst+="条组成的组合条只要够1800的长度就称这个组合条为一个标准条";
cst+="。 关于编号:本系统中涉及到编号,目的是为了使方案清晰";
cst+="明了。①标准条编号:以T打头T后的第一位表明该标准条由几个";
cst+="小条组成,T后的第二三位表明该标准条在此类条中的序号,比如";
cst+="T11表明这个标准条由一个条组成,T23表明该条由2个小条组成";
cst+=",它在由两个小条组成的标准条中序号为3。②包编号:在最后";
cst+="打成的小包中为区分不同的包,为包编号,以B打头,如:B3表";
cst+="明这是一个符合要求的包,它的序号为3。\r\n\r\n";
cst+="4、程序具体使用方法:\r\n";
cst+=" 使用方法很简单,程序运行后在左边的表格中自动生成";
cst+="各种规格,用户须仔细填写各种规格对应的库存量。然后点击“";
cst+="开始打包”按钮,系统会计算打包方案,并显示在不同的表格中";
cst+="。中间的表格列出了系统打成的标准条的详细情况包括每种标准";
cst+="条所含的各种规格的块的数量及库存中可以提供的各种标准条的";
cst+="数量。最右边的表格中列出了最终打成的包的种类和数量及各种";
cst+="包内含有哪些标准条。右边的表格还列出了最后总剩余量。下面";
cst+="的表格中列出了每种包内含有的小块及其数量。\r\n\r\n";
cst+="5、关于选择方案:\r\n";
cst+=" 仔细分析问题可知:在所有的规格中1250—1500的规格";
cst+="只能再配上一块小规格的组成标准条,而规格在900—1200的即";
cst+="可以配上一块小规格的组成标准条,也可以配上两块小规格的组";
cst+="成标准条。这样就可有不同的解决方案了,若小规格的相对较多";
cst+=",而大规格的相对较少,那么就可以将900—1200的配两块小规";
cst+="格的组成标准条(即方案1);而若小规格的特别少,而大规格";
cst+="的相对较多,那么就可以将900—1200的配上一块小规格的组成";
cst+="标准条(即方案3);而方案3则是上面二者的折中方案,将900";
cst+="—1200的一部分配上一块小规格的组成标准条,而另一部分配上";
cst+="两块小规格的组成标准条。程序启动时默认的是方案1,用户可";
cst+="以根据库存数据自己选择其他方案重新计算,也可尝试三种不同";
cst+="方案,再比较它们打包后的总剩余量,来决定采用何种方案。";
cst+="最好的办法是先选择一种合适的方案,让系统计算出结果后,再人";
cst+="工配比剩余量中的产品。\r\n\r\n";
cst+="6、特殊说明: 本系统为简易版本属实验性产品,该算法计算的打包方案可以作为参考。";
cst+="如本系统的打包算法与公司的打包方案相悖,请以公司的打包方案为重。";
cst+="如果由本系统计算的打包方案给公司经济或其他方面带来损失或不利影响,";
cst+="本系统作者不负任何法律责任!!!\r\n\r\n";
cst+=" 感谢使用克惠工作室产品!\r\n\r\n";
cst+="如有其他问题请与克惠工作室联系:\r\n\r\n";
cst+=" Tel:(0537)3633869 (0537)3896991 (0535)6676436\r\n";
cst+=" HandPhone: 13963844845\r\n";
cst+=" E_mail: wkhcbuild@yahoo.com.cn\r\n";
cst+=" wkhbuild@yahoo.com.cn\r\n";
cst+=" wkhwkh@263.sina.com\r\n";
cst+=" QQ: 49505927\r\n";
m_edv=cst;
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -