字段多了,还是用TABLE的好。
解决方案 »
- 【押宝党】baoshiqiang
- 使用Comobj.RegisterComServer登记了个Dll文件,请问取消登记应该用哪个函数或其他办法?
- 高分求解[如何在StringGrid中加上行字段和列行号] 最好加上实例代码
- 高手们都进来,极有挑战的问题! 我快要跳楼了!!!
- 用ado删除数据的时候,提示没有活动事务,请教
- 采鸟提问,如何编译dll?通过哪里编译?
- 大家看看,这个函数中对rQueryResp指针的操作会不会引起内存的读写错误?
- ★★★★★后天过生日,又大一年了,还是一个人在外过生日,为什么我这么可怜?呜呜...呜...★★★★★
- Delphi做出来的程序不用运行库吗?还是要? 要什么运行库呢?方便不方便?
- 如何检测cpu,如是p3还是雷鸟
- 关闭DELPHI5错误???
- 我做的程序后台用SQL SERVER 7.0 ,前台开发用DELPHI 5.0 ,在本机上可以运行,如何做安装包?并且,交给用户,他们使用时,是否需要安装SQL SERVER ,逐一建库,表,链接等?如果不要,我该怎么办?
不过这么多的字段,恐怕用table还是简单一点的。
所以我总是用Table
至于速度,我认为还是table+dbgrid快一些!毕竟dbgrid比较专业一些!具体没试过。
其实你的记录并不多,我试过一百多万条记录的,可以分批显示,就像sqlserver中的分析器一样的效果!
procedure FillItemsFromDB(ATableName,AFieldName,sqlWhere:string;
Distinct:Boolean ;Items:TStrings);overload;procedure FillItemsFromDB(ATableName,AFieldName,sqlWhere:string;
Distinct:Boolean;Items:TStrings);
var
vSql,vFieldName,vItem:string;
P:Integer;
const
c_strArr_Distinct:array[Boolean]of string=('','DISTINCT');
begin
P:=0; Items.BeginUpdate ;
try
if Items.Count>0 then Items.Clear ; vFieldName:=AFieldName;
P:=pos('=',AFieldName);
if P>0 then
vFieldName[P]:=','; vsql:=UpperCase(Format('SELECT %s %s FROM %s %s',
[c_strArr_Distinct[Distinct],
vFieldName,
ATableName,
sqlWhere])); with DM_Main.qryCommonUse do
begin
Close;
Sql.CLear;
Sql.Text:=vSql;
Open;
//if not Bof then First;
while not EOF do
begin
if P>0 then
vItem:=Format('%s=%s',
[VarToStr(Fields[0].Value),
VarToStr(Fields[1].Value)])
else
vItem:=VarToStr(Fields[0].Value); if vItem<>'' then
Items.Add(vItem); Next ;
end;
end;//end of with DM_Main.qryCommonUse
finally
Items.EndUpdate ;
end;
end;
应该这样:定义一个variant变量,把所有edit的值依顺序存到variant变量中,我们用
的是存储过程,保存的时候只需把variant的值赋给存储过程的参数即可,如果用query也一样,只要把值传过去就行!
最后还有一个小问题:是把所有的页面(就是主FORM和其它的FORM1,FORM2,FORM3....FORM比较多的)都做到一个EXE中去好呢,还是做成多个EXE,在主程序中用api调用的好?都做到一块觉得程序大了许多,还 是多做几个调用的占内存小,但好多软件都是做到一块的,它们是如何处理的?是用CREATE吗?
TABLE是将整个表打开后在进行FILTER
QUERY是直接将SQL语句发送给数据库
所以数据多的化,可以用QUERY查询较快,但TABLE很方便,
2000条,无所谓用什么了!!!
,此函数用于动态创建,用TFROM_X.create,在ShowModal,然后FORM_X.FREE
如果要更改数据的话,可以把Query的RequestLive改为True.
至于字段多的问题,我觉得可以使用字符数组常量来解决。
type
FieldRecord=record
TabOrder:Integer;
FieldNob:Integer; //字段记录号;
Caption:string; //字段中文名(用于标签的显示);
FieldName:string; //字段英文名(用于生成SQL语句);
FieldLength:integer; //字段长度;
AllowEmpty:Boolean; //是否允许为空;
DefaultValue:string; //默认值;
UseDataDictionary:Boolean; //是否使用数据字典;
DataDictionaryCreated:Boolean; //数据字典是否建立;
Edit:TObject;
TextLabel:TLabel;
case FieldType:DataType of
varchar:();
datetime:();
text1:();
numeric:(
FieldPrecision:Word;
FieldDimensions:Word;
)
end;
NextNode=^Node;
Node=record
Data:FieldRecord;
Next:NextNode;
end;
Link=NextNode;
DataType=(varchar,numeric,datetime,text1); //数据的四种类型
下面是界面生成和SQL语句(只是插入时所用的SQL语句)生成部分,
var
MainRecord,PrimaryRecord:Link;
TempNode1,TempNode2:NextNode;
__________________________________________________________________
MainQuery.Close;
SQLStr:='insert into by_lrku ('; //初始化SQL添加字符串
MainQuery.SQL.Clear;
MainQuery.SQL.Add('select zdh,zdzwm,zdywm,zdlx,zdcd,'+
'zdjqd,zdgm,sfyxwk,mrz,sfsjzd,'+
'sfjlsjzd,editleft,edittop,editwidth,'+
'editheight,labelleft,labeltop,lrsx,'+
'labelwidth,labelheight from byk_jg '+
'where bj=0 and sflrzd=1 and kuleibie=''主库'' order by lrsx ASC' ); //从标引库结构表中读取字段信息;
try
New(MainRecord);
MainRecord^.Next:=nil;
TempNode1:=MainRecord;
MainQuery.Open;
MainQuery.First;
if MainQuery.Eof then
begin
if MessageDlg('库结构尚未建立!请您先建立库结构再运行本程序'+
#13#13+
' 按OK按钮关闭本程序',mtWarning,[mbOK],0)=mrOK then
Application.Terminate;
end;
while not MainQuery.Eof do
begin
New(TempNode2);
with TempNode2^.Data do
begin
TabOrder:=MainQuery.FieldByName('lrsx').AsInteger;
FieldNob:=MainQuery.FieldByName('zdh').AsInteger;
Caption:=MainQuery.FieldByName('zdzwm').AsString;
FieldName:=MainQuery.FieldByName('zdywm').AsString;
SQLStr:=SQLStr+FieldName+',';
if MainQuery.FieldByName('zdlx').AsString='varchar' then
FieldType:=varchar
else
if MainQuery.FieldByName('zdlx').AsString='numeric' then
FieldType:=numeric
else
if MainQuery.FieldByName('zdlx').AsString='datetime' then
FieldType:=datetime
else
if MainQuery.FieldByName('zdlx').AsString='text' then
FieldType:=text1;
case FieldType of
varchar,datetime:FieldLength:=MainQuery.FieldByName('zdcd').AsInteger;
text1,numeric:;
end;
AllowEmpty:=MainQuery.FieldByName('sfyxwk').AsString='1';
DefaultValue:=MainQuery.FieldByName('mrz').AsString;
UseDataDictionary:=MainQuery.FieldByName('sfsjzd').AsString='1';
DataDictionaryCreated:=MainQuery.FieldByName('sfjlsjzd').AsString='1';
TextLabel:=TLabel.Create(Main);
TextLabel.Caption:=Caption;
TextLabel.Parent:=Main.InputBox;
TextLabel.Top:=MainQuery.FieldByName('labeltop').AsInteger;
TextLabel.Left:=MainQuery.FieldByName('labelleft').AsInteger;
if UseDataDictionary and (not DataDictionaryCreated) then
begin
if MessageDlg('数据字典尚未建立,请先建立数据字典再运行本程序!'+#13#13+
' 请按OK按钮关闭本程序',mtError,[mbOK],0)=mrOK then
Application.Terminate;
end
else
if UseDataDictionary then
begin
Edit:=TComboBox.Create(Main);
(Edit as TComboBox).Parent:=Main.InputBox;
(Edit as TComboBox).Left:=MainQuery.FieldByName('editleft').AsInteger;
(Edit As TComboBox).Top:=MainQuery.FieldByName('edittop').AsInteger;
(Edit as TComboBox).OnKeyDown:=Main.EditKeyDown;
(Edit as TComboBox).OnKeyPress:=Main.ComboBoxKeyPress;
(Edit as TComboBox).TabOrder:=MainQuery.FieldByName('lrsx').AsInteger;
DDQuery.SQL.Clear;
DDQuery.SQL.Add(Format('select sjxm from sjzdb where zdh=%d',[FieldNob]));
try
DDQuery.Open;
DDQuery.First;
while not DDQuery.Eof do
begin
(Edit as TComboBox).Items.Add(DDQuery.FieldByName('sjxm').AsString);
DDQuery.Next;
end;
DDQuery.Close;
except
if MessageDlg('提取数据字典时发生错误!是否继续?',mtError,[mbYes,mbNo],0)<>mrNo then
Application.Terminate;
end;
end
else
case FieldType of
varchar:begin
Edit:=TEdit.Create(Main);
(Edit as TEdit).Parent:=Main.InputBox;
(Edit as TEdit).Left:=MainQuery.FieldByName('editleft').AsInteger;
(Edit As TEdit).Top:=MainQuery.FieldByName('edittop').AsInteger;
(Edit As TEdit).Width:=MainQuery.FieldByName('editwidth').AsInteger;
(Edit As TEdit).height:=MainQuery.FieldByName('editheight').AsInteger;
(Edit as TEdit).OnKeyDown:=Main.EditKeyDown;
(Edit as TEdit).OnKeyPress:=Main.EditKeyPress;
(Edit as TEdit).OnExit:=Main.TEditExit;
(Edit as TEdit).TabOrder:=MainQuery.FieldByName('lrsx').AsInteger;
end;
numeric:begin
Edit:=TEdit.Create(Main);
(Edit as TEdit).Parent:=Main.InputBox;
(Edit as TEdit).Left:=MainQuery.FieldByName('editleft').AsInteger;
(Edit As TEdit).Top:=MainQuery.FieldByName('edittop').AsInteger;
(Edit As TEdit).Width:=MainQuery.FieldByName('editwidth').AsInteger;
(Edit As TEdit).height:=MainQuery.FieldByName('editheight').AsInteger;
(Edit as TEdit).OnKeyDown:=Main.EditKeyDown;
(Edit as TEdit).OnKeyPress:=Main.EditKeyPress;
(Edit as TEdit).OnExit:=Main.TEditExit;
(Edit as TEdit).TabOrder:=MainQuery.FieldByName('lrsx').AsInteger;
FieldPrecision:=MainQuery.FieldByName('zdjqd').AsInteger;
FieldDimensions:=MainQuery.FieldByName('zdgm').AsInteger;
end;
datetime:begin
Edit:=TDateTimePicker.Create(Main);
(Edit as TDateTimePicker).Parent:=Main.InputBox;
(Edit as TDateTimePicker).Left:=MainQuery.FieldByName('editleft').AsInteger;
(Edit As TDateTimePicker).Top:=MainQuery.FieldByName('edittop').AsInteger;
(Edit as TDateTimePicker).OnKeyDown:=Main.EditKeyDown;
(Edit as TDateTimePicker).TabOrder:=MainQuery.FieldByName('lrsx').AsInteger;
(Edit as TDateTimePicker).DateFormat:=dfLong;
end;
text1:begin
Edit:=TMemo.Create(Main);
(Edit as TMemo).Parent:=Main.InputBox;
(Edit as TMemo).Left:=MainQuery.FieldByName('editleft').AsInteger;
(Edit As TMemo).Top:=MainQuery.FieldByName('edittop').AsInteger;
(Edit As TMemo).Width:=MainQuery.FieldByName('editwidth').AsInteger;
(Edit As TMemo).height:=MainQuery.FieldByName('editheight').AsInteger;
(Edit as TMemo).TabOrder:=MainQuery.FieldByName('lrsx').AsInteger;
(Edit as TMemo).ScrollBars:=ssVertical;
end;
end;
TempNode2^.Next:=TempNode1^.Next;
TempNode1^.Next:=TempNode2;
TempNode1:=TempNode2;
MainQuery.Next;
end;
end;
如果有2000个人的资料,一人一张表,用什么数据库好?
动态创建的时候有一点不明白,可不可以我先把各个FORM都做出来,设置一下不编译,不用FORM X.SHOWMODEL;而是用CREATE来调出该页面?好象看过类似的资料,是在project option中把这些页面从 “默认的创建窗口”(AUTO ...) 中放到“可供使用的窗口”(AVAILABLE FORM)这一项中去,然后用CREATE去创建,这样的效果又是如何?动态建立的窗口又是如何释放的?是用FORM X.CAFREE还是FORM X.FREE?X是指页面的编号,如1、2、、3等。分不够再加,请大家帮忙。
但手动创建的窗体好处是可以手动释放(释放可以用FREE,DESDROY);
比如一般的FORM手动创建可以这样写: with TFormX.Create(self) do
try
showmodal;
finally
free; //释放FORM
end; MDI CHILD form的建立可以这样写:
if not assigned(frmXX) then
frmXX:= TfrmXX.Create(self)
else frmXX.BringToFront;
但是记住一定关闭的时候要释放.
try
showmodal;
finally
free; //释放FORM
end;
这样子也还是出现了地址错误是什么原因?
我在程序中查询数据时,当数据量很大(超过一万条记录)时,数据无法显示出来。请问该如何解决这个问题?怎样可以分批显示?
我用的是bde、tquery和 dbgrid。
不胜感谢!
创建时:if form2=nil then form2.create(self);
from2.show;
在窗体的close里写:
action:=cafree;
from2:=nil;
这样就不会有地址错误了
procedure TForm2.Button1Click(Sender: TObject);
var action:tcloseaction;
begin
action:=cafree;
close;
end;呢?请回答,然后就结帐了。
procedure TForm2.Button1Click(Sender: TObject);
var action:tcloseaction;
begin
action:=cafree;
close;
end;呢?请回答,然后就结帐了。