DBGrid的DataCol如何變數來控制。 |
答題得分者是:carstyc
|
t0288542
中階會員 發表:216 回覆:254 積分:94 註冊:2004-10-06 發送簡訊給我 |
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 發送簡訊給我 |
|
t0288542
中階會員 發表:216 回覆:254 積分:94 註冊:2004-10-06 發送簡訊給我 |
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 發送簡訊給我 |
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; 麻煩您,謝謝,如有不清楚我可以再說明。 |
AndrewK
高階會員 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
請問資料庫的結構為何??
要顯示的畫面為何?? 由於看到 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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
這樣的方式畫面會很閃爍吧。
記得 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 發送簡訊給我 |
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。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |