stringgrid中的checkbox勾選問題 |
答題得分者是:shunaaron
|
pengpofan
一般會員 發表:2 回覆:3 積分:1 註冊:2008-05-09 發送簡訊給我 |
[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 發送簡訊給我 |
|
shunaaron
高階會員 發表:13 回覆:94 積分:106 註冊:2006-10-06 發送簡訊給我 |
試看看另一種做法
先拉一個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 發送簡訊給我 |
|
shunaaron
高階會員 發表:13 回覆:94 積分:106 註冊:2006-10-06 發送簡訊給我 |
1.
你的CheckBox元件是用態動產生的吧 我所謂設定一個 是指在設計時~先拉出一個CheckBox來 先將其隱藏起來~在用上次給的範例去做看看 2. 如果你存回了資料庫,在下次顯示是就好了 不知你懂不懂意思 ===================引 用 pengpofan 文 章=================== 我不是很了解你的意思耶! 你說從新設定一個checkbox 可是我的欄位已經繪製好了checkbox 你的意思是叫我打掉重做嗎?還是直接再新增一個checkbox來判別他的勾選與否? 存檔的部分我是存資料庫,那指令只要告知他要存檔,下次再進去的時候他就會有紀錄了嗎? 感恩
------
程式沒有這麼難 只是還沒打通其中要絕 |
pengpofan
一般會員 發表:2 回覆:3 積分:1 註冊:2008-05-09 發送簡訊給我 |
我試過了
可是他在compiler selectcell的時候發生錯誤 我剛剛去找了selectcell事件的處理方法,內容都沒有問題,可是就是不能RUN 好怪 不好意思,所謂的動態產生是說不用呼叫該元件,用事件的指令執行出該有的資料嗎? 因為我再做stringgrid 的checkbox時就已經叫出一個checkbox也用隱藏了? 照你的邏輯來講,程式應該已經抓到我之前的那個checkbox啦!!! ===================引 用 shunaaron 文 章=================== 1. 你的CheckBox元件是用態動產生的吧 我所謂設定一個 是指在設計時~先拉出一個CheckBox來 先將其隱藏起來~在用上次給的範例去做看看 2. 如果你存回了資料庫,在下次顯示是就好了 不知你懂不懂意思 ===================引 用 pengpofan 文 章=================== 我不是很了解你的意思耶! 你說從新設定一個checkbox 可是我的欄位已經繪製好了checkbox 你的意思是叫我打掉重做嗎?還是直接再新增一個checkbox來判別他的勾選與否? 存檔的部分我是存資料庫,那指令只要告知他要存檔,下次再進去的時候他就會有紀錄了嗎? 感恩 |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
... 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |