全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2442
推到 Plurk!
推到 Facebook!

DBGrid的DataCol如何變數來控制。

答題得分者是:carstyc
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-06-16 15:46:01 IP:60.248.xxx.xxx 訂閱
Dear 各位大大。

依據使用者輸入排程日起迄,所以天數不固定,每一天有6個欄位依狀態來決定它的顏色,
每次要判斷欄位名也不是固定,所以,以下藍色部份不知如何去寫,才好,
就算固定也要寫好幾組,請問各位大大有什麼好方法。

我的程式碼,如下。

procedure TfrINVR003.dbgeWEEKDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Canvas: TCanvas;
begin
Canvas := (Sender as TDBGridEh).Canvas;

if DataCol In [1,2,3,4,5,6] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('A6').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;

if DataCol In [7,8,9,10,11,12] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('B6').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;

if DataCol In [13,14,15,16,17,18] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('C6').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;

if DataCol In [19,20,21,22,23,24] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('D6').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;


Canvas.FillRect(Rect);
dbgWEEK.DefaultDrawDataCell(Rect, Column.Field, State);
end;
附加檔案:4a374db975516_04.GIF
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-06-17 23:21:22 IP:122.126.xxx.xxx 訂閱
說明清楚一點,十分不懂
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-06-18 13:36:51 IP:60.248.xxx.xxx 訂閱
Dear Rootkit 大大。

不好意思,可能我沒有說明很清楚。
目前我正在公司生產計劃,原本使用者是以Excel檔在維護計劃,
因為檔案結構 生產日,機台號,項次,製品,LotNo,預出量,客先,預出日,狀態,等等欄位,(綠->鍵值)
目前Grid內資料是利用SQL指令所得到查詢結果,因為使用者可以輸入生產日的起迄日期,所以天數會不固定,
比如 2009/06/01 ~ 200906/06/07 共7天,
每一天(6欄要秀)都有個狀態來表示該天該筆計劃目前狀態,並顯示該狀態所指定顏色。
6欄(製品,LotNo,預出量,客先,預出日,狀態)

DrawColumnCell 事件,DataCol 可以設定每欄顏色,
但是天數不固定,如何讓紅字部份可以用變數來替代。
if DataCol In [1,2,3,4,5,6] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('A6').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;


麻煩您,謝謝,如有不清楚我可以再說明。



carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-06-20 00:16:11 IP:219.84.xxx.xxx 訂閱
t0288542 大大,如果您這個Grid 是 DBGrid的話,您這個不定天數,能橫向長欄位的SQL才真的是天下無敵。

不過我猜DBGrid 應該是不能長出您上面合併儲存格的東東才對。

我們言歸正傳,如果我沒誤解,您的需求應該是在要 6 的倍數欄位中,每第6個欄位的值,來決定這6個欄位的顯示顏色吧。

0 1 2 3 4 5 | 6 7 8 9 10 11 | 12 13 14 15 16 17 | ......
* * * <----決定顏色的欄位

[code cpp]
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.Fields( DataCol -( DataCol MOD 6) 5 ).AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
[/code]

原理就這樣....我沒驗証過,您自己試看看吧....




===================引 用 t0288542 文 章===================
Dear Rootkit 大大。

不好意思,可能我沒有說明很清楚。
目前我正在公司生產計劃,原本使用者是以Excel檔在維護計劃,
因為檔案結構 生產日,機台號,項次,製品,LotNo,預出量,客先,預出日,狀態,等等欄位,(綠->鍵值)
目前Grid內資料是利用SQL指令所得到查詢結果,因為使用者可以輸入生產日的起迄日期,所以天數會不固定,
比如 2009/06/01 ~ 200906/06/07 共7天,
每一天(6欄要秀)都有個狀態來表示該天該筆計劃目前狀態,並顯示該狀態所指定顏色。
6欄(製品,LotNo,預出量,客先,預出日,狀態)

DrawColumnCell 事件,DataCol 可以設定每欄顏色,
但是天數不固定,如何讓紅字部份可以用變數來替代。
if DataCol In [1,2,3,4,5,6] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('A6').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;


麻煩您,謝謝,如有不清楚我可以再說明。




編輯記錄
carstyc 重新編輯於 2009-06-20 00:18:34, 註解 無‧
carstyc 重新編輯於 2009-06-20 00:19:31, 註解 無‧
carstyc 重新編輯於 2009-06-20 00:20:36, 註解 無‧
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-06-20 17:06:14 IP:115.43.xxx.xxx 訂閱
請問資料庫的結構為何??
要顯示的畫面為何??
由於看到 a6 , b6 , c6 ,d6 等欄位
不了解你的需求為何??
===================引 用 t0288542 文 章===================
Dear 各位大大。

依據使用者輸入排程日起迄,所以天數不固定,每一天有6個欄位依狀態來決定它的顏色,
每次要判斷欄位名也不是固定,所以,以下藍色部份不知如何去寫,才好,
就算固定也要寫好幾組,請問各位大大有什麼好方法。

我的程式碼,如下。

procedure TfrINVR003.dbgeWEEKDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Canvas: TCanvas;
begin
Canvas := (Sender as TDBGridEh).Canvas;

if DataCol In [1,2,3,4,5,6] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('A6').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;

if DataCol In [7,8,9,10,11,12] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('B6').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;

if DataCol In [13,14,15,16,17,18] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('C6').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;

if DataCol In [19,20,21,22,23,24] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('D6').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;


?
Canvas.FillRect(Rect);
dbgWEEK.DefaultDrawDataCell(Rect, Column.Field, State);
end;
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-06-22 17:02:10 IP:60.248.xxx.xxx 訂閱
Dear 大大們,

carstyc 大大,哎。確實這個不固定天數,光SQL文以及套入Grid中,真地想很久。

程式碼如下,好像有點笨笨地,GetDayNumber 取得天數,欄位名稱都是由A..排列下來,
請問各位大大,有沒有更好意見,麻煩大家,謝謝。

DrawColumnCell事件下,

var i,j,d1,d2,d3,d4,d5,d6,d7 : Integer;

j := 65;
for i := 0 to GetDayNumber - 1 do
begin
d1 := 1 (7*i);
d2 := 2 (7*i);
d3 := 3 (7*i);
d4 := 4 (7*i);
d5 := 5 (7*i);
d6 := 6 (7*i);
d7 := 7 (7*i);
if DataCol In [d1,d2,d3,d4,d5,d6,d7] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName(chr(j) '7').AsString),1,1) = '1' then
Canvas.Brush.Color := RGB(255,255,156); //字變黃色
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName(chr(j) '7').AsString),1,1) = '2' then
Canvas.Brush.Color := RGB(206,255,255); //字變藍色
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName(chr(j) '7').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;
j := j 1;
end;
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-06-22 17:35:23 IP:203.79.xxx.xxx 訂閱
t0288542 大大,你的方法跟我上面的方法應該算同一種處理方式吧。都是找出某天7個欄位中的最後一個欄位

只不過你可以考慮看看用 mod 取餘數的方式來找出 A7 B7 C7 等欄位,這樣效率上應該會好一點,不過應該也只有好一點點吧。

參考看看吧....




===================引 用 t0288542 文 章===================
Dear 大大們,

carstyc 大大,哎。確實這個不固定天數,光SQL文以及套入Grid中,真地想很久。

程式碼如下,好像有點笨笨地,GetDayNumber 取得天數,欄位名稱都是由A..排列下來,
請問各位大大,有沒有更好意見,麻煩大家,謝謝。

DrawColumnCell事件下,

var i,j,d1,d2,d3,d4,d5,d6,d7 : Integer;

j := 65;
for i := 0 to GetDayNumber - 1 do
begin
d1 := 1 (7*i);
d2 := 2 (7*i);
d3 := 3 (7*i);
d4 := 4 (7*i);
d5 := 5 (7*i);
d6 := 6 (7*i);
d7 := 7 (7*i);
if DataCol In [d1,d2,d3,d4,d5,d6,d7] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName(chr(j) '7').AsString),1,1) = '1' then
Canvas.Brush.Color := RGB(255,255,156); //字變黃色
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName(chr(j) '7').AsString),1,1) = '2' then
Canvas.Brush.Color := RGB(206,255,255); //字變藍色
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName(chr(j) '7').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;
j := j 1;
end;
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-06-22 20:32:09 IP:122.126.xxx.xxx 訂閱
這樣的方式畫面會很閃爍吧。
記得 DataCol 好像是從 0 開始,既然是用 1 開始。...
改寫如下,未經驗證有BUG 自己捉。

var
iDay,iWeek :Integer;
begin
iDay := ((DataCol - 1) Mod 7) 1;
iWeek := (DataCol -1) Div 7;

Case Strtointdef(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName(chr(65 iWeek) '7').AsString),-1) of
1 :Canvas.Brush.Color := RGB(255,255,156); //字變黃色
2 :Canvas.Brush.Color := RGB(206,255,255); //字變藍色
...
end;

看了很久還是不懂欄位內容跟週期表有何關係。
若欄位只判斷 週末,何苦將 週一~週六拖下水,不懂!?
這樣的資料結構看起來不是很理想,欄位不會很多嗎。



===================引 用 t0288542 文 章===================
Dear 大大們,

carstyc 大大,哎。確實這個不固定天數,光SQL文以及套入Grid中,真地想很久。

程式碼如下,好像有點笨笨地,GetDayNumber 取得天數,欄位名稱都是由A..排列下來,
請問各位大大,有沒有更好意見,麻煩大家,謝謝。

DrawColumnCell事件下,

var i,j,d1,d2,d3,d4,d5,d6,d7 : Integer;

j := 65;
for i := 0 to GetDayNumber - 1 do
begin
d1 := 1 (7*i);
d2 := 2 (7*i);
d3 := 3 (7*i);
d4 := 4 (7*i);
d5 := 5 (7*i);
d6 := 6 (7*i);
d7 := 7 (7*i);
if DataCol In [d1,d2,d3,d4,d5,d6,d7] then
begin
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName(chr(j) '7').AsString),1,1) = '1' then
Canvas.Brush.Color := RGB(255,255,156); //字變黃色
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName(chr(j) '7').AsString),1,1) = '2' then
Canvas.Brush.Color := RGB(206,255,255); //字變藍色
if Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName(chr(j) '7').AsString),1,1) = '3' then
Canvas.Brush.Color := RGB(206,255,206); //字變綠色
end;
j := j 1;
end;
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-06-23 10:26:05 IP:60.248.xxx.xxx 訂閱
Dear RootKit & carstyc:

謝謝你們回覆,可能這樣的作法很奇怪,但是user希望能一開始從系統日 7天,
要預設一個星期的排程,確實跑起來很吃力,不好意思,我再在說明一次。
橫向是日期,縱向是機台號,DataCol 0 是表示機台號。


A B C D -> A1,A2,A3,A4,A5,A6,A7,B1..欄位名
0 | 1 2 3 4 5 7 | 8 9 10 11 12 13 14 | 15 16 17 18 19 20 21 | ...... ->DataCol值
* * * -> * 表示如值1,2,3..來判斷顏色,顯示顏色位置是以天為單位,如A7='1'時,DataCol 1~7都要變成綠色,B7='2',DataCol 8~14都要變成藍色。

我在試試各位方法,thks。
系統時間:2024-03-29 18:59:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!