如何将ComboBox放在ListView的某一项上?

tianshanfe 2007-10-16 05:28:20
如何将ComboBox放在ListView的某一项上?
...全文
311 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
laowang2 2007-10-26
  • 打赏
  • 举报
回复
c++ builder 中实现listview 里面 combobox,edit,datatimerpiker可以编辑

最近由于项目需要,自己封装了一个类,实现了listview 里面的combobox,edit,datetimerpiker可以
编辑的实现.如下
//---------------------------------------------------------------------------
#ifndef class_listviewH
#define class_listviewH
//---------------------------------------------------------------------------
#endif

#include <ComCtrls.hpp>
#include <StdCtrls.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
class listview_function
{
public:
TListView *ListView1; //listview的对象
TForm * Form1; //主要是用于activecontrol

TListItem *Item; //用户选择的第几行的item
int ncol_number; //listview的总列数目
int ncol_dbclick; //双击的时候所在的列
int ncol_modify; //用来记录是否修改的列
int ncol_dbclick_notuse[10]; // 用来记录 双击的时候所在的列,这些列没有反应的
int ncol_dbclick_notuse_number;//数目

typedef struct
{
TComboBox *ComboBox1;
TEdit *Edit1;
TDateTimePicker *DateTimePicker1;
int ncol; //列
}paris; //一个配对
paris pair[20];
int paris_number; //配对数目

int nWidth;
TRect Rect;
TPoint Pos; //右键双击的变量

void init_listview(TListView *ListView,TForm * Form); //初始化
void set_modify_ncol(int ncol);//设置修改的列
void set_ncol_unvisable(int ncol);//设置某一列不可见
void set_ncol_dbclick_notuse(int ncol); //设置某一列双击的时候不反映

void right_dbclick(); // 双击的函数
int is_dbclick_is_notuse(int ncol);
void set_pairs(TComboBox *ComboBox1,int col); //设置关联关系
void set_pairs(TEdit *Edit1,int col);
void set_pairs(TDateTimePicker *DateTimePicker1,int col);
void exit_paris(); //退出的时候
void exit_Combox(TComboBox *ComboBox1);
void exit_TEdit(TEdit *Edit1);
void exit_TDateTimePicker(TDateTimePicker *DateTimePicker1);
void set_activecontrol_ComboBox(TComboBox *ComboBox1);

void set_activecontrol_TEdit(TEdit *Edit1);
void set_activecontrol_TDateTimePicker(TDateTimePicker *DateTimePicker1);

void ontimer();
void set_paris_activecontrol_unvisable();
private:
void __fastcall TheTimerOnTimer(TObject *Sender);

};


请看原文:http://blog.csdn.net/huxiaoyong1983/archive/2006/05/22/749230.aspx
bestoml 2007-10-26
  • 打赏
  • 举报
回复
52VC,你的意思是不是刷新会出问题?不能动态刷新?
nuistcola 2007-10-23
  • 打赏
  • 举报
回复
将ComboBox放在ListView中不如放到TStringGrid里面 这样更好看:)
道理都一样,通过坐标控制ComboBox的位置。
通过TStringGrid的点击事件触发。
52vc 2007-10-23
  • 打赏
  • 举报
回复
以上是从别人那里复制过来的,原来发代码的人,我也不记得了,引用一下给你!
52vc 2007-10-23
  • 打赏
  • 举报
回复
以上是从别人那里复制过来的,原来发代码的人,我也不记得了,引用一下给你!
52vc 2007-10-23
  • 打赏
  • 举报
回复
想加什么都可以,不过有一个缺点,只能生成一次,不能动态变化!
52vc 2007-10-23
  • 打赏
  • 举报
回复
//----10.在listView中加入按钮,COMbox
void __fastcall AddBtnToListview(TCustomListView *Sender,
TListItem *Item, int SubItem, TCustomDrawState State,
bool &DefaultDraw,
//以下为自定义列
int Combox_COLUMN,bool single )
{
Tchkandbtn *P;
// ListView1=(TsuiListView *)Sender;
TPoint *Pos;
// DefaultDraw= false; // 不显示默认的文本.
if(Combox_COLUMN<0)
return;
if( Item->Data == NULL) // 如果为空则创建CheckBox及Button->
{
Loading= true; // 防止装载值时触发单击事件->
try
{
P= new Tchkandbtn(); // 创建一个指针用于存储CheckBox及Button->
if(Combox_COLUMN>0)
{
// { 创建并显示CheckBox }
P->Combox= new TRzComboBox((TsuiListView *)Sender);
P->Combox->Parent= (TsuiListView *)Sender;
if(single)
{
P->Combox->Items->Add("");
P->Combox->OnClick= ComboxClickEx;
}
else
{
P->Combox->Items->Add("");
P->Combox->OnClick= ComboxClick;
}
P->Combox->Hint=((TsuiListView *)Sender)->Name;
P->Combox->Style=csDropDownList;

P->Combox->Width= 120;
P->Combox->Height= 20;
}

Item->Data= P;

Loading= false;
}
catch(...)
{
//------
}
}
else
P= (Tchkandbtn *)Item->Data;

// { 计算CheckBox放置位置 }

if(Combox_COLUMN>0)
{
Pos= GetCenterPos( Item, Combox_COLUMN);
P->Combox->Left= Pos->x - (P->Combox->Width / 2);
P->Combox->Top= Pos->y - (P->Combox->Height / 2);
P->Combox->Visible= True;
}

}
//取得中心点位置
TPoint *__fastcall MIES_Products::GetCenterPos( TListItem *Item, int Index)
{
TPoint * Result;
Result=new TPoint();
TRect Rect;
// { 获取整个Item的显示区域 }
Rect= Item->DisplayRect(drBounds);
// { 计算指定列的显示区域 }
Rect.Left= Rect.Left + GetColumnWidth(false,Index);
Rect.Right= Rect.Right - GetColumnWidth(true,Index);
// { 计算出指定列显示区域中点 }
Result->x= Rect.Left + (Rect.Right - Rect.Left) / 2;
Result->y= Rect.Top + (Rect.Bottom - Rect.Top) / 2;
return Result;
}

// { 统计指定列之前或之前后其它所有列的宽度总和 }
int __fastcall MIES_Products::GetColumnWidth( bool After, int Index)
{
int Result= 0;
if (After ) // 之后
{
for( int i= Index +1 ; i<= ListView1->Columns->Count -1 ;i++)
Result= Result + ListView1->Column[i]->Width;
}
else
{ // 之前
for( int i= 0;i<= Index -1;i++ )
Result= Result + ListView1->Column[i]->Width;
}
return Result;
}
void __fastcall MIES_Products::ComboxClickEx(TObject *Sender)
{
TPoint *P;
P= new TPoint();
TListItem* Item ;
if (! Loading)
{
// ShowMessage(BoolToStr((Sender as TCheckBox)->Checked, True));
P->x= 2;
P->y= ((TRzComboBox*)Sender)->Top+5;
Item= ListView3->GetItemAt(P->x, P->y); // 获取Button中心点所在的Item->
if (Item != NULL)
{
Item->Selected=true;
bool flag=false;
if(((TRzComboBox*)Sender)->Value !="")
{
for(int i=0;i<ListView3->Items->Count;i++)
{
if(ListView3->Items->Item[i]->SubItems->Strings[1]==((TRzComboBox*)Sender)->Value&&ListView3->Items->Item[i]!=Item)
flag=true;
}
}
if(flag)
{
((TRzComboBox*)Sender)->ItemIndex=-1;
Item->SubItems->Strings[1]="";
PMSGDLG->ShowErrorMsg("!");
Item->StateIndex=0;
Abort();
}
else
{
Item->SubItems->Strings[1]=((TRzComboBox*)Sender)->Value;
Item->StateIndex=1;
}
}
// ShowMessage(ListView1->Name);
// ShowMessage(IntToStr(Item->Index) + ": " + Item->Caption + "("
// + BoolToStr((( TCheckBox*)Sender)->Checked, True) + ")");
}
}
void __fastcall MIES_Products::ComboxClick(TObject *Sender)
{
TPoint *P;
P= new TPoint();
TListItem* Item ;
if (! Loading)
{
// ShowMessage(BoolToStr((Sender as TCheckBox)->Checked, True));
P->x= 2;
P->y= ((TRzComboBox*)Sender)->Top+5;
Item= ListView2->GetItemAt(P->x, P->y); // 获取Button中心点所在的Item->
if (Item != NULL)
{
Item->Selected=true;
bool flag=false;
if(((TRzComboBox*)Sender)->Value !="")
{
for(int i=0;i<ListView2->Items->Count;i++)
{
if(ListView2->Items->Item[i]->SubItems->Strings[1]==((TRzComboBox*)Sender)->Value&&ListView2->Items->Item[i]!=Item)
flag=true;
}
}
if(flag)
{
((TRzComboBox*)Sender)->ItemIndex=-1;
Item->SubItems->Strings[1]="";
PMSGDLG->ShowErrorMsg("!");
Item->StateIndex=0;
Abort();
}
else
{
Item->SubItems->Strings[1]=((TRzComboBox*)Sender)->Value;
Item->StateIndex=1;
}
}
// ShowMessage(ListView1->Name);
// ShowMessage(IntToStr(Item->Index) + ": " + Item->Caption + "("
// + BoolToStr((( TCheckBox*)Sender)->Checked, True) + ")");
}
}
i_love_pc 2007-10-16
  • 打赏
  • 举报
回复
可以根据坐标位置来固定

604

社区成员

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

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