自己做组件,怎样实现将某个字段的所有记录显示在 ComboBox ?(100分)

  • 主题发起人 主题发起人 blindlf
  • 开始时间 开始时间
select 字段 form xx
if not query1.isempty then begin
while not query1.eof begin
ComboBox.items.add(query1....值);
query1.next
end;
end;
 
我的代码也是这样写的,可是一添加组件Delphi6就退出。

unit DBComboFilter;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, DbCtrls;

type
TDBComboFilter = class(TComboBox)
private
FDataLink: TFieldDataLink;
FDataLinkFilter: TFieldDataLink;
FFilter: string;
FFilterHaveNot: boolean;
FFilterHaveNotStr: string;
function GetDataSource : TDataSource;
function GetDataField : string;
function GetDataSourceFilter: TDataSource;
function GetFilter: string;
function GetFilterHaveNot: boolean;
function GetFilterHaveNotStr: string;
procedure SetDataSource(Value : TDataSource);
procedure SetDataField(const Value : string);
procedure SetDataSourceFilter(Value : TDataSource);
procedure SetFilter(const Value : string);
procedure SetFilterHaveNot(const Value : boolean);
procedure SetFilterHaveNotStr(const Value : string);
procedure DataChange(Sender : Tobject);
procedure CMChanged(var Message: TMessage); message CM_CHANGED;
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property DataSource: TDataSource read GetDataSource write SetDataSource;
property DataField: string read GetDataField write SetDataField;
property DataSourceFilter: TDataSource read GetDataSourceFilter write SetDataSourceFilter;
property Filter: string read GetFilter write SetFilter;
property FilterHaveNot : boolean read GetFilterHaveNot write SetFilterHaveNot;
property FilterHaveNotStr : string read GetFilterHaveNotStr write SetFilterHaveNotStr;
end;

procedure Register;

implementation

constructor TDBComboFilter.Create;
begin
inherited Create(AOwner);
FDataLink := TFieldDataLink.Create;
FDataLink.OnDataChange := DataChange;
FDataLinkFilter := TFieldDataLink.Create;
FFilterHaveNot := True;
FFilterHaveNotStr := '';
end;

destructor TDBComboFilter.Destroy;
begin
FDataLink.Free;
FDataLink := nil;
FDataLinkFilter.Free;
FDataLinkFilter := nil;
inherited Destroy;
end;

function TDBComboFilter.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;

procedure TDBComboFilter.SetDataSource(Value: TDataSource);
begin
FDataLink.DataSource := Value;
end;

function TDBComboFilter.GetDataField: string;
begin
Result := FDataLink.FieldName;
end;

procedure TDBComboFilter.SetDataField(const Value: string);
begin
FDataLink.FieldName := Value;
end;

function TDBComboFilter.GetDataSourceFilter: TDataSource;
begin
Result := FDataLinkFilter.DataSource;
end;

procedure TDBComboFilter.SetDataSourceFilter(Value: TDataSource);
begin
FDataLinkFilter.DataSource := Value;
end;

function TDBComboFilter.GetFilter: string;
begin
Result := FFilter;
end;

procedure TDBComboFilter.SetFilter(const Value: string);
begin
FFilter := Value;
end;

function TDBComboFilter.GetFilterHaveNot : boolean;
begin
Result := FFilterHaveNot;
end;

procedure TDBComboFilter.SetFilterHaveNot(const Value : boolean);
begin
FFilterHaveNot := Value;
end;

function TDBComboFilter.GetFilterHaveNotStr: string;
begin
Result := FFilterHaveNotStr;
end;

procedure TDBComboFilter.SetFilterHaveNotStr(const Value : string);
begin
FFilterHaveNotStr := Value;
end;

procedure TDBComboFilter.DataChange(Sender : Tobject);
var
bok: TBookMark;
begin
if FDataLink.Field <> nil then
begin
//Items.BeginUpdate;
Items.Clear;
if FFilterHaveNot then Items.Add(FFilterHaveNotStr);
with FDataLink.DataSource.DataSet do
begin
bok := GetBookmark;
first;
while not eof do
begin
Items.Add(FieldByName(FDataLink.FieldName).Value);
next;
end;
GotoBookMark(bok);
FreeBookMark(bok);
bok := nil;
end;
//Items.EndUpdate;
end;
end;

procedure TDBComboFilter.CMChanged(var Message: TMessage);
begin
if FDataLink.Field <> nil then
begin
with FDataLink.DataSource.DataSet do
begin
Filtered := false;
if Items[ItemIndex] <> FFilterHaveNotStr then
begin
Filter := Items[ItemIndex];
Filtered := true;
end;
end;
end;
end;

procedure Register;
begin
RegisterComponents('Other Controls', [TDBComboFilter]);
end;

end.
 
我第一次做组件,代码很可能不对,请各位给看看。

组件功能:
从DataSource的Field中获取所有记录,添加到ComboBox
当ComboBox的文字改变时就设置DataSourceFilter的DataSet的Filter属性。
 
我安装运行了一下,正常的。没有退出呀?

 
怎么我只要设置好属性后就会退出?我用的 Delphi6
 
你设置了那些属性,说的详细一点,我帮你看看
 
DataSource 和 DataField,之后就会退出
 
我在delphi自带的Filter例子中加人这个组件,在设置 DataField时CPU忙,delphi死了。
这说明DataField属性设置的处理过程有问题
 
好好查一下procedure TDBComboFilter.DataChange(Sender : Tobject);
这个过程
 
是啊,可能是它在不断地添加数据,怎么办呢?
 
谁能解决把 #20013#22269 (从 dfm 文件中获得) 转换为汉字。
对不起,刚注册,不能正常提问。
 
to Mary888:这样就行了 :)
var
A: array [0..1]of WideChar;
begin
A[0]:=#20013;
A[1]:=#22269;
ShowMessage(A);
end;
 
To:yostgxf
我也知道这样可以,问题是 #20013 是以字符串的方式出现的,怎样把 '#20013' 转变为 #20013 呢?
 
使用函数StringToWideChar
 
用来讨论别的了?!
郁闷。
 
很有可能是数据库连接的问题。看一看数据模块是否打开
 
数据模块已经打开。能看到 combo 在不断地添加数据。
 
改了一下Datachange方法。
procedure TDBComboFilter.DataChange(Sender : Tobject);
begin
if FDataLink.Field <> nil then
begin
//Items.BeginUpdate;
// Items.Clear;
// if FFilterHaveNot then Items.Add(FFilterHaveNotStr);
with FDataLink.DataSource.DataSet do
begin
// bok := GetBookmark;
// first;
while not eof do
begin
Items.Add(FieldByName(FDataLink.FieldName).AsString);
next;
end;
//GotoBookMark(bok);
// FreeBookMark(bok);
// bok := nil;
end;
//Items.EndUpdate;
end;
end;

可以了。
 
后退
顶部