tcombobox的下拉框的列表宽度能不能改

snjun 2001-07-14 02:55:02
tcombobox的下拉框的列表宽度能不能改
...全文
350 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
snjun 2001-08-14
  • 打赏
  • 举报
回复
up
flytiger1977 2001-08-13
  • 打赏
  • 举报
回复
可以。
snjun 2001-08-13
  • 打赏
  • 举报
回复
up
wljcr 2001-08-10
  • 打赏
  • 举报
回复
方法找到了,很好!很厉害的方法,我怎么没有想到呢?






:(
dancemaple 2001-08-10
  • 打赏
  • 举报
回复
多教我两招,顺便给我点分吧!
wolfAone 2001-08-10
  • 打赏
  • 举报
回复
来分吧,Come On ,BaBy
snjun 2001-08-10
  • 打赏
  • 举报
回复
来点实用的,不要拍我PP,我不吃这一套
snjun 2001-08-10
  • 打赏
  • 举报
回复
来点实用的,不要打我PP
xzm2000 2001-08-06
  • 打赏
  • 举报
回复
哈哈,兄台真是厉害,佩服佩服
(够动听吧,给分:))
snjun 2001-08-06
  • 打赏
  • 举报
回复
我今天把贴子都结了,就剩这一个了
snjun 2001-08-06
  • 打赏
  • 举报
回复
来几句好听的或实用的
trainbox 2001-08-06
  • 打赏
  • 举报
回复
itemheight:=32;给分
snjun 2001-08-06
  • 打赏
  • 举报
回复
问题已经解决了准备结贴子:可没人要分
大家随便说几句,说的好我就反分发了
snjun 2001-07-22
  • 打赏
  • 举报
回复
方法找到了
ComboBox1.Perform(CB_SETDROPPEDWIDTH, 200, 0);
snjun 2001-07-15
  • 打赏
  • 举报
回复
tyt
newyj 2001-07-14
  • 打赏
  • 举报
回复
20.1.7 TBlobStream对象

  从Delphi 数据库开发平台这个意义上说,TBlobStream 对象是个很重要的对象。TBlobStream对象提供了修改TBlobField、TBytesField或TVarBytesField中数据的技术。开发者可以象对待文件或流那样在数据库域中读写数据。
  传统数据库发展的一个重要趋向是往多媒体数据库发展。目前比较著名和流行的数据库都支持多媒体功能,多媒体数据存储中的一大难点是数据结构不规则,数据量大。各大数据库产品是采用BLOB技术解决多媒体数据存储中的问题。Delphi的TBlobStream对象的意义就在于:一方面可以使Delphi应用程序充分利用多媒体数据库的数据管理能力;另一方面又能利用Object Pascal的强大程序设计能力给多媒体数据库提供全方向的功能扩展余地。
  使用TBlobStream对象可以在多媒体数据库的BLOB字段存储任意格式的数据。一般说来,许多多媒体数据库只能支持图像、语音或者OLE服务器支持的数据。利用TBlobStream则不同,只要是程序能够定义的数据格式,它都能在BLOB字段中读写,而不需要其它辅助工具。
  TBlobStream用构造方法Create建立数据库域和BLOB流的联接。用Read或Write 方法访问和改变域中的内容;用Seek方法,在域中定位;用Truncate方法删除域中当前位置起所有的数据。

20.1.7.1 TBlobStream的属性和方法

  TBlobStream对象从TStream直接继承,没有增添新的属性。它覆盖了Read、Write 和Seek方法,提供了对BLOB字段的访问操作;它增添了Truncate方法以实现BLOB字段中的删除操作。
  1. Read方法
  声明:function Read(var Buffer; Count: Longint): Longint;
Read方法从数据库域的当前位置起复制Count个字节的内容到Buffer中。Buffer也必须至少分配Count个字节。Read方法返回实际传输的字节数,因为传输的字节数可能小于Count,所以需要选择符的边界判断。
  2. Write方法
  声明:function Write(const Buffer; Count: Longint); override; Longint;
Write方法从Buffer中向数据库域的当前位置复制Count个字节的内容。Buffer必须分配有Count个字节的内存空间,函数返回实际传输的字节数,传输过程也要进行选择符边界判断。
  3. Seek方法
  声明:function Seek(Offset: Longint; Origin: Word): Longint;
  Seek方法重新设置BLOB流中的指针位置。如果Origin的值是soFromBeginning,则新的指针位置是Offset; 如Origin的值是soFromCurrent,则新的指针位置是Position+Offset;如果Origin的值是SoFromCurrent,则新的指针位置是Size+Offset。函数返回新的指针位置值。当Origin为0(SoFromBegin)时,Offset的值必须大于等于零; 当Origin的值为2(SoFromEnd),Offset的值必须小于等于零。
  4. Truncate方法
  声明:procedure Truncate;
Truncate方法撤消TBlobField、TBytesField或TVarBytesField中从当前位置起的数据。
  5. Create方法
  声明:constructor Create(Field: TBlobField; Mode: TBlobStreamMode);
  Create方法使用Field参数建立BLOB流与BLOB字段的联接。Mode 的值可为bmRead、bmWrite和bmReadWrite。

20.1.7.2 TBlobStream的实现原理

  说明TBlobStream对象的实现原理,不可避免地要涉及它的私有域,下面是私有域的定义:

TBlobStream = class(TStream)
private
FField: TBlobField;
FDataSet: TDataSet;
FRecord: PChar;
FBuffer: PChar;
FFieldNo: Integer;
FOpened: Boolean;
FModified: Boolean;
FPosition: Longint;

public

end;

  FField是与BLOB流相联的数据库BLOB域,该域用于BLOB流的内部访问。FDataSet是代表FField所在的数据库,它可以是TTable部件,也可以是TQuery 部件。FRecord和FBuffer都是BLOB流内部使用的缓冲区,用于存储FField所在记录的数据,该数据记录中不包含BLOB数据,TBlobStream使用FRecord作为调用BDE API函数的参数值。FFieldNo代表BLOB字段的字段号,也用于BDE API的参数传递,FOpened和FMocified都是状态信息,FPosition表示BLOB流的当前位置,下面介绍TBlobStream方法实现。
  1. Create方法和Destroy方法的实现
  Create方法的功能主要是建立BlobStream流与BLOB字段的联系并初始化某些私有变量。其实现如下:
  
constructor TBlobStream.Create(Field: TBlobField; Mode: TBlobStreamMode);
var
OpenMode: DbiOpenMode;
begin
FField := Field;
FDataSet := Field.DataSet;
FRecord := FDataSet.ActiveBuffer;
FFieldNo := Field.FieldNo;
if FDataSet.State = dsFilter then
DBErrorFmt(SNoFieldAccess, [FField.DisplayName]);
if not FField.FModified then
begin
if Mode = bmRead then
begin
FBuffer := AllocMem(FDataSet.RecordSize);
FRecord := FBuffer;
if not FDataSet.GetCurrentRecord(FBuffer) then Exit;
OpenMode := dbiReadOnly;
end else
begin
if not (FDataSet.State in [dsEdit, dsInsert]) then DBError(SNotEditing);
OpenMode := dbiReadWrite;
end;
Check(DbiOpenBlob(FDataSet.Handle, FRecord, FFieldNo, OpenMode));
end;
FOpened := True;
if Mode = bmWrite then Truncate;
end;

 该方法首先是用传入的Field参数给FField,FDataSet,FRecord和FFieldNo赋值。方法中用AllocMem按当前记录大小分配内存,并将指针赋给FBuffer,用DataSet部件的GetCurrentRecord方法,将记录的值赋给FBuffer,但不包括BLOB数据。
  方法中用到的DbiOpenBlob函数是BDE的API函数,该函数用于打开数据库中的BLOB字段。
  最后如果方法传入的Mode参数值为bmWrite,就调用Truncate将当前位置指针以后的
数据删除。
  分析这段源程序不难知道:
  ● 读写BLOB字段,不允许BLOB字段所在DataSet部件有Filter,否则产生异常事件
  ● 要读写BLOB字段,必须将DataSet设为编辑或插入状态
  ● 如果BLOB字段中的数据作了修改,则在创建BLOB 流时,不再重新调用DBiOpenBlob函数,而只是简单地将FOpened置为True,这样可以用多个BLOB 流对同一个BLOB字段读写

  Destroy方法释放BLOB字段和为FBuffer分配的缓冲区,其实现如下:

destructor TBlobStream.Destroy;
begin
if FOpened then
begin
if FModified then FField.FModified := True;
if not FField.FModified then
DbiFreeBlob(FDataSet.Handle, FRecord, FFieldNo);
end;
if FBuffer <> nil then FreeMem(FBuffer, FDataSet.RecordSize);
if FModified then
try
FField.DataChanged;
except
Application.HandleException(Self);
end;
end;

  如果BLOB流中的数据作了修改,就将FField的FModified置为True;如果FField的Modified为False就释放BLOB字段,如果FBuffer不为空,则释放临时内存。最后根据FModified的值来决定是否启动FField的事件处理过程DataChanged。
  不难看出,如果BLOB字段作了修改就不释放BLOB字段,并且对BLOB 字段的修改只有到Destroy时才提交,这是因为读写BLOB字段时都避开了FField,而直接调用BDE API函数。这一点是在应用BDE API编程中很重要,即一定要修改相应数据库部件的状态。
  2. Read和Write方法的实现
  Read和Write方法都调用BDE API函数完成数据库BLOB字段的读写,其实现如下:
  
function TBlobStream.Read(var Buffer; Count: Longint): Longint;
var
Status: DBIResult;
begin
Result := 0;
if FOpened then
begin
Status := DbiGetBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition,
Count, @Buffer, Result);
case Status of
DBIERR_NONE, DBIERR_ENDOFBLOB:
begin
if FField.FTransliterate then
NativeToAnsiBuf(FDataSet.Locale, @Buffer, @Buffer, Result);
Inc(FPosition, Result);
end;
DBIERR_INVALIDBLOBOFFSET:
{Nothing};
else
DbiError(Status);
end;
end;
end;

  Read方法使用了BDE API的DbiGetBlob函数从FDataSet中读取数据,在本函数中,各参数的含义是这样的:FDataSet.Handle代表DataSet的BDE句柄,FReacord表示BLOB字段所在记录,FFieldNo表示BLOB字段号,FPosition表示要读的的数据的起始位置,Count表示要读的字节数,Buffer是读出数据所占的内存,Result是实际读出的字节数。该BDE函数返回函数调用的错误状态信息。
  Read方法还调用了NativeToAnsiBuf进行字符集的转换。

function TBlobStream.Write(const Buffer; Count: Longint): Longint;
var
Temp: Pointer;
begin
Result := 0;
if FOpened then
begin
if FField.FTransliterate then
begin
GetMem(Temp, Count);
try
AnsiToNativeBuf(FDataSet.Locale, @Buffer, Temp, Count);
Check(DbiPutBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition,
Count, Temp));
finally
FreeMem(Temp, Count);
end;
end else
Check(DbiPutBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition,
Count, @Buffer));
Inc(FPosition, Count);
Result := Count;
FModified := True;
end;
end;

Write方法调用了BDE API的DbiPutBlob函数实现往数据库BLOB字段存储数据。
该函数的各参数含义如下:

表20.2 调用函数DbiPutBlob的各传入参数的含义
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   参数名           含义
──────────────────────────────
  FDataSetHandle 写入的数据库的BDE句柄
  FRecord 写入数据的BLOB字段所在的记录
FFieldNo BLOB字段号
  FPosition 写入的起始位置
  Count 写入的数据的字节数
  Buffer 所写入的数据占有的内存地址
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  方法中还根据FField和FTransliterate的值判断是否进行相应的字符集转换,最后移动BLOB流的位置指针,并将修改标志FModified置为True。
3. Seek和GetBlobSize方法的实现
  Seek方法的功能主要是移动BLOB流的位置指针。GetBlobSize方法是私有的,在Seek方法中被调用,其功能是得到BLOB数据的大小。它们的实现如下:

function TBlobStream.GetBlobSize: Longint;
begin
Result := 0;
if FOpened then
Check(DbiGetBlobSize(FDataSet.Handle, FRecord, FFieldNo, Result));
end;

function TBlobStream.Seek(Offset: Longint; Origin: Word): Longint;
begin
case Origin of
0: FPosition := Offset;
1: Inc(FPosition, Offset);
2: FPosition := GetBlobSize + Offset;
end;
Result := FPosition;
end;

GetBlobSize调用了BDE API的DbiGetBlobSize函数,该函数的参数的含义同前面的API函数相同。
  4. Truncate方法
该方法是通过调用BDE API函数实现的。其实现如下:

procedure TBlobStream.Truncate;
begin
if FOpened then
begin
Check(DbiTruncateBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition));
FModified := True;
end;
end;

  该方法从BLOB流的当前位置起删除所有数据,并设置修改标志FModified为True。在Delphi VCL中许多部件特别是数据库应用方面的部件都用BDE API函数完成对数据库的访问,如Data Access和Data Control部件。各种数据库部件都是BDE API函数外层的包装简化了对数据库的访问操作。BDE API中还提供了避开BDE配置工具在程序中直接处理Alias(建立、修改、删除等)的函数支持,这也是部件所没有提供的。在Delphi数据库应用安装程序中,这些Alias操作函数无疑是相当重要的。有关BDE API函数的详细介绍,可阅读Delphi2.0 Client/Server Suite所带的BDE API 帮助文件。


20.2 读写对象的实现原理和应用

  读写对象(Filer)包括TFiler对象、TReader对象和TWriter对象。TFiler对象是文件读写的基础对象,在应用程序中使用的主要是TReader和TWriter。TReader和TWriter对象都直接从TFiler对象继承。TFiler对象定义了Filer对象的基本属性和方法。
  Filer对象主要完成两大功能:
  ● 存取窗体文件和窗体文件中的部件
  ● 提供数据缓冲,加快数据读写操作

Wingsun 2001-07-14
  • 打赏
  • 举报
回复
可以啊,怎么不可以啊。
修改style为csOwnerDrawVariable
然后修改ItemHeight就可以了。
newyj 2001-07-14
  • 打赏
  • 举报
回复
用第三方控件试试
1stclass就不错
www.inprises.com

5,388

社区成员

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

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