www.pudn.com > polygon_decompose_lx.rar > form.cpp


//--------------------------------------------------------------------------- 
 
#include  
#pragma hdrstop 
 
#include  
#include  
 
#include "form.h" 
#include "Node.h" 
#include "aboutform.h" 
 
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
TForm1 *Form1; 
const AnsiString DefaultName=AnsiString("Unnamed"); 
//--------------------------------------------------------------------------- 
__fastcall TForm1::TForm1(TComponent* Owner) 
        : TForm(Owner) 
{ 
        Count=-1; 
        xEnter=0; 
        yEnter=0; 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::BitBtn1Click(TObject *Sender) 
{ 
        CanSet=true; 
        Edit6->Enabled=true; 
        Edit6->SetFocus(); 
        Edit7->Enabled=true; 
        select=0; 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::Image1MouseDown(TObject *Sender, 
      TMouseButton Button, TShiftState Shift, int X, int Y) 
{     //initiate the points[Count].select 
        if(CanSet==true){                                  
                Count++;                            //add the count of points 
                points[Count].select=0; 
        } 
 
} 
//7.19建立 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, 
      TShiftState Shift, int X, int Y) 
{ 
       if(Count>=100){                               //beyond the limitation 
                CanSet=false; 
                Image1->Canvas->TextOutA(0,0,"The points have reach the maximum.");} 
       if(CanSet==true){ 
                if(Count>1){ 
                        Button1->Enabled=true; 
                        connect1->Enabled=true; 
                } 
                points[Count].SetNode(X,Y); 
                NodeImage[Count]=new TImage(Image1);  //realize a n object 
                NodeImage[Count]->Picture->LoadFromFile(PathName+"code/2.bmp"); 
                NodeImage[Count]->Left=X+(Image1->Left)-4.5; 
                NodeImage[Count]->Top=Y-4.5+(Image1->Top); 
                NodeImage[Count]->Width=9; 
                NodeImage[Count]->Height=9; 
                NodeImage[Count]->Parent=Form1; 
                NodeImage[Count]->Tag=Count; 
                NodeImage[Count]->OnClick=NodeImageClick; 
                Edit5->Text=IntToStr(Count+1); 
                Image1->Canvas->TextOutA(0,15*(Count+1),IntToStr(Count+1)+"    "+ 
        IntToStr(points[Count].XCoordinate)+"  "+IntToStr(points[Count].YCoordinate)+"    "); 
 
        } 
        PointFlag=1; 
        int i=0; 
        if(CanSet==false){  // move the point to the assigned position 
                for(i=0;i<=Count;i++){ 
                if(points[i].select==1){ 
                        Image1->Canvas->Pen->Color=clWhite; 
                        for(int q=0;q<=Count;q++){ 
                                for(int i=q;i<=Count;i++){ 
                                        Image1->Canvas->MoveTo(points[q].XCoordinate,points[q].YCoordinate); 
                                        Image1->Canvas->LineTo(points[i].XCoordinate,points[i].YCoordinate); 
                                } 
                        } 
                        NodeImage[i]->Left=X+(Image1->Left)-4.5; 
                        NodeImage[i]->Top=Y-4.5+(Image1->Top); 
                        points[i].XCoordinate=X; 
                        points[i].YCoordinate=Y; 
                        NodeImage[i]->Picture->LoadFromFile(PathName+"code/2.bmp"); 
                        Image1->Canvas->TextOutA(0,15*(i+1),IntToStr(i+1)+"    "+ 
        IntToStr(points[i].XCoordinate)+"  "+IntToStr(points[i].YCoordinate)+"   "); 
                } 
                } 
                for(int i=0;i<=Count;i++){ 
                        points[i].select=0; 
                } 
        } 
        CanSet=false; 
        Edit6->Enabled=false; 
        Edit7->Enabled=false; 
        if(HasDraw!=0){ 
               Image1->Canvas->Pen->Color=clAqua; 
               /*for(int i=0;iWidth;i++){ 
                        for(int j=0;jHeight;j++){ 
                                Image1->Canvas->Pixels[i][j]=clWhite; 
                        } 
                }         //if there is something on the canvas clear the canvas*/ 
 
                if(HasDraw==1){Button1Click(Sender);} 
                if(HasDraw==2){ 
                        Button1Click(Sender); 
                        if(IsPolygon()){Button2Click(Sender);} 
                } 
        } 
} 
//7.19建立 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::NodeImageClick(TObject *Sender){ 
          if(CanSet==false){ 
                NodeImage[((TImage*)Sender)->Tag]->Picture->LoadFromFile(PathName+"code/3.bmp"); 
                for(int i=0;i<=Count;i++){ 
                if(points[i].select==1){ 
                        NodeImage[i]->Picture->LoadFromFile(PathName+"code/2.bmp"); 
                } 
                        points[i].select=0; 
                } 
                points[((TImage*)Sender)->Tag].select=1;//set this point selected 
                select=1;                               //suggest there is some point selected 
          } 
} 
 
//7.20建立 
 
//--------------------------------------------------------------------------- 
//caculate all the length of a polygon 
double TForm1::PLength(){ 
         double length=0; 
         for(int i=0;iCaption=DefaultName; 
        PathName="D://program/暑期大作业/Lee/"; 
        Form1->Top=120; 
        Form1->Left=180; 
        Image1->Canvas->Pen->Color=clAqua; 
        points=new Node[100]; 
        Edit5->Text="1"; 
        BitBtn1->Enabled=true; 
        Button1->Enabled=false; 
        Button2->Enabled=false; 
        connect1->Enabled=false; 
        Decompose1->Enabled=false; 
        Delete->Enabled=true; 
        CanSet=false;                           //7.21 CanSet=true; 
        e1->Enabled=true; 
        HasDraw=0; 
        PointFlag=0; 
        Save1->Enabled=true; 
        IntFlag=1; 
 
} 
//7.19建立 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
        Image1->Canvas->Pen->Width=2; 
        Image1->Canvas->Pen->Color=clAqua; 
        for(int i=0;iCanvas->MoveTo(points[i].XCoordinate,points[i].YCoordinate); 
                Image1->Canvas->LineTo(points[i+1].XCoordinate,points[i+1].YCoordinate); 
        } 
        Image1->Canvas->MoveTo(points[Count].XCoordinate,points[Count].YCoordinate); 
        Image1->Canvas->LineTo(points[0].XCoordinate,points[0].YCoordinate); 
        Button1->Enabled=false; 
        connect1->Enabled=false; 
        if(!IsPolygon()){ 
 
                Button2->Enabled=false; 
                Decompose1->Enabled=false; 
                Image1->Canvas->TextOutA(0,0,"sorry,it is not a convex polygon!                           "); 
        } 
        else{ 
                Image1->Canvas->TextOutA(0,0,"                                                               "); 
                Button2->Enabled=true; 
                Decompose1->Enabled=true; 
        } 
        BitBtn1->Enabled=false; 
        HasDraw=1; 
        e1->Enabled=false; 
        Delete->Enabled=false; 
} 
//7.19建立 
//--------------------------------------------------------------------------- 
//If there IsAnother=0,return 
boolean TForm1::IsPolygon(){ 
        int isanother=1; 
        double k=0;                              //the slope 
        double b=0;                              //the intercept 
        double y1=0; 
        double y2=0; 
/*7.25前本来是用此算法的 后来验证错误,因此换了个算法。 
        for(int i=0;i(points[i].XCoordinate)&&(xhighflag==0)){ 
                        xhighflag=1; 
                        xlowflag=0; 
                        ++xhigh; 
 
                } 
                if((points[i+1].XCoordinate)<(points[i].XCoordinate)&&(xlowflag==0)){ 
                        xlowflag=1; 
                        xhighflag=0; 
                        ++xlow; 
 
                } 
                if((points[i+1].YCoordinate)>(points[i].YCoordinate)&&(yhighflag==0)){ 
                        yhighflag=1; 
                        ylowflag=0; 
                        ++yhigh; 
 
                } 
                if((points[i+1].YCoordinate)<(points[i].YCoordinate)&&(ylowflag==0)){ 
                        ylowflag=1; 
                        yhighflag=0; 
                        ++ylow; 
 
                } 
        } 
        if((points[0].XCoordinate)>(points[Count].XCoordinate)&&(xhighflag==0)){ 
                        xhighflag=1; 
                        xlowflag=0; 
                        ++xhigh; 
 
        } 
        if((points[0].XCoordinate)<(points[Count].XCoordinate)&&(xlowflag==0)){ 
                        xlowflag=1; 
                        xhighflag=0; 
                        ++xlow; 
 
        } 
        if((points[0].YCoordinate)>(points[Count].YCoordinate)&&(yhighflag==0)){ 
                        yhighflag=1; 
                        ylowflag=0; 
                        ++yhigh; 
 
        } 
        if((points[0].YCoordinate)<(points[Count].YCoordinate)&&(ylowflag==0)){ 
                        ylowflag=1; 
                        yhighflag=0; 
                        ++ylow; 
 
        } 
        if(((xlow+xhigh)>=4)||((ylow+yhigh)>=4)){ 
                return false; 
        } 
        else if(((xlow+xhigh)<4)&&((ylow+yhigh)<4)){ 
                return true; 
        } 
*/ 
        for(int i=1;i0){ 
                                isanother=1;//if point[i+2]and point[i-1]distributed at one side 
                        } 
                        else isanother=0; 
                } 
                if((points[i].XCoordinate-points[i+1].XCoordinate)==0&&isanother==1){ 
                        if((points[i+2].XCoordinate-points[i+1].XCoordinate)*(points[i-1].XCoordinate-points[i].XCoordinate)>0){ 
                                isanother=1; 
                        } 
                        else isanother=0; 
                } 
        } 
        if((points[Count-1].XCoordinate-points[Count].XCoordinate)!=0&&isanother==1){ 
                k=(double)((points[Count].YCoordinate)-(points[Count-1].YCoordinate))/ 
                (double)((points[Count-1].XCoordinate)-(points[Count].XCoordinate)); 
                b=(0-points[Count-1].YCoordinate)-k*points[Count-1].XCoordinate; 
                y1=k*points[0].XCoordinate+b; 
                y2=k*points[Count-2].XCoordinate+b; 
                if((points[0].YCoordinate+y1)*(points[Count-2].YCoordinate+y2)>0){ 
                        isanother=1; 
                } 
                else isanother=0; 
        } 
        if((points[Count-1].XCoordinate-points[Count].XCoordinate)==0&&isanother==1){ 
                if((points[0].XCoordinate-points[Count].XCoordinate)*(points[Count-2].XCoordinate-points[Count-1].XCoordinate)>0){ 
                        isanother=1; 
                } 
                else isanother=0; 
        } 
        if((points[0].XCoordinate-points[Count].XCoordinate)!=0&&isanother==1){ 
                k=(double)((points[0].YCoordinate)-(points[Count].YCoordinate))/ 
                (double)((points[Count].XCoordinate)-(points[0].XCoordinate)); 
                b=(0-points[Count].YCoordinate)-k*points[Count].XCoordinate; 
                y1=k*points[1].XCoordinate+b; 
                y2=k*points[Count-1].XCoordinate+b; 
 
                if((points[1].YCoordinate+y1)*(points[Count-1].YCoordinate+y2)>0){ 
                        isanother=1; 
                } 
                else isanother=0; 
        } 
        if((points[0].XCoordinate-points[Count].XCoordinate)==0&&isanother==1){ 
                if((points[1].XCoordinate-points[0].XCoordinate)* 
                (points[Count-1].XCoordinate-points[Count].XCoordinate)>0){ 
                //points[Count-1].XCoordinate-points[Count].YCoordinate 
                        isanother=1; 
                } 
                else isanother=0; 
        } 
        if(isanother==0){ 
                return false; 
        } 
        else if(isanother==1){ 
                return true; 
        } 
} 
 
 
//建立于7月25日 
//---------------------------------------------------------------------------- 
 
 
//---------------------------------------------------------------------------- 
double TForm1::distance(int a,int b){ //caculate the distance between two points 
        double templength; 
        double x1=points[a].XCoordinate; 
        double y1=points[a].YCoordinate; 
        double x2=points[b].XCoordinate; 
        double y2=points[b].YCoordinate; 
        templength=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 
        return templength; 
} 
//7.18建立本属于Function类 由于参数传递有问题 于7.20并为Form1类 
//---------------------------------------------------------------------------- 
double TForm1::Ttriangle(int a, int b, int c){//caculate all the length of a triangle 
        double length; 
        double length1=distance(a,b); 
        double length2=distance(b,c); 
        double length3=distance(a,c); 
        length=length1+length2+length3; 
        return length; 
} 
//7.18建立本属于Function类 由于参数传递有问题 于7.20并为Form1类 
 
//7.18建立本属于Function类 由于参数传递有问题 于7.20并为Form1类 
//---------------------------------------------------------------------------- 
 
void TForm1::decompose(){ 
 
        for(int i=1;i<=Count;i++){ 
                t[i][i]=0; 
        } 
        for(int q=2;q<=Count;q++){ 
                for(int i=1;i<=Count-q+1;i++){ 
                        int j=i+q-1; 
 
                        t[i][j]=t[i+1][j]+Ttriangle(i-1,i,j); 
                        s[i][j]=i; 
 
                for(int k=i+1;k<=q+i-1;k++){ 
                        double r=t[i][k]+t[k+1][j]+Ttriangle(i-1,k,j); 
                        if(rCanvas->Pen->Style=psDot; 
        Image1->Canvas->Pen->Color=clNavy; 
        Image1->Canvas->Pen->Width=1; 
        DrawLines(1,Count); 
        Image1->Canvas->Pen->Style=bsSolid; 
        Image1->Canvas->Pen->Color=clAqua; 
        Image1->Canvas->Pen->Width=2; 
        for(int i=0;iCanvas->MoveTo(points[i].XCoordinate,points[i].YCoordinate); 
                Image1->Canvas->LineTo(points[i+1].XCoordinate,points[i+1].YCoordinate); 
        } 
 
} 
 
 
/*before 7.22        for(int k=2;k<=Count;k++){ 
                for(i=1;i<=Count-k+1;i++){ 
                        j=i+k-1; 
                        if(s[i][j]!=0){ 
                                Image1->Canvas->MoveTo(points[i-1]->XCoordinate, 
                                points[i-1]->YCoordinate); 
                                Image1->Canvas->LineTo(points[k]->XCoordinate, 
                                points[k]->YCoordinate); 
                                Image1->Canvas->MoveTo(points[k]->XCoordinate, 
                                points[k]->YCoordinate); 
                                Image1->Canvas->LineTo(points[j]->XCoordinate, 
                                points[j]->YCoordinate); 
                        } 
                } 
7.21 具体实现 
7.18建立本属于Function类 由于参数传递有问题 于7.20并为Form1类 */ 
//----------------------------------------------------------------------------- 
 
 
 
 
void __fastcall TForm1::Button2Click(TObject *Sender) 
{ 
        float length=0; 
        decompose(); 
        if(Count==2){length=0;} 
        else {length=(float)((t[1][Count]-PLength())/2); }    //计算真正的权值 
        Image1->Canvas->TextOutA(0,0,"Length of all the chords is:  "+FloatToStr(length)); 
        Button2->Enabled=false; 
        e1->Enabled=false; 
 
        for(int i=0;iCanvas->MoveTo(points[i-1].XCoordinate,points[i-1].YCoordinate); 
                Image1->Canvas->LineTo(points[k].XCoordinate,points[k].YCoordinate); 
                Image1->Canvas->MoveTo(points[k].XCoordinate,points[k].YCoordinate); 
                Image1->Canvas->LineTo(points[j].XCoordinate,points[j].YCoordinate); 
                DrawLines(i,k);             //using recursion 
                DrawLines(k+1,j); 
        } 
        HasDraw=2; 
} 
 
 
//------------------------------------------------------------------------------ 
__fastcall TForm1::~TForm1(){ 
        for(int i=0;iCaption==DefaultName){ 
                result=Application->MessageBoxA("Save the image?","Save",4); 
        } 
        if(result==6){ 
                        Save1Click(Sender); 
                } 
        } 
 
        Form1->Caption="Unnamed"; 
        Image1->Canvas->TextOutA(0,0,"                                                                           "); 
        Image1->Canvas->Pen->Color=clWhite; 
        Image1->Picture->LoadFromFile(PathName+"code/4.bmp"); 
        Image1->Canvas->Refresh(); 
        if(PointFlag==1){ 
        for(int i=0;i<=Count;i++){ 
                delete NodeImage[i]; 
        } 
        delete []points; 
        } 
        Count=-1; 
        FormCreate(Sender); 
        t[1][Count]=0; 
        BitBtn1->SetFocus(); 
 
 
} 
//--------------------------------------------------------------------------- 
 
 
void __fastcall TForm1::Exit1Click(TObject *Sender) 
{ 
        Form1->Close(); 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::e1Click(TObject *Sender) 
{ 
        if(Count>=0){ 
                delete NodeImage[Count]; 
                Count--; 
        } 
        Edit5->Text=IntToStr(Count+1); 
        Image1->Canvas->TextOutA(0,15*(Count+2),"                                   "); 
        CanSet=false; 
        if(Count<2){Button1->Enabled=false;   Button2->Enabled=false;} 
 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::connect1Click(TObject *Sender) 
{ 
        Button1Click(Sender);         
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::Decompose1Click(TObject *Sender) 
{ 
        Button2Click(Sender);         
} 
//--------------------------------------------------------------------------- 
 
 
 
 
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, 
      int X, int Y) 
{ 
        Edit3->Text=IntToStr(X); 
        Edit4->Text=IntToStr(Y); 
} 
//--------------------------------------------------------------------------- 
 
 
void __fastcall TForm1::Save1Click(TObject *Sender) 
{ 
        if(HasDraw==2){ 
        if(Form1->Caption==DefaultName){ 
                Form1->Caption=InputBox("save","Put in the name",DefaultName); 
                } 
        if(Form1->Caption!=DefaultName){ 
                Image1->Picture->SaveToFile(PathName+"history/"+Form1->Caption+".bmp"); 
        } 
        } 
 
} 
//--------------------------------------------------------------------------- 
 
 
void __fastcall TForm1::BitBtn2Click(TObject *Sender) 
{ 
        if(xEnter==1&&yEnter==1&&IntFlag==1){ 
                if(TagetX>=0&&TagetX<=Image1->Width 
                &&TagetY>=0&&TagetY<=Image1->Height){ 
                for(int i=0;i<=Count;i++){ 
                if(points[i].select==1){ 
                        select=1; 
                        NodeImage[i]->Left=TagetX+(Image1->Left)-4.5; 
                        NodeImage[i]->Top=TagetY-4.5+(Image1->Top); 
                        points[i].XCoordinate=TagetX; 
                        points[i].YCoordinate=TagetY; 
                        Image1->Canvas->TextOutA(0,15*(i+1),IntToStr(i+1)+"    "+ 
                        IntToStr(points[i].XCoordinate)+"  "+IntToStr(points[i].YCoordinate)); 
                        NodeImage[i]->Picture->LoadFromFile(PathName+"/code/2.bmp"); 
                        } 
                } 
                if(select!=1){ 
                        Count++; 
                        points[Count].SetNode(TagetX,TagetY); 
                        NodeImage[Count]=new TImage(Image1);  //realize a n object 
                        NodeImage[Count]->Picture->LoadFromFile(PathName+"/code/2.bmp"); 
                        NodeImage[Count]->Left=TagetX+(Image1->Left)-4.5; 
                        NodeImage[Count]->Top=TagetY-4.5+(Image1->Top); 
                        NodeImage[Count]->Width=9; 
                        NodeImage[Count]->Height=9; 
                        NodeImage[Count]->Parent=Form1; 
                        NodeImage[Count]->Tag=Count; 
                        NodeImage[Count]->OnClick=NodeImageClick; 
                        Edit5->Text=IntToStr(Count+1); 
                        Image1->Canvas->TextOutA(0,15*(Count+1),IntToStr(Count+1)+"    "+ 
                        IntToStr(points[Count].XCoordinate)+"  "+IntToStr(points[Count].YCoordinate)); 
                        PointFlag=1; 
                        } 
                } 
        } 
        if(Count>1){ 
                Button1->Enabled=true; 
                connect1->Enabled=true; 
        } 
        Edit6->Clear(); 
        Edit7->Clear(); 
        Edit6->Enabled=false; 
        Edit7->Enabled=false; 
        CanSet=false; 
        BitBtn2->Enabled=false; 
        IntFlag=1; 
        BitBtn1->SetFocus(); 
        TagetX=-1; 
        TagetY=-1; 
        select=0; 
        for(int i=0;i<=Count;i++){ 
                        points[i].select=0; 
        } 
 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::Edit6Change(TObject *Sender) 
{       BitBtn2->Enabled=true; 
        BitBtn2->Enabled=true; 
        xEnter=1; 
        if(Edit6->Text!=""&&IntFlag==1) 
        TagetX=StrToInt(Edit6->Text); 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::Edit7Change(TObject *Sender) 
{       BitBtn2->Enabled=true; 
        yEnter=1; 
        if(Edit7->Text!=""&&IntFlag==1) 
        TagetY=StrToInt(Edit7->Text); 
} 
//--------------------------------------------------------------------------- 
 
 
void __fastcall TForm1::Edit6KeyPress(TObject *Sender, char &Key) 
{ 
        BitBtn2->Enabled=true; 
        if(Key!=8&&Key!=46&&Key!=13){ 
        if((Key<=47)||(Key>=58)){ 
        IntFlag=0; 
        } 
        } 
        if(Key==13)Edit7->SetFocus(); 
 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::Edit7KeyPress(TObject *Sender, char &Key) 
{       BitBtn2->Enabled=true; 
        if(Key!=8&&Key!=46&&Key!=13){ 
        if((Key<=47)||(Key>=58)){ 
        IntFlag=0; 
        } 
        } 
        if(Key==13) BitBtn2->SetFocus(); 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::BitBtn2KeyPress(TObject *Sender, char &Key) 
{ 
        if(Key==13) BitBtn2Click(Sender); 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::BitBtn1KeyPress(TObject *Sender, char &Key) 
{ 
        if(Key==13)   BitBtn1Click(Sender); 
} 
//--------------------------------------------------------------------------- 
 
//--------------------------------------------------------------------------- 
 
 
void __fastcall TForm1::History1Click(TObject *Sender) 
{ 
        if(HasDraw==2){ 
        if(Form1->Caption==DefaultName){ 
                int result=Application->MessageBoxA("Save the image?","Save",4); 
                if(result==1){ 
                        Save1Click(Sender); 
                } 
        } 
        } 
        New1Click(Sender); 
 
        if(Open->Execute()) 
        { 
                Image1->Picture->LoadFromFile(Open->FileName); 
                Form1->Caption=Open->FileName; 
                BitBtn1->Enabled=false; 
                BitBtn2->Enabled=false; 
                Delete->Enabled=false; 
                e1->Enabled=false; 
                connect1->Enabled=false; 
                Decompose1->Enabled=false; 
        } 
        Save1->Enabled=false; 
} 
//--------------------------------------------------------------------------- 
 
 
 
 
void __fastcall TForm1::DeleteClick(TObject *Sender) 
{ 
        e1Click(Sender);         
} 
//--------------------------------------------------------------------------- 
 
 
 
 
 
void __fastcall TForm1::About1Click(TObject *Sender) 
{ 
        About->Show(); 
} 
//--------------------------------------------------------------------------- 
 
 
void __fastcall TForm1::Help2Click(TObject *Sender) 
{ 
        AnsiString ExePath=ExtractFilePath(Application->ExeName); 
	ShellExecute(NULL,"open",(ExePath+"PDSHELP.chm").c_str(),     	NULL, NULL, SW_SHOWNORMAL); 
} 
//---------------------------------------------------------------------------