c++ builder ip地址输入控件

蓝不蓝编程
博客专家认证
2010-11-18 10:16:46
想做个小软件,需要在界面上提供像网络连接中配置ip一样的。
在网上找了很久都没有找到合适的,有找到delphi和c++ builder 对sysipaddress32封装的,但是看起来的效果不大好,ip地址输入框下方都有条黑线,左右方向键响应也有问题。
若有高手知道怎么做,承蒙指教。
...全文
399 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝不蓝编程 2010-12-04
  • 打赏
  • 举报
回复
非常感谢各位的支持,还是没有找到比较好的方法,我打算还是自己写一个控件来用。奋斗中。。。
牧牛童子 2010-11-20
  • 打赏
  • 举报
回复
JVCL里有IP地址控件,
若不想用第三方控件,可用Edit,做好限制,也可以实现效果。下面是我程序里的实现,可将就着用。
bool __fastcall TForm1::is_ipaddress_char(wchar_t key_char)
{
//检查字符是否为合法的IP地址字符
//key_char==0x08 为Backspace键
//if(key_char=='.' || key_char=='0' || key_char=='1' || key_char=='2' || key_char=='3' || key_char=='4' || key_char=='5' || key_char=='6' || key_char=='7' || key_char=='8' || key_char=='9' || key_char==VK_LEFT || key_char ==VK_RIGHT || key_char==0x0d ||key_char==0x08)

if(key_char=='.' || key_char=='0' || key_char=='1' || key_char=='2' || key_char=='3' || key_char=='4' || key_char=='5' || key_char=='6' || key_char=='7' || key_char=='8' || key_char=='9' ||key_char==0x08)
{
return true;
}
else
{
return false;
}
}
//---------------------------------------
bool __fastcall TForm1::is_valid_ipaddress_str(String ip_src)
{
//检查IP地址字符串是否有效
if((ip_src.c_str()[0]=='.') || (ip_src.c_str()[ip_src.Length()-1]=='.') || (ip_src.Length()>15 ))
{
//以“.”开头或结尾 或长度超过15字符
return false;
}

int ip_src_len=ip_src.Length() ;
wchar_t dot_str[3]={0},sub_wchar[3]={0};
wcsncpy(dot_str,L"..",2);
for(int i=0;i<ip_src_len-1;i++)
{
wcsncpy(sub_wchar,ip_src.SubString(i,2).w_str(),2);
if(!wcscmp(sub_wchar,dot_str))
{
return false;
}
}

//TStringList *tsl = new TStringList;
const wchar_t deli ='.';
wchar_t *p = wcstok(ip_src.c_str(),&deli);
int count=0;
String str("");
while(p!=NULL)
{
str = String(p);
count+=1;
if((StrToInt(str)>255)||(str.Length()>3 )) return false; //单个节值大于255或长度大于3
//tsl->Add(str);
p = wcstok(NULL,&deli);
}
if(count!=4) return false; //节数不为4个

return true;

}
//---------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, wchar_t &Key)
{
if(Key==0x0d)
{
//ShowMessage("回车键被按下");
}
else
{
if(!is_ipaddress_char(Key))
{
//不为IP地址有效字符时
Key=0;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
if(!is_valid_ipaddress_str(Edit1->Text ))
{
Edit1->Color =clRed;
MessageBox(NULL,"请别急着走开!\n\n 所填写的IP地址不合规,请修正!","消息",16);
Edit1->SetFocus();
}
else
{
Edit1->Color =clWindow;
}
}
BCBPLC 2010-11-20
  • 打赏
  • 举报
回复
用MaskEdit做呀,简单
fy18yy29 2010-11-19
  • 打赏
  • 举报
回复
进来长见识了
wasx1 2010-11-19
  • 打赏
  • 举报
回复
进来学习啦
  • 打赏
  • 举报
回复
可以直接用 ipa->Enabled = false; 禁用,用 ipa->Text 读写输入的内容。
用 VCL 创建标准控件还是很简单的。
  • 打赏
  • 举报
回复
class TSysIPAddress32 : public TWinControl
{
public:
__property Text;
__fastcall TSysIPAddress32(Classes::TComponent* AOwner);
protected:
void __fastcall CreateParams(Controls::TCreateParams & Params);
};
__fastcall TSysIPAddress32::TSysIPAddress32(Classes::TComponent* AOwner)
: TWinControl(AOwner)
{
TabStop = true;
}
void __fastcall TSysIPAddress32::CreateParams(Controls::TCreateParams & Params)
{
TWinControl::CreateParams(Params);
CreateSubClass(Params, _T("SysIPAddress32"));
Params.Style |= WS_TABSTOP;
}




TSysIPAddress32 *ipa;



__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ipa = new TSysIPAddress32(this);
ipa->Parent = Panel1;
ipa->Left = 10;
ipa->Top = 5;
ipa->Width = 150;
ipa->Height = 22;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Label1->Caption = ipa->Text;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
ipa->Text = _T("111.222.33.44");
}
//---------------------------------------------------------------------------
  • 打赏
  • 举报
回复
很简单的,和其他普通控件一样的用法


class TSysIPAddress32 : public TWinControl
{
public:
__property Text;
__fastcall TSysIPAddress32(Classes::TComponent* AOwner);
protected:
void __fastcall CreateParams(Controls::TCreateParams & Params);
};
__fastcall TSysIPAddress32::TSysIPAddress32(Classes::TComponent* AOwner)
: TWinControl(AOwner)
{
TabStop = true;
}
void __fastcall TSysIPAddress32::CreateParams(Controls::TCreateParams & Params)
{
TWinControl::CreateParams(Params);
CreateSubClass(Params, _T("SysIPAddress32"));
Params.Style |= WS_TABSTOP;
}



TSysIPAddress32 *ipa;



__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ipa = new TSysIPAddress32(this); // 创建
ipa->Parent = Panel1; // 放在何处
ipa->Left = 10; // X位置
ipa->Top = 5; // Y位置
ipa->Width = 150; // 宽度
ipa->Height = 22; // 高度
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Label1->Caption = ipa->Text; // 获取输入的IP地址
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ipa->Text = _T("111.222.33.44"); // 输出到IP地址显示
}
蓝不蓝编程 2010-11-18
  • 打赏
  • 举报
回复
这个我已经有了。

HWND ipEdit = CreateWindow(WC_IPADDRESS,NULL,WS_CHILD|WS_VISIBLE,
left,top,width,height,parentHandle,0,HInstance,NULL);
SendMessage(ipEdit,WM_SETFONT,(WPARAM)this->Font->Handle,0);//修改字体

这种实现方式有几个问题:
1、tab键问题,因为放在面板上,当输入tab键,如何切换到下一个控件
2、如何禁用,就是显示为灰色,不允许输入。


银点 2010-11-18
  • 打赏
  • 举报
回复

HWND hIP;
INITCOMMONCONTROLSEX CommCtrl;
CommCtrl.dwSize=sizeof(CommCtrl);
CommCtrl.dwICC=ICC_INTERNET_CLASSES;//指定Class
if(InitCommonControlsEx(&CommCtrl))
{
hIP=CreateWindow(TEXT( "SysIPAddress32"),
TEXT( "IPADDR1"),WS_CHILD | WS_TABSTOP | WS_GROUP,1,1,130,24,Handle, 0,0,0);
ShowWindow(hIP, SW_SHOW);

char cIP[16];
GetWindowText(hIP,cIP,16);
}

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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