StringGrid如何利用顏色來表達進行式 |
答題得分者是:P.D.
|
lovemari
中階會員 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
小弟的程式會每隔10分鐘就RENEW一次
想請問 跑出來的表格有今天有昨天有好幾天前等不等的資訊 我如果想表達今天或者現在一小時內的正再更新的數據作顏色的區分 我該怎麼改程式碼呢?? 譬如說 WO TIME COUNT A 06/23 5 B 06/05 1 C 06/25 10 <-今天正在進行中 所以以紅色來顯示 [code delphi] with AdvStringGrid1 do begin Cells[0, 0] := 'SEQ'; Cells[1, 0] := 'Work Order'; Cells[2, 0] := 'Product Name'; Cells[3, 0] := 'In Pdline Time'; Cells[4, 0] := 'Input QTY'; Cells[5, 0] := 'Assyt'; Cells[6, 0] := 'OS'; Cells[7, 0] := 'BurnIn'; Cells[8, 0] := 'Test'; Cells[9, 0] := 'Packing'; Cells[10, 0] := 'QC'; Cells[11, 0] := 'Repair'; Cells[12, 0] := 'WareHouse'; end; with csTempWOa do begin Close; Params.Clear; w1 := 'SELECT ' 'B.WORK_ORDER "Work Order",C.PART_NO "Product Name",B.TARGET_QTY "Target QTY",B.INPUT_QTY "Input QTY",B.WO_START_DATE "In Pdline Time", ' 'COUNT(DISTINCT A.SERIAL_NUMBER) "Assyt" ' 'FROM SAJET.G_SN_STATUS A, ' 'SAJET.G_WO_BASE B, ' 'SAJET.SYS_PART C ' 'WHERE A.WORK_ORDER = B.WORK_ORDER ' 'AND B.MODEL_ID = C.PART_ID ' 'AND B.WO_CLOSE_DATE IS NULL ' 'AND A.STAGE_ID <> ''100015'' ' //組一 組二 組三 組四 PA01 PA02 PA03 重工 'AND A.WIP_PROCESS IN (''100020'',''100021'',''100031'',''100034'',''100036'',''100043'',''100033'') ' 'AND B.WO_STATUS = ''3'' ' 'AND B.WORK_ORDER not in (''51A00001'',''61A00001'',''88A88888'') ' 'AND TO_CHAR(A.OUT_PROCESS_TIME,''YYYY'') = TO_CHAR(SYSDATE,''YYYY'') ' 'AND ROUND(SYSDATE - B.WO_START_DATE) <= 30 ' // 'AND TO_CHAR(SYSDATE,''YYYYMM'') = TO_CHAR(B.WO_START_DATE,''YYYYMM'') ' //當月 'GROUP BY B.WORK_ORDER,C.PART_NO,B.TARGET_QTY,B.INPUT_QTY,B.WO_START_DATE ' 'ORDER BY B.WO_START_DATE DESC '; commandtext := w1; open; Label1.Caption := 'Last Update Time :' TimeToStr(Time); while not eof do begin with AdvStringGrid1 do begin Params.Clear; //Cells[0, RowCount - 1] := Fieldbyname('SEQ').AsString; Cells[1, RowCount - 1] := Fieldbyname('Work Order').AsString; Cells[2, RowCount - 1] := Fieldbyname('Product Name').AsString; Cells[3, RowCount - 1] := Fieldbyname('In Pdline Time').AsString; Cells[4, RowCount - 1] := Fieldbyname('Input QTY').AsString; Cells[5, RowCount - 1] := Fieldbyname('Assyt').AsString; RowCount := RowCount 1; end; NEXT; end; //多餘的一行0刪除 if AdvStringGrid1.Cells[1, AdvStringGrid1.rowcount - 1] = '' then AdvStringGrid1.RowCount := AdvStringGrid1.RowCount - 1; cLOSE; end; [/code]
------
Program : Delphi 7 DataBase : Oracle 9i Client : ClientDataSet 編輯記錄
lovemari 重新編輯於 2009-06-25 09:56:53, 註解 無‧
|
lovemari
中階會員 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
|
max5020
資深會員 發表:30 回覆:277 積分:321 註冊:2003-06-04 發送簡訊給我 |
|
lovemari
中階會員 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
max5020 大大
小弟有點看不懂那篇@@ 小弟目前做法是 同樣SQL 跑兩次 一各設定5分鐘RENWE 一各設定8分鐘 然後畫面看到的是8分鐘的 當8分鐘的跑出來結果之後再去跟5分鐘的做比較 如果有任何一塊不相同 就以紅色來顯示 (表示該塊正在進行 所以數字會 - ) 可是我按照下面寫法卻一點反應都沒有= = [code delphi] var i, j, k, l, m, n, o: Integer; begin i := 0; for k := 1 to AdvStringGrid1.RowCount - 1 do l := 0; for n := 1 to AdvStringGrid4.RowCount - 1 do begin if AdvStringGrid1.Cells[5, k] <> AdvStringGrid4.Cells[5, n] then begin [/code]
------
Program : Delphi 7 DataBase : Oracle 9i Client : ClientDataSet |
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
試試看...
[code delphi] var i, j, k, l, m, n, o: Integer; begin i := 0; for k := 1 to AdvStringGrid1.RowCount - 1 do for n := 1 to AdvStringGrid4.RowCount - 1 do begin if AdvStringGrid1.Cells[5, k] <> AdvStringGrid4.Cells[5, n] then begin end; end; end; [/code] |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
我不知道你指定 l:= 0 是啥意義, 但因為使用 do 造成 k 的 迴圈都在執行 l:= 0 而不是 執行 for n:= ... |
lovemari
中階會員 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
謝謝兩位大大指教
小弟修改了如下表 只是現在不管怎樣怎跑出來結果都是 "都相同" 阿= =" 我有故意設定不同數字 但結果只會跑一樣 [code delphi] var i, j, k, l, m, n, o: Integer; begin i := 0; for j := 1 to AdvStringGrid1.RowCount 1 do for l := 1 to AdvStringGrid4.RowCount 1 do begin if StrToInt(AdvStringGrid1.Cells[5, j]) <> StrToInt(AdvStringGrid4.Cells[5, l]) //也試過StrToFloat then begin ShowMessage('不相同'); exit; end; if StrToInt(AdvStringGrid1.Cells[5, j]) = StrToInt(AdvStringGrid4.Cells[5, l]) then begin //AdvStringGrid1.Canvas.Font.Color := clRed; ShowMessage('都相同'); exit; end; [/code] 順帶問一各問題上色 如果回圈讀出來有不同的地方 可否在該處做上色 Cells[5,j] . Canvas.Font.Cloor := clRed;
------
Program : Delphi 7 DataBase : Oracle 9i Client : ClientDataSet |
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
把Exit拿掉試看看
[code delphi] var i, j, k, l, m, n, o: Integer; begin i := 0; for j := 1 to AdvStringGrid1.RowCount 1 do for l := 1 to AdvStringGrid4.RowCount 1 do begin if StrToInt(AdvStringGrid1.Cells[5, j]) <> StrToInt(AdvStringGrid4.Cells[5, l]) //也試過StrToFloat then begin ShowMessage('不相同'); end; else if StrToInt(AdvStringGrid1.Cells[5, j]) = StrToInt(AdvStringGrid4.Cells[5, l]) then begin //AdvStringGrid1.Canvas.Font.Color := clRed; ShowMessage('都相同'); end; [/code] |
lovemari
中階會員 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
lovemari
中階會員 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
這是一個 ondraw的事件, 在ondraw上是代表每創建一格就畫一次格子(grid), 怎麼會有 cell的觀念呢? 所以都是用 canvas 方式來達成
而 font.color 只是指定這次要繪的顏色而已, 真正是我demo中最後兩句 因為這是一個在 ondraw 事件下發展的程式, 它是重繪grid 的事件, 並沒有cell的位址出現, 你如何指定cell 所以通常我們都用 canvas, 你必須想像一下, ondraw 每建立一個cell就會執行這個事件一次, 並且把它畫出來 所以指定 font.color 只是改變這次要畫的顏色, 實際上並沒有畫出來, 因此我程式的最後兩行 Canvas.FillRect(Rect); //繪底色 Canvas.textout(Rect.Left xCol,Rect.Top xRow,Cells[ACol,ARow]); //output text 這才是真正命令程式畫出來的重點 至於你看不懂, 可能是在於複雜的計算, 那只是在算要置中, 靠右的功能, 如果你不在意美觀的問題, 這些碼都可以排掉不要看 事實上, 拿掉這些後, 程式沒有那麼難看的懂! ===================引 用 lovemari 文 章=================== PD 大 你的範例有點看不是很懂@_@ 我不能寫成 Cells[5, j] .Font.Color := 嗎?? PD大 你意思是我只有改變字體顏色的設定 但是我尚未設定指定上色 是這各意思嗎?? |
lovemari
中階會員 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
謝謝 PD大大指教
對於上色我比較知道了 只是現在我改寫這樣之後 明明只有特定欄位數直不同 可是他卻全部都上色了 [code delphi] if gdFixed in State then Exit; with Sender as TAdvStringGrid do begin for j := 1 to AdvStringGrid1.RowCount - 1 do begin for l := 1 to AdvStringGrid4.RowCount - 1 do begin if AdvStringGrid1.Cells[6, j] <> AdvStringGrid4.Cells[6, l] then i := 1; if AdvStringGrid1.Cells[6, j] = AdvStringGrid4.Cells[6, l] then i := 0; begin case i of 0: Canvas.Font.Color := clBlack; 1: Canvas.Font.Color := clRed; end; Canvas.TextRect(Rect, Rect.Left, Rect.Top, Cells[ACol, ARow]); [/code]
------
Program : Delphi 7 DataBase : Oracle 9i Client : ClientDataSet |
lovemari
中階會員 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
哈哈
我知道問題了 應該改成就可以在我指定的那行變色了 所以說 Cells[ACol, ARow] 也算是跑回圈的一種囉 [code delphi] if AdvStringGrid1.Cells[ACol, ARow] <> AdvStringGrid4.Cells[ACol, ARow] then i := 1; if AdvStringGrid1.Cells[ACol, ARow] = AdvStringGrid4.Cells[ACol, ARow] then i := 0; [/code]
------
Program : Delphi 7 DataBase : Oracle 9i Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2009-07-01 14:43:47, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |