如何让ListBox显示Items中的内容(50分)

  • 主题发起人 主题发起人 lovefox
  • 开始时间 开始时间
L

lovefox

Unregistered / Unconfirmed
GUEST, unregistred user!
我是delphi初学者,我想做一个Edit和Listbox结合的组件。现在,组件中的FHelpIndex
无法在ListBox中显示。如何解决。
代码如下:
unit LBHelp;

interface

uses
Windows, Buttons, Messages, ExtCtrls, SysUtils, Classes, Graphics,Controls, Forms, Dialogs,StdCtrls;

type
TLBHelp = class(TCustomControl)
private
{ Private declarations }
FLabel:TLabel;
FEdit:TEdit;
FButton:TButton;
FHelpIndex:TStrings; // 搜索的序列,用户定义
FListBox:TListBox;//显示要搜索的所以内容
procedure SetHelpIndex(Value:TStrings);
protected
{ Protected declarations }
public
{ Public declarations }
constructor create(AOwner:TComponent);override;
Destructor Destroy; Override;
published
{ Published declarations }
property HelpIndex:TStrings read FHelpIndex write SetHelpIndex;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Lovefox', [TLBHelp]);
end;

constructor TLBHelp.create(AOwner:TComponent);
const
Gap=5;
begin
inherited Create(AOwner);
Width:=210;
Height:=233;

FLabel:=TLabel.create(self);
FLabel.parent:=self;
FLabel.height:=20;
FLabel.width:=210;
FLabel.caption:='Edit和ListBox结合的组件';
FLabel.top:=Gap;
FLabel.left:=Gap;

FEdit:=TEdit.create(self);
FEdit.parent:=self;
FEdit.height:=20;
FEdit.Width:=150;
FEdit.top:=FLabel.Top + FLabel.Height + Gap;
FEdit.left:=Gap;

FButton:=TButton.create(self);
FButton.parent:=self;
FButton.Caption:='搜索';
FButton.height:=20;
FButton.Width:=40;
FButton.top:=FEdit.Top;
FButton.left:=FEdit.left + FEdit.width + Gap;

FHelpIndex:=TStringList.Create;

FListBox:=TListBox.create(self);
FListBox.parent:=self;
FListBox.height:=200;
FListBox.width:=200;
FListBox.top:=FEdit.top + FEdit.height + Gap;
FListBox.left:=Gap;
end;
Destructor TLBHelp.Destroy;
begin
FLabel.free;
FEdit.free;
FButton.free;
FListBox.free;
inherited destroy;
end;

procedure TLBHelp.SetHelpIndex(value:TStrings);
begin
FHelpIndex.assign(value);
end;
end.
 
1. 目标叙述不是太清楚
2. 没有 FHelpIndex赋值给FListBox.Items 的代码, 如何显示?
3. Destroy 中少了 FHelpIndex.Free!!!
 
我是初学delphi,就是想让FHelpIndex赋值给FListBox.Items,
但不知道如何做,还请大虾指点啊。
 

procedure TLBHelp.SetHelpIndex(value:TStrings);
begin
FHelpIndex.assign(value);
FListBox.Items.assign(FHelpIndex)
end;

???要FHelpIndex有什么用



property HelpIndex:TStrings read GetHelpIndex write SetHelpIndex;

procedure TLBHelp.SetHelpIndex(value:TStrings);
begin
FListBox.Items.assign(value);
end;

procedure TLBHelp.GetHelpIndex :TStrings;
begin
result := FListBox.Items
end;

 
procedure TLBHelp.GetHelpIndex :TStrings;
begin
result := FListBox.Items
end;

上面的程序应该是Function吧。

那我再说一遍我的想法:(可能表达的不是很清楚啊)
我想做一个组件,其功能可以实现类似Windows的帮助那样的功能,当在输入框中动态的
填入字符的时候,ListBox的内容索引会随之进行搜索匹配。
 
看来只有将输入的内容与LISTBOX中的ITMES逐一比较后确定INDEX了。
 
to lovefox:

笔误,谢谢!

给Items赋值,就可以了,

procedure form1.OnCreate(sender :TObject);
begin
lbhelp1.items.loadfromfile(yourhelpfile);
// 或者逐条加入...
// lbhelp1.items.add(yourhelpitem);
//
end;

 
呵呵,多谢了。现在可以实现一部分用途了。
可是我写完程序后,又有问题了。功能仍然和刚才说的一样
实现类似Windows的帮助那样的功能,当在输入框中动态的
填入字符的时候,ListBox的内容索引会随之进行搜索匹配。
(slicker 50 分等解决完这个问题后,一并奉上。)
源代码如下:
unit LBHelp;

interface

uses
Windows, Buttons, Messages, ExtCtrls, SysUtils, Classes, Graphics,Controls, Forms, Dialogs,StdCtrls;

type
TLBHelp = class(TCustomControl)
private
{ Private declarations }
FLabel:TLabel;
FEdit:TEdit;
FButton:TButton;
FHelpIndex:TStrings; // 搜索的序列,用户定义
FListBox:TListBox;//显示要搜索的所有内容

//设置一些临时变量
Temps:string;

//要在published里面声明属性的读写
procedure SetHelpIndex(Value:TStrings);
Function GetHelpIndex:TStrings;
procedure FEditSearch(sender:TObject);
Function FEditOnChange(const x,y:LongInt):LongInt;

protected
{ Protected declarations }
public
{ Public declarations }
constructor create(AOwner:TComponent);override;
Destructor Destroy; Override;
published
{ Published declarations }
property HelpIndex:TStrings read GetHelpIndex write SetHelpIndex;

end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Lovefox', [TLBHelp]);
end;

constructor TLBHelp.create(AOwner:TComponent);
const
Gap=5;
begin
inherited Create(AOwner);
Width:=210;
Height:=250;

FLabel:=TLabel.create(self);
FLabel.parent:=self;
FLabel.height:=20;
FLabel.width:=210;
FLabel.caption:='哈哈,这是爱情狐狸的帮助组件';
FLabel.top:=Gap;
FLabel.left:=Gap;

FEdit:=TEdit.create(self);
FEdit.parent:=self;
FEdit.height:=20;
FEdit.Width:=150;
FEdit.top:=FLabel.Top + FLabel.Height + Gap;
FEdit.left:=Gap;
FEdit.OnChange:=FEditSearch;

FButton:=TButton.create(self);
FButton.parent:=self;
FButton.Caption:='搜索';
FButton.height:=20;
FButton.Width:=40;
FButton.top:=FEdit.Top;
FButton.left:=FEdit.left + FEdit.width + Gap;

FListBox:=TListBox.create(self);
FListBox.parent:=self;
FListBox.height:=200;
FListBox.width:=200;
FListBox.top:=FEdit.top + FEdit.height + Gap;
FListBox.left:=Gap;
FListBox.Sorted:=true;
end;
Destructor TLBHelp.Destroy;
begin
FLabel.free;
FEdit.free;
FButton.free;
FListBox.free;
FHelpIndex.free;
inherited destroy;
end;

procedure TLBHelp.SetHelpIndex(value:TStrings);
begin
FListBox.Items.assign(value);
end;

Function TLBHelp.GetHelpIndex :TStrings;
begin
result := FListBox.Items;
end;

Function TLBHelp.FEditOnChange(const x,y:LongInt):LongInt;
//折半查找
begin
If CompareStr(FListbox.Items[x],Temps)=0 then
result:=x
else
if CompareStr(FListbox.items[y],Temps)=0 then
result:=y
else
if (x=y) or (x=y-1) then
result:=x
else
if CompareStr(FListbox.items[(X+Y) div 2],Temps)>0 then
result:=FEditOnChange(x,(x+y) div 2)
else
result:=FEditOnChange((x+y) div 2,y);
end;

procedure TLBHelp.FEditSearch(sender:TObject);
begin
Temps:=FEdit.text;
if FListBox.Items.Count>0 then
begin
FListBox.TopIndex:=FEditOnChange(0,FListBox.Items.count-1);
end
else
showmessage('error');
end;


end.
 
什么新问题?
 
不可以激活FEdit的Onchage事件,或者说不知道激活了没有
 
有两个思路:
1、加入一个Timer1控件,把FEditOnChange中的代码放到Timer1OnTimer事件中来判断,
而不用FEditOnChange事件来作判断。
2、换成FEditOnKeyDown事件作判断试试。

(以上未作测试)不急的话,我试一下,明天给你答复。
 
我想让edit的输入框可以动态的查询,如果用OnkeyDown的事件的话,
碰到粘贴的话,无法响应啊。
 
procedure TLBHelp.FEditSearch(sender:TObject);
begin
Temps:=FEdit.text;
if FListBox.Items.Count>0 then
begin
FListBox.TopIndex:=FEditOnChange(0,FListBox.Items.count-1);
<font color=#0000ff> // add the follow code</font>
<font color=#ff0000> FListBox.ItemIndex := FListBox.TopIndex;</font>
end
else
showmessage('error');
end;
 
还是不可以啊。只有第一次可以找到,如果再输入值的话,无法实现动态查找。
呜呜。
 
你的FListBox.Items应该先排序折半查找才有效,做该类控件最好先在一个form上放几个控件调试
 
FListBox.Sorted:=true;


我代码中已经排好序了啊。呜呜。搞不定了。
 
我测试了一下你的代码没有什么问题,你将Tstings多设几行试试,topindex在一屏能显示的情况下好像不起作用
以下是我的测试代码

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
StdCtrls;

type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;
type
TLBHelp = class(TCustomControl)
private
{ Private declarations }
FLabel:TLabel;
FEdit:TEdit;
FButton:TButton;
FHelpIndex:TStrings; // 搜索的序列,用户定义
FListBox:TListBox;//显示要搜索的所以内容


//设置一些临时变量
Temps:string;

//要在published里面声明属性的读写
procedure SetHelpIndex(Value:TStrings);
Function GetHelpIndex:TStrings;
procedure FEditSearch(sender:TObject);
Function FEditOnChange(const x,y:LongInt):LongInt;

protected
{ Protected declarations }
public
{ Public declarations }
constructor create(AOwner:TComponent);override;
Destructor Destroy; Override;
published
{ Published declarations }
property HelpIndex:TStrings read FHelpIndex write SetHelpIndex;
end;

var
Form1: TForm1;
my:TLBHelp;
implementation

{$R *.DFM}

constructor TLBHelp.create(AOwner:TComponent);
const
Gap=5;
begin
inherited Create(AOwner);
Width:=210;
Height:=233;

FLabel:=TLabel.create(self);
FLabel.parent:=self;
FLabel.height:=20;
FLabel.width:=210;
FLabel.caption:='Edit和ListBox结合的组件';
FLabel.top:=Gap;
FLabel.left:=Gap;

FEdit:=TEdit.create(self);
FEdit.parent:=self;
FEdit.height:=20;
FEdit.Width:=150;
FEdit.top:=FLabel.Top + FLabel.Height + Gap;
FEdit.left:=Gap;

FEdit.OnChange:=FEditSearch;

FButton:=TButton.create(self);
FButton.parent:=self;
FButton.Caption:='搜索';
FButton.height:=20;
FButton.Width:=40;
FButton.top:=FEdit.Top;
FButton.left:=FEdit.left + FEdit.width + Gap;

FHelpIndex:=TStringList.Create;

FListBox:=TListBox.create(self);
FListBox.parent:=self;
FListBox.height:=200;
FListBox.width:=200;
FListBox.top:=FEdit.top + FEdit.height + Gap;
FListBox.left:=Gap;
end;

Destructor TLBHelp.Destroy;
begin
FLabel.free;
FEdit.free;
FButton.free;
FListBox.free;
inherited destroy;
end;

procedure TLBHelp.SetHelpIndex(value:TStrings);
begin
FHelpIndex.assign(value);
FListBox.Items.assign(FHelpIndex)
end;

Function TLBHelp.GetHelpIndex :TStrings;
begin
result := FListBox.Items;
end;

Function TLBHelp.FEditOnChange(const x,y:LongInt):LongInt;
//折半查找
begin
If CompareStr(FListbox.Items[x],Temps)=0 then
result:=x
else
if CompareStr(FListbox.items[y],Temps)=0 then
result:=y
else
if (x=y) or (x=y-1) then
result:=x
else
if CompareStr(FListbox.items[(X+Y) div 2],Temps)>0 then
result:=FEditOnChange(x,(x+y) div 2)
else
result:=FEditOnChange((x+y) div 2,y);
end;

procedure TLBHelp.FEditSearch(sender:TObject);
begin
Temps:=FEdit.text;
if FListBox.Items.Count>0 then
begin
FListBox.TopIndex:=FEditOnChange(0,FListBox.Items.count-1);
end
else
//showmessage('error');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
my:=TLBHelp.create(self);
my.parent:=form1;
my.SetHelpIndex(ListBox1.Items);
end;

end.
 
搞定搞定。赋值颠倒了。唉……


FListBox.ItemIndex:=FEditOnChange(0,FListBox.Items.count-1);
FListBox.TopIndex:=FListBox.ItemIndex;
多谢各位帮忙啊。小弟分数少,大家委屈了。
 
多人接受答案了。
 
后退
顶部