我撰寫一個資料庫查詢顯示程式,顯示用的dbgrideh(實作多選功能),每次運行程式后,當通過不同條件查詢資料5-6次時,會在ado1.close;這一句出現list index out of bound(17)的錯誤,重新運行程式后又可以查詢,增加了 DBGrideh1.columns.clear;可以多查幾次,但還是會提示上面的錯誤。我網上查找原因,有說是dbgrideh的問題,但我改了很多次,都無法解決,有沒有高手能幫我看看。
DBGrideh1.columns.clear;
if rb1.Checked=true then //條件全滿足
begin
sele:='and';
end
else if rb2.Checked=true then //條件之一滿足
begin
sele:='or';
end;
if srb101.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' ZH=''暴雨''';
if srb102.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' ZH=''大雪''';
if srb103.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' ZH=''寒潮''';
if srb104.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' ZH=''大風''';
if srb105.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' ZH=''冰雹''';
if srb106.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' ZH=''高溫''';
if srb201.Checked then //大暴雨
begin
if scb201.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56172>49.9';
if scb202.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56079>49.9';
if scb203.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56097>49.9';
if scb204.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56171>49.9';
if scb205.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56164>49.9';
if scb206.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56173>49.9';
if scb207.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56182>49.9';
if scb208.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56185>49.9';
if scb209.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56168>49.9';
if scb210.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56178>49.9';
if scb211.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56180>49.9';
if scb212.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56183>49.9';
if scb213.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56184>49.9';
end
else if (srb206.Checked) and (srb301.Checked) then //省標強高溫
begin
if scb201.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56172>36.9';
if scb202.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56079>36.9';
if scb203.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56097>36.9';
if scb204.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56171>36.9';
if scb205.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56164>36.9';
if scb206.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56173>36.9';
if scb207.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56182>36.9';
if scb208.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56185>36.9';
if scb209.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56168>36.9';
if scb210.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56178>36.9';
if scb211.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56180>36.9';
if scb212.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56183>36.9';
if scb213.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56184>36.9';
end
else if (srb206.Checked) and (srb301.Checked) then //國標強高溫
begin
if scb201.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56172>40';
if scb202.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56079>40';
if scb203.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56097>40';
if scb204.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56171>40';
if scb205.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56164>40';
if scb206.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56173>40';
if scb207.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56182>40';
if scb208.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56185>40';
if scb209.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56168>40';
if scb210.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56178>40';
if scb211.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56180>40';
if scb212.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56183>40';
if scb213.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56184>40';
end
else
begin
if scb201.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56172>0';
if scb202.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56079>0';
if scb203.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56097>0';
if scb204.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56171>0';
if scb205.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56164>0';
if scb206.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56173>0';
if scb207.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56182>0';
if scb208.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56185>0';
if scb209.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56168>0';
if scb210.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56178>0';
if scb211.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56180>0';
if scb212.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56183>0';
if scb213.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' A56184>0';
end;
if srb401.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' HL=''一脊一槽''';
if srb402.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' HL=''兩脊一槽''';
if srb403.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' HL=''兩槽一脊''';
if srb404.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' HL=''兩脊兩槽''';
if srb405.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' HL=''三槽兩脊''';
if srb406.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' HL=''多波動 ''';
if scb401.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' HC=''有''';
if scb402.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' XFC=''有''';
if scb403.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' NZC=''有''';
if scb404.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' GYC=''有''';
if scb405.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' FQ=''有''';
if scb406.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' FG=''有''';
if scb407.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' QZGY=''有''';
if scb408.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' GJ=''有''';
if scb409.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' DKJL=''有''';
if scb410.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' DKQB=''有''';
if scb411.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' XNW=''有''';
if scb412.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' LZGY=''有''';
if scb413.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' DMLGY=''有''';
if srb201.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' ZH=''暴雨'' and qiang=1';
if srb202.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' ZH=''大雪'' and qiang=1';
if srb203.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' ZH=''寒潮'' and qiang=1';
if srb204.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' ZH=''大風'' and qiang=1';
if srb205.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' ZH=''冰雹'' and qiang=1';
if srb206.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' ZH=''高溫'' and qiang=1';
if srb301.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' shengbiao=1';
if srb302.Checked=true then
begin
if (srb201.Checked=true) or (srb206.Checked=true) then
begin
sqlstr:=sqlstr+ ' '+ sele +' guobiao=2';
end
else
begin
sqlstr:=sqlstr+ ' '+ sele +' guobiao=1';
end;
end;
if scb220.Checked=true then sqlstr:=sqlstr+ ' '+ sele +' quyu=1';
ado1.Close;
ado1.SQL.Clear;
ssql:='select riqi as 日期,qs as 起始時間,qss as 起始時,qsf as 起始分,js as 結束時間,jss as 結束時,jsf as 結束分,ZH as 災害,FX as 風向,HL as 中高緯環流,HC as 橫槽,XFC as 西風槽,NZC as 南支槽,';
ssql:=ssql+'GYC as 高原槽,FQ as 高空鋒區,FG as 副熱帶高壓,QZGY as 青藏高壓, GJ as 高壓脊, DKJL as [700hPa急流],DKQB as [700hPa切變], XNW as 西南渦,LZGY as 蘭州高壓,DMLGY as 地面冷高壓,';
ssql:=ssql+ 'AB56172 as 馬爾康,AB56079 as 若爾蓋,AB56097 as 九寨溝,AB56171 as 阿壩,AB56164 as 壤塘,AB56173 as 紅原,AB56182 as 松潘,AB56185 as 黑水,AB56168 as 金川,AB56178 as 小金,AB56180 as 茂縣,AB56183 as 汶川,AB56184 as 理縣';
ssql:=ssql+ ' from TBL_ZHziliao';
ssql:=ssql+ ' where riqi between '''+formatdatetime('yyyymmdd',dt1.DateTime)+'''';
ssql:=ssql+ ' and '''+formatdatetime('yyyymmdd',dt2.DateTime)+'''';
ado1.sql.Add(ssql);
ado1.sql.Add(''+sqlstr+'');
ado1.sql.Add(' order by riqi');
ado1.open;
ado1.first;
for i:=0 to 34 do //居中
begin
DBGrideh1.Columns[i].Alignment := taCenter;
DBGrideh1.Columns[i].Width := 60;
end;
uj5u.com熱心網友回復:
報錯的原因應該是你的查詢結果只有16列,但是最后的回圈卻對35列的對齊、寬度進行了修改,在17列時索引超出范圍報錯。應該根據查詢結果列數操作。最后的回圈代碼改為:
if not ado1.IsEmpty then
begin
DBGrideh1.Columns.Clear;
for i:=0 to ado1.FieldCount-1 do
begin
DBGrideh1.Columns[i].Alignment := taCenter;
DBGrideh1.Columns[i].Width := 60;
end;
end;
uj5u.com熱心網友回復:
procedure TMDI_1_Frm.Button1Click(Sender: TObject);
var i:integer;
begin
if not DBGrid1.DataSource.DataSet.IsEmpty then
begin
for i:=0 to DBGrid1.Columns.Count-1 do
begin
DBGrid1.Columns[i].Alignment := taCenter;
DBGrid1.Columns[i].Width := 60;
end;
end;
end;
還是這樣修改比較好,不會出現你的越界錯誤。
不要用此句 DBGrid1.Columns.Clear;
因為,我們實際應用時,會將部分列隱藏,加入此句,取消隱藏,列全部出現了。
上述代碼,保證了隱藏列,同時將所有顯示的列,重新設定寬度的,對齊方式。
uj5u.com熱心網友回復:
實際應用高效率的方法是只查詢需要的欄位,定制SQL陳述句或資料集的欄位。查詢35列,只顯示16列,效率不高,浪費資源。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59102.html
標籤:VCL組件開發及應用
