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

如何設定DBGrid上面某一個欄位是ReadOnly或是可修改

尚未結案
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-29 14:00:41 IP:61.219.xxx.xxx 未訂閱
請教各位前輩 : 我用多個DBGrid來維護多個Table 共用一個Query, 所以SQL指令是動態產生的 就無法使用Query元件的Fields Editor跟DBGrid的Columns Editor 去設定每一個欄位的ReadOnly是true或是false 每一個Table都只有一個欄位可以修改, 所以在DBGrid的屬性ReadOnly 設為True之後, 希望對其中一個欄位設定為可修改 我就不知道要怎麼做了, 試過了DBGrid1.Fields[].ReadOnly 或是DBGrid1.Columns.Items[].ReadOnly等等的方法都不行針對某個 欄位做改變,希望各位賜教...謝謝
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-29 14:58:49 IP:202.39.xxx.xxx 未訂閱
試試這樣的方式:
begin
  Query1.Close;
  Query1.SQL.Text := '...';
  Query1.Open;
  Query1.FieldByName('id').ReadOnly := True;
end;
-- 棒球是從兩出局開始的.
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-29 15:15:10 IP:210.65.xxx.xxx 未訂閱
Hi dino ,    既然你已將 DBGrid.ReadOnly := True; 即使你在對 DBGrid1.Columns.Items[].ReadOnly := False;  也是沒有用的    建議你將 DBGrid 的 ReadOnly 設為 False,但是在 Query 的 AfterOpen 事件將所由欄位設為 ReadOnly,再針對特定欄位開放修改
procedure TForm1.Query1AfterOpen(DataSet: TDataSet);
var
  i : Integer;
begin
  for i := 0 to Dataset.FieldCount - 1 do        // 將所有欄位設為 ReadOnly
    DataSet.FieldList.Fields[i].ReadOnly := True;
  DataSet.FieldList.Fields[2].ReadOnly := False; // 允許第二欄可修改
end;
---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-29 17:38:02 IP:61.219.xxx.xxx 未訂閱
hagar謝謝你的回答 ,可是設定Query1.FieldByName沒有作用耶 Fishman 謝謝你的回答, 用你的方法可以 順便問一下, 我要針對那一個欄位在DBGrid上面著色 要怎麼作呢?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-30 07:47:00 IP:202.39.xxx.xxx 未訂閱
引言: hagar謝謝你的回答 ,可是設定Query1.FieldByName沒有作用耶
這樣子啊! 剛才再試了一下 在小弟這邊, 用 TQuery 或 TADODataset 都是可以的. -- QBQ: 我能做什麼?
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-30 08:37:27 IP:210.65.xxx.xxx 未訂閱
Hi dino,    在該 DBGrid 的 OnDrawColumnCell 事件上去設定顏色,並進行繪製,範例程式如下:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if ((State = [gdSelected,gdFocused]) or (State = [gdSelected]) or (State = [gdFocused])) then
    begin
      TDBGrid(Sender).Canvas.Brush.Color := clHighlight;
      TDBGrid(Sender).Canvas.Brush.Style := bsSolid;
      TDBGrid(Sender).Canvas.Font.Color := clHighlightText;
      TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
    end
  else
    begin
      if (not Column.Field.ReadOnly) then
        begin
          TDBGrid(Sender).Canvas.Brush.Color := clBlue;
          TDBGrid(Sender).Canvas.Brush.Style := bsSolid;
          TDBGrid(Sender).Canvas.Font.Color := clHighlightText;
          TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
        end;
    end;
end;
---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
zch2002115
一般會員


發表:24
回覆:15
積分:7
註冊:2004-11-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-30 11:49:33 IP:211.96.xxx.xxx 未訂閱
如果是 已經指定的固定欄位(即死的),很簡單,直接用其欄位的color屬性就可以。 雙擊DBGRID調出 EDITING編輯框,單擊你想要著色的欄位,對應的在其屬性中找到color,選擇你想要的顏色。
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-30 13:42:04 IP:61.219.xxx.xxx 未訂閱
hi hagar 謝謝你的回答 你的方法也可以 , 只是我搞錯了 沒有寫在AfterOpen event裡面, 只是這樣子作比較簡單卻繁瑣了一點 因為我只開放一個欄位作修改 , 如果我把DBGird 的ReadOnly設為true 那針對那個欄位去設定ReadOnly為false是沒有作用的, 那就要把DBGrid的 ReadOnly設為false之後,然後去對每一個欄位都作設定了.
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-30 13:47:02 IP:61.219.xxx.xxx 未訂閱
zch2002115.... 感謝對岸的同胞你的回答 你的方法我不行用, 正如我前面說的 ,我的欄位是動態產生的 所以Query元件的Fields Editor跟DBGrid的Columns Editor 我都無法於Design time來針對每一個欄位作設定^^
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-30 14:18:58 IP:61.219.xxx.xxx 未訂閱
Fishman 謝謝您的回答 我用了你給的範例, 使用了下半部的程式碼就解決了^^
系統時間:2024-05-17 16:19:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!