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

stringgrid中的checkbox勾選問題

答題得分者是:shunaaron
pengpofan
一般會員


發表:2
回覆:3
積分:1
註冊:2008-05-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-05-23 10:46:20 IP:220.134.xxx.xxx 訂閱

[code delphi]
procedure TForm1.FormCreate(Sender: TObject);
var
chk:TCheckbox;
i,j:integer;
begin
stringgrid1.colcount:=11;
stringgrid1.rowcount:=33;
stringgrid1.cells[0,0]:='檢查時間';
stringgrid1.cells[1,0]:='0900';
stringgrid1.cells[2,0]:='0900';
stringgrid1.cells[3,0]:='0900';
stringgrid1.cells[4,0]:='0930';
stringgrid1.cells[5,0]:='1100';
stringgrid1.cells[6,0]:='1130';
stringgrid1.cells[7,0]:='1330';
stringgrid1.cells[8,0]:='1630';
stringgrid1.cells[10,0]:='1700';
stringgrid1.cells[0,1]:='日期';
stringgrid1.cells[1,1]:='網路';
stringgrid1.cells[2,1]:='主機';
stringgrid1.cells[3,1]:='資料庫';
stringgrid1.cells[4,1]:='備份';
stringgrid1.cells[5,1]:='排程';
stringgrid1.cells[6,1]:='訂單';
stringgrid1.cells[7,1]:='下傳';
stringgrid1.cells[8,1]:='配置';
stringgrid1.cells[9,1]:='備註';
stringgrid1.cells[10,1]:='檢查項目';
for i:=1 to 8 do begin
for j:=2 to 32 do begin
stringgrid1.cells[i,j]:='';
chk:=TCheckbox.Create(stringgrid1);
chk.Name:=format('cellchk%d_%d',[i,j]);
chk.Caption:='';
chk.Checked:=false;
chk.Visible:=false;
chk.Parent:=stringgrid1;
chk.Width:=chk.Height;
stringgrid1.Objects[i,j]:=chk;
end;
end;
Button1.Click;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,j,n,y4,y100,y400:integer;
a: array[0..32,0..10] of integer;
year,month,day:word;
begin
//判斷每月天數与是否為閏月
decodedate(now(),year,month,day);
case month of
1,3,5,7,8,10,12:
begin
n:=1;
for i:=2 to 32 do
begin
a[i,0]:=n;
stringgrid1.cells[0,i]:=inttostr(year) '年' inttostr(month) '月' inttostr(a[i,0]) '日';
n:=n 1;
end;
end;
4,6,9,11:
begin
n:=1;
for i:=2 to 31 do
begin
a[0,i]:=n;
stringgrid1.cells[0,i]:=inttostr(year) '年' inttostr(month) '月' inttostr(a[i,0]) '日';
n:=n 1;
end;
end;
2:
begin
n:=1;
for i:=2 to 30 do
begin
a[0,i]:=n;
stringgrid1.cells[0,i]:=inttostr(year) '年' inttostr(month) '月' inttostr(a[i,0]) '日';
n:=n 1;
end;
end;

end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
d,n,m:integer;
year,month,day:word;
a:array [2..32,1..8] of integer;
begin
decodedate(now(),year,month,day);
d:=day 1;
for m:=1 to 8 do
begin
stringgrid1.Cells[m,d]:='Y';
end;
end;
procedure TForm1.stringgrid1drawcell(Sender:Tobject;ACol,ARow:Integer;Rect:TRect;State:TGridDrawState);
var
chk:TCheckbox;
grid:TStringgrid;
begin
grid:=Sender As TStringgrid;
if (acol>=grid.FixedCols) and (arow>=grid.FixedRows)
then begin
chk:=TCheckbox(grid.Objects[acol,arow]);
if assigned(chk)
then begin
chk.SetBounds((rect.Left rect.Right-chk.Width)div 2,(rect.Top rect.Bottom-chk.Height)div 2,chk.Width,chk.Height);
if not chk.Visible then
chk.Show;
end;
end;
end;

procedure TForm1.gridcheckboxMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
var
chk:TCheckbox;
begin
with sender As TCheckbox do
checked:=not checked;
if button=mbleft then
chk.checked:=true;
end;
type
Tgridcracker=Class(tstringgrid);
procedure TForm1.stringgrid1TopLeftChanged(Sender:TObject);
begin
Tgridcracker(Sender).InvalidateCol(1);
end;

現在的問題是說沒辦法讓checkbox勾選
[/code]
pengpofan
一般會員


發表:2
回覆:3
積分:1
註冊:2008-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-05-23 10:48:22 IP:220.134.xxx.xxx 訂閱
問題就是說

沒辦法讓checkbox勾選

再來是說,如果勾選之後要讓他紀錄,等下次進來的時候就不用在勾選此項,這是用存檔的指令嗎?

麻煩各位了。
shunaaron
高階會員


發表:13
回覆:94
積分:106
註冊:2006-10-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-05-24 00:13:19 IP:220.134.xxx.xxx 訂閱
試看看另一種做法
先拉一個CheckBox
一開始將CheckBox.Visible := False;
然後大約程式碼如下

[code delphi]
procedure Tfmerport.SGSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
if not ACol in [1] then exit //看你哪一欄是要勾選的
if ACol = 1 then begin
CheckBox.BoundsRect := SG.CellRect(ACol,ARow);
CheckBox.Visible := True;
CheckBox.Parent := SG;
CheckBox.Visible := True;
CheckBox.SetFocus;
end;
end;

procedure Tfmerport.CheckBoxExit(Sender: TObject);
begin
if CheckBox.Checked then
SG.Cells[1,SG.Row] := 'Y'
else
SG.Cells[1,SG.Row] := 'N';
CheckBox.Visible := False;
end;
[/code]

再來你說要選過後~就不用再勾選了
不知你資料是存回資料庫或是要存成檔案
不管你怎樣做~抓一個欄位(如剛剛是第1欄)
是Y的話~就是勾選過
這樣就可以了
用這種方式~不管資料大或小~不會讓StringGrid掛了
如果資料量有500筆以上
用動態產生元件~StringGrid是有可能會掛的
小弟都是用先拉出元件~
當點到哪一欄時~在看要哪個元件
Edit,ComboBox,MaskEdit,DateTimePick..等等

===================引 用 pengpofan 文 章===================
問題就是說

沒辦法讓checkbox勾選

再來是說,如果勾選之後要讓他紀錄,等下次進來的時候就不用在勾選此項,這是用存檔的指令嗎?

麻煩各位了。
------
程式沒有這麼難
只是還沒打通其中要絕
編輯記錄
shunaaron 重新編輯於 2008-05-24 00:14:50, 註解 無‧
pengpofan
一般會員


發表:2
回覆:3
積分:1
註冊:2008-05-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-05-26 09:55:05 IP:220.134.xxx.xxx 訂閱
我不是很了解你的意思耶!

你說從新設定一個checkbox

可是我的欄位已經繪製好了checkbox

你的意思是叫我打掉重做嗎?還是直接再新增一個checkbox來判別他的勾選與否?

存檔的部分我是存資料庫,那指令只要告知他要存檔,下次再進去的時候他就會有紀錄了嗎?

感恩
shunaaron
高階會員


發表:13
回覆:94
積分:106
註冊:2006-10-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-05-26 10:26:31 IP:220.128.xxx.xxx 訂閱
1.
你的CheckBox元件是用態動產生的吧
我所謂設定一個
是指在設計時~先拉出一個CheckBox來
先將其隱藏起來~在用上次給的範例去做看看

2.
如果你存回了資料庫,在下次顯示是就好了
不知你懂不懂意思
===================引 用 pengpofan 文 章===================
我不是很了解你的意思耶!

你說從新設定一個checkbox

可是我的欄位已經繪製好了checkbox

你的意思是叫我打掉重做嗎?還是直接再新增一個checkbox來判別他的勾選與否?

存檔的部分我是存資料庫,那指令只要告知他要存檔,下次再進去的時候他就會有紀錄了嗎?

感恩
------
程式沒有這麼難
只是還沒打通其中要絕
pengpofan
一般會員


發表:2
回覆:3
積分:1
註冊:2008-05-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-05-26 11:06:04 IP:220.134.xxx.xxx 訂閱
我試過了

可是他在compiler selectcell的時候發生錯誤

我剛剛去找了selectcell事件的處理方法,內容都沒有問題,可是就是不能RUN

好怪

不好意思,所謂的動態產生是說不用呼叫該元件,用事件的指令執行出該有的資料嗎?

因為我再做stringgrid 的checkbox時就已經叫出一個checkbox也用隱藏了?

照你的邏輯來講,程式應該已經抓到我之前的那個checkbox啦!!!
===================引 用 shunaaron 文 章===================
1.
你的CheckBox元件是用態動產生的吧
我所謂設定一個
是指在設計時~先拉出一個CheckBox來
先將其隱藏起來~在用上次給的範例去做看看

2.
如果你存回了資料庫,在下次顯示是就好了
不知你懂不懂意思
===================引 用 pengpofan 文 章===================
我不是很了解你的意思耶!

你說從新設定一個checkbox

可是我的欄位已經繪製好了checkbox

你的意思是叫我打掉重做嗎?還是直接再新增一個checkbox來判別他的勾選與否?

存檔的部分我是存資料庫,那指令只要告知他要存檔,下次再進去的時候他就會有紀錄了嗎?

感恩
RootKit
資深會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-05-26 18:16:36 IP:61.222.xxx.xxx 訂閱
... TCheckbox(grid.Objects[acol,arow]);
用這種方式。呵呵。...... 有點不可思議。

記得之前已答覆過。可能用別的身份。

[code delphi]

type
TMyBookmarkList = Class(DBGrids.TBookmarkList)
Public
procedure DoLinkActive(Value: Boolean);
end;
TForm1 = .....
Private
private
FBookMarks :TMyBookmarkList;
....


procedure TMyBookMarkList.DoLinkActive(Value: Boolean);
begin
LinkActive(Value);
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Flags : Integer;
begin
if not ADOQuery1.Active then Exit;
With DBGrid1 do
begin
if SameText(Column.FieldName,'CHK') then
begin
Flags := DFCS_BUTTONCHECK;
if FBookMarks.CurrentRowSelected then Flags := Flags or DFCS_CHECKED;
DrawFrameControl(Canvas.Handle,Rect,DFC_BUTTON,Flags);
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FBookMarks := TMyBookmarkList.Create(DBGrid1);
FBookMarks.DoLinkActive(True);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeandNil(FBookMarks);
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
if SameText(Column.FieldName,'CHK') then
begin
FBookMarks.CurrentRowSelected := Not FBookMarks.CurrentRowSelected;
end;
end;

[/code]


RootKit
資深會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-05-26 18:20:01 IP:61.222.xxx.xxx 訂閱
一不小心。眼睛又撇眼。 StringGrid 看成 DBGrid
不過原理大同小異。

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