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

StringGrid如何利用顏色來表達進行式

答題得分者是:P.D.
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-06-25 09:55:04 IP:122.116.xxx.xxx 訂閱
小弟的程式會每隔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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-06-25 10:07:20 IP:122.116.xxx.xxx 訂閱
我有想到一各作法 
但是不知道怎麼做@@

就是每次SELECT 之後跟前一次數據比較
如果有變化(不論增減)就顯示紅色
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-06-25 10:10:35 IP:59.120.xxx.xxx 訂閱
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-06-26 15:35:12 IP:122.116.xxx.xxx 訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-06-26 15:45:54 IP:59.114.xxx.xxx 未訂閱
試試看...


[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]
編輯記錄
老大仔 重新編輯於 2009-06-26 15:53:27, 註解 無‧
老大仔 重新編輯於 2009-06-26 15:55:00, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-06-27 13:29:06 IP:61.67.xxx.xxx 未訂閱
  1. var
  2. i, j, k, l, m, n, o: Integer;
  3. begin
  4. i := 0;
  5. for k := 1 to AdvStringGrid1.RowCount - 1 do begin
  6. l := 0;
  7. for n := 1 to AdvStringGrid4.RowCount - 1 do
  8. begin
  9. if AdvStringGrid1.Cells[5, k] <> AdvStringGrid4.Cells[5, n]
  10. then begin
這樣當然不會有反應, 因為問題出在 上面紅色的字
我不知道你指定 l:= 0 是啥意義, 但因為使用 do 造成 k 的 迴圈都在執行 l:= 0 而不是 執行 for n:= ...
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-06-29 13:11:24 IP:122.116.xxx.xxx 訂閱
謝謝兩位大大指教

小弟修改了如下表 只是現在不管怎樣怎跑出來結果都是 "都相同" 阿= ="

我有故意設定不同數字 但結果只會跑一樣


[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
編輯記錄
lovemari 重新編輯於 2009-06-29 13:13:01, 註解 無‧
lovemari 重新編輯於 2009-06-29 13:15:44, 註解 無‧
lovemari 重新編輯於 2009-06-29 13:16:04, 註解 無‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-06-29 15:14:23 IP:59.114.xxx.xxx 未訂閱
把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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-06-29 17:23:13 IP:122.116.xxx.xxx 訂閱
Exit 拿掉結果是 訊息秀出來按OK點不掉

只能強迫關掉程式了
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-06-29 17:29:44 IP:61.67.xxx.xxx 未訂閱
  1. var
  2. i, j, k, l, m, n, o: Integer;
  3. begin
  4. i := 0;
  5. for j := 1 to AdvStringGrid1.RowCount 1 do begin
  6. for l := 1 to AdvStringGrid4.RowCount 1 do begin
  7. if AdvStringGrid1.Cells[5, j] <> AdvStringGrid4.Cells[5, l] then ShowMessage('不相同')
  8. else begin
  9. AdvStringGrid1.Canvas.Font.Color := clRed; --> 這裡只是改變字體顏色, 但是沒見你把字"畫"出來, 請參考我的範例
  10. ShowMessage('都相同');
  11. end;
  12. end;
  13. end;

lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-06-30 10:32:14 IP:122.116.xxx.xxx 訂閱
PD 大

你的範例有點看不是很懂@_@

我不能寫成 Cells[5, j] .Font.Color := 嗎??


PD大 你意思是我只有改變字體顏色的設定
但是我尚未設定指定上色
是這各意思嗎??
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2009-06-30 14:44:14, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-06-30 23:38:50 IP:220.229.xxx.xxx 未訂閱
這是一個 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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-07-01 14:38:06 IP:122.116.xxx.xxx 訂閱
謝謝 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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-07-01 14:41:48 IP:122.116.xxx.xxx 訂閱
哈哈

我知道問題了

應該改成就可以在我指定的那行變色了
所以說 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, 註解 無‧
系統時間:2024-11-23 6:54:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!