ListView1.ViewStyle:=vsReport;
解决方案 »
- 批量数据更新问题
- delphi5在windowXP上为什么设断点不起作用?如何解决?
- GetHostname()问题?
- 刷新表的时候提示it is not uniquely indexed?应该如何解决啊?
- 哪里可以下载installshield的中文教程或帮助?
- 高手请进,解决立即给分!先谢了
- 紧急,有关程序打包的问题
- lua中string.find()方法使用时得不到正确的结果
- 怎么让做好的程序只启动一次?
- 字符串自动换行函数,大家帮看一下是哪有问题,为什么总是乱码了??????????
- 动态调用a.dll中的b(long a) 返回数值类型long,请问如何写啊???
- TADOdataset不能更新的问题!
SysUtils, Classes, Controls, ComCtrls,StdCtrls,Messages,
QDialogs,commctrl,windows;type
LISTVIEW_CUSTATE=(FTINSERT,FTEDIT,FTNONE);
TOnClickNewEvent=
procedure (Sender:TObject;
EditText:string;
Index,SubItem:Integer) of object;
TOnClickEditEvent=
procedure (Sender:TObject;
EditText:string;
Index,SubItem:Integer) of object;
TOnDbclkNewEvent=procedure (Sender:TObject) of object;
TOnDbclkEditEvent=procedure (Sender:TObject;Index:Integer) of object; TIntList=class
private
m_IntList:array of Integer;
public
constructor Create;
function Add(Item:Integer):Integer;
function IndexOf(Item:Integer):Integer;
procedure Delete(Item:Integer);
procedure Clear;
end; TDbListView = class(TCustomListView)
private
m_Edit:TEdit;
m_IndexList:TIntList;
CuEditIndex,CuEditSubIndex:Integer;
FOnClickNewEvent:TOnClickNewEvent;
FOnClickEditEvent:TOnClickEditEvent;
FOnDbclkEditNpEditEvent,FOnDbclkNewEvent:TOnDbclkNewEvent;
FOnDbclkEditEvent:TOnDbclkEditEvent; protected
FEditState:LISTVIEW_CUSTATE; procedure OnBLClickUp(var msg :TMessage);message WM_LBUTTONUP;
procedure OnBLClickDown(var msg :TMessage);message WM_LBUTTONDOWN;
procedure OnDblClick(var msg:TMessage);message WM_LBUTTONDBLCLK;
procedure OnEditExit(Sender:TObject);
procedure DBEditKeyPress(Sender: TObject;
var Key: Char);
procedure ListViewCustomDraw(
Sender: TCustomListView;
const ARect: TRect; var DefaultDraw: Boolean);
public
constructor Create(Owner: TComponent);override;
destructor Destroy; override;
procedure AddEditIndex(index:Integer);
procedure DeleteEditIndex(index:Integer);
procedure CleareEditIndex;
function GetSubItemIndex(x:Integer;var xPos:Integer):Integer;
published
property Action;
property Align;
property AllocBy;
property Anchors;
property BevelEdges;
property BevelInner;
property BevelOuter;
property BevelKind default bkNone;
property BevelWidth;
property BiDiMode;
property BorderStyle;
property BorderWidth;
property Checkboxes;
property Color;
property Columns;
property ColumnClick;
property Constraints;
property Ctl3D;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property Font;
property FlatScrollBars;
property FullDrag;
property HideSelection;
property HotTrack;
property HotTrackStyles;
property HoverTime;
property IconOptions;
property Items;
property LargeImages;
property OwnerData;
property OwnerDraw;
property ParentBiDiMode;
property ParentColor default False;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowColumnHeaders;
property ShowWorkAreas;
property ShowHint;
property SmallImages;
property SortType;
property StateImages;
property TabOrder;
property TabStop default True;
property Visible;
property OnAdvancedCustomDraw;
property OnAdvancedCustomDrawItem;
property OnAdvancedCustomDrawSubItem;
property OnChange;
property OnChanging;
property OnClick;
property OnClickNewEvent: TOnClickNewEvent read FOnClickNewEvent write FOnClickNewEvent;
property OnClickEditEvent: TOnClickEditEvent read FOnClickEditEvent write FOnClickEditEvent;
property OnDbclkNewEvent: TOnDbclkNewEvent read FOnDbclkNewEvent write FOnDbclkNewEvent;
property OnDbclkEditEvent: TOnDbclkEditEvent read FOnDbclkEditEvent write FOnDbclkEditEvent;
property OnDbclkEditNpEditEvent:TOnDbclkNewEvent read FOnDbclkEditNpEditEvent write FOnDbclkEditNpEditEvent;
property OnColumnClick; property OnColumnDragged;
property OnColumnRightClick;
property OnCompare;
property OnContextPopup;
property OnCustomDrawItem;
property OnCustomDrawSubItem;
property OnData;
property OnDataFind;
property OnDataHint;
property OnDataStateChange;
property OnDeletion;
property OnDrawItem;
property OnEdited;
property OnEditing;
property OnEndDock;
property OnEndDrag; property OnEnter;
property OnExit;
property OnGetImageIndex;
property OnGetSubItemImage;
property OnDragDrop;
property OnDragOver;
property OnInfoTip;
property OnInsert;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnResize;
property OnSelectItem;
property OnStartDock;
property OnStartDrag;
end;
begin
RegisterComponents('Data Controls', [TDbListView]);
end;constructor TIntList.Create;
begin
SetLength(m_IntList,0);
end;procedure TIntList.Delete(Item:Integer);
var
I:Integer;
begin
for I:=0 to Length(m_IntList)-1 do
begin
if Item=m_IntList[I] then break;
end;
for I:=I to Length(m_IntList)-2 do
begin
m_IntList[I]:=m_IntList[I+1];
end;
SetLength(m_IntList,Length(m_IntList)-1);
end;procedure TIntList.Clear;begin
SetLength(m_IntList,0);
end;function TIntList.Add(Item:Integer):Integer;
begin
SetLength(m_IntList,Length(m_IntList)+1);
m_IntList[Length(m_IntList)-1]:=Item;
Result:=Length(m_IntList)-1;
end;function TIntList.IndexOf(Item:Integer):Integer;
var
I:Integer;
begin
Result:=-1;
for I:=0 to Length(m_IntList)-1 do
begin
if Item=m_IntList[I] then
begin
Result:=I;
exit;
end;
end;
end;constructor TDbListView.Create(Owner: TComponent);
begin
inherited Create(Owner);
ViewStyle:=vsReport;
GridLines:=true;
RowSelect:=true;
OnCustomDraw:=ListViewCustomDraw;
m_Edit:=TEdit.Create(self);
m_Edit.OnExit:=OnEditExit;
m_Edit.OnKeyPress:=DBEditKeyPress;
m_Edit.Visible:=false;
m_IndexList:=TIntList.Create;
ReadOnly:=true;
Left:=0;
Top:=0;
m_Edit.Width:=0;
FEditState:=FTNONE;
end;destructor TDbListView.Destroy;
begin
m_Edit.Free;
m_IndexList.Free;
Inherited Destroy;
end;procedure TDbListView.AddEditIndex(index:Integer);
begin
m_IndexList.Add(index);
end;procedure TDbListView.DeleteEditIndex(index:Integer);
begin
m_IndexList.Delete(m_IndexList.IndexOf(Index));
end;procedure TDbListView.OnBLClickUp(var msg :TMessage);
var
pinfo:tagLVHITTESTINFO;
iSubIndex,Index:Integer;
rc:TRECT;
pI:TListItem;
z:Integer;
edittext:array [0..200] of AnsiChar;
begin
inherited;
if Columns.Count<1 then exit;
pInfo.pt.X:=msg.LParamLo;
pInfo.pt.Y:=msg.LParamHi;
Index:=SendMessage(Handle,
LVM_SUBITEMHITTEST,0,LPARAM(@pinfo));
iSubIndex:=pinfo.iSubItem;
if (m_Edit.Visible) and
(CuEditIndex=Index)
and (CuEditSubIndex=pInfo.iSubItem) then exit; m_Edit.ParentWindow:=ParentWindow;
if Index>-1 then
begin
z:=m_IndexList.IndexOf(
iSubIndex);
if z>-1 then
begin
ListView_GetSubItemRect(Handle,
Index,pinfo.iSubItem,LVIR_LABEL,@rc);
m_Edit.Left:=rc.Left;
m_Edit.Top:=rc.Top;
m_Edit.Width:=rc.Right-rc.Left;
m_Edit.Height:=rc.Bottom-rc.Top; ListView_GetItemText(Handle,
Index,pInfo.iSubItem,@edittext[0],200);
m_Edit.Text:=edittext; m_Edit.Parent:=self;
m_Edit.Visible:=true;
m_Edit.SelectAll;
m_Edit.SetFocus;
CuEditIndex:=Index;
CuEditSubIndex:=pinfo.iSubItem;
if FEditState<> FTINSERT then
FEditState:=FTEDIT;
end;
end
else
begin
if m_IndexList.IndexOf(
iSubIndex)>-1 then
begin
self.Items.BeginUpdate;
pI:=Items.Add;
pI.Caption:='';
self.Items.EndUpdate;
FEditState:=FTINSERT; end;
end;
end;procedure TDbListView.CleareEditIndex;
begin
m_IndexList.Clear;
end;function TDbListView.GetSubItemIndex(x:Integer;var xPos:Integer):Integer;
var
I:Integer;
PreStartX,StartX:Integer;
begin
StartX:=0;
PreStartX:=0;
for I:=0 to Columns.Count-1 do
begin
if StartX>X then break;
PreStartX:=StartX;
StartX:=StartX+Columns.Items[I].Width;
end;
if StartX<x then Result:=-1 else Result:=I;
xPos:=PreStartX;
end;procedure TDbListView.OnDblClick(var msg:TMessage);
var
Index,iSubIndex:Integer;
pinfo:tagLVHITTESTINFO;
begin
inherited;
if Columns.Count<1 then exit;
pInfo.pt.X:=msg.LParamLo;
pInfo.pt.Y:=msg.LParamHi;
Index:=SendMessage(Handle,
LVM_SUBITEMHITTEST ,0,LPARAM(@pinfo));
iSubIndex:=pInfo.iSubItem;
if m_IndexList.IndexOf(
iSubIndex)>0 then exit; if (Index>-1)
then
begin
if Assigned(FOnDbclkEditEvent) then
FOnDbclkEditEvent(self,Index)
else if Assigned(FOnDbclkEditNpEditEvent) then
FOnDbclkEditNpEditEvent(self);
end
else
begin
if Assigned(FOnDbclkNewEvent) then FOnDbclkNewEvent(self);
end;
end;procedure TDbListView.OnEditExit(Sender:TObject);
var
pCustomEdit:TCustomEdit;
begin pCustomEdit:=TCustomEdit(Sender);
pCustomEdit.Visible:=false;
m_Edit.Visible:=false;
if FEditState=FTINSERT then
begin
if Assigned(FOnClickNewEvent) then
begin
FOnClickNewEvent(self,pCustomEdit.Text,CuEditIndex,CuEditSubIndex);
end
else
Items.Delete(CuEditIndex);
end
else
begin
if Assigned(FOnClickEditEvent) then
begin
FOnClickEditEvent(self,pCustomEdit.Text,CuEditIndex,CuEditSubIndex);
end;
end;
FEditState:=FTNONE;end;procedure TDbListView.DBEditKeyPress(Sender: TObject;
var Key: Char);
begin
if Key=Char(VK_ESCAPE) then
begin
m_Edit.Visible:=false;
if FEditState=FTINSERT then
begin
Items.Delete(CuEditIndex);
end;
end;
if Key=Char(VK_RETURN) then
begin
m_Edit.Visible:=false;
OnEditExit(m_Edit);
end;
end;procedure TDbListView.OnBLClickDown(var msg :TMessage);
var
pinfo:tagLVHITTESTINFO;
begin if m_Edit.Visible then
begin
OnEditExit(m_Edit);
end;
GetCursorPos(pInfo.pt);
SendMessage(Handle,
LVM_SUBITEMHITTEST,0,LPARAM(@pinfo));
if m_IndexList.IndexOf(pInfo.iSubItem)<0 then
inherited;
end;procedure TDbListView.ListViewCustomDraw(
Sender: TCustomListView;
const ARect: TRect; var DefaultDraw: Boolean);
var
rc:TRect;
begin
DefaultDraw:=true;
if m_Edit.Visible then
begin
ListView_GetSubItemRect(
Handle,CuEditIndex,CuEditSubIndex,LVIR_LABEL,@rc);
m_Edit.Left:=rc.Left;
m_Edit.Top:=rc.Top;
m_Edit.Width:=rc.Right-rc.Left;
m_Edit.Height:=rc.Bottom-rc.Top;
end;
end;
end.