StringGrid的使用問題? |
答題得分者是:hagar
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
感謝前輩hager的回應!
在Richedit中,用CurrText表示選定的內容
function CurrText:TTextAttributes;
begin
if RichEdit1.selLength>0 then
Result:=RichEdit1.selAttributes
else
Result:=RichEdit1.DefAttributes ;
end;
就可以:
CurrText.style:=CurrText.Style [fsBold]
CurrText.color:=ColorDialog1.color;
請問前輩如何在StringGrid中的一個cell或多個cells做到,能否給個示例,謝謝!
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
首先,感謝hager前輩對晚輩多次的指點!
其次,晚輩參照前輩給的方向與站上的一些資料:
現在知道通過OnDrawCell可以對字體大小,字體顏色等進行改變. 晚輩希望在StringGrid選定一個Cell時,Click 程式Toolbar上的'B'按鈕(Toolbutton2 style 設 tbsCheck)時,cell中的字體會變粗.
但是: 1)
引言: 切換 Form 的時候, 移動 Form 的時候, click 的時候發現 'click 的時候'沒有觸發OnDrawCell Event 2) 'gdSelected in State'好像並不是指被選定的Cell Code 如下: procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if ToolButton2.Down then showmessage('Hello!'); if gdSelected in State then begin StringGrid1.Canvas.Font.Style := [fsBold]; StringGrid1.Canvas.Font.Color:=clRed; StringGrid1.Canvas.FillRect(Rect); DrawText(StringGrid1.Canvas.Handle, pChar(StringGrid1.Cells[ACol,ARow]), Length(StringGrid1.Cells[ACol,ARow]), Rect, DT_RIGHT or DT_SINGLELINE or DT_VCENTER) end; end;發表人 - mathewzhao 於 2003/08/10 17:15:42 發表人 - mathewzhao 於 2003/08/10 17:17:10 |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
使用 TStringAlignGrid 這個元件: http://www.hoerstemeier.com/grid.htm
這個元件可記錄每個 Cell 的字型,
然後在 TStringAlignGrid 的 OnSelectCell 事件
procedure TForm1.StringAlignGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); var x,y: integer; begin // 恢復字型初始值 for x := 0 to StringAlignGrid1.ColCount -1 do begin for y := 0 to StringAlignGrid1.RowCount -1 do begin StringAlignGrid1.CellFont[x, y].Style := []; StringAlignGrid1.CellFont[x, y].Color := clBlack; end; end; // 改變字型 StringAlignGrid1.CellFont[ACol, ARow].Style := [fsBold]; StringAlignGrid1.CellFont[ACol, ARow].Color := clRed; end;--- --<-<-<@ |
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
各位先進好!
晚輩參考前輩hagar的意見,使用TStringAlignGrid已可以在一個cell
中改變Font的 Style,color和對齊方式.
現在希望在StringAlignGrid1中選定一個區域(SelectRect)後,
按ToolButton1鍵,則改變區域內cells Font的 Style,color和對齊方式
下列Code可以通過compile,但Font顯示效果沒變化.
希望各位先進給與指點,謝謝!
// 估計是在語句1,語句2出現問題.
procedure TForm1.ToolButton1Click(Sender: TObject); var SelectRect:TGridRect; DisplayRect:TRect; x, y: Integer; TextAlign: word; begin SelectedRect:=StringAlignGrid1.Selection; for x:=SelectedRect.Left to SelectedRect.Right do begin for y:= SelectedRect.top to SelectedRect.Bottom do begin Canvas.Font.Style := [fsBold]; Canvas.Font.Color:=clRed; DisplayRect:=Rect(SelectedRect.left ,SelectedRect.top, SelectedRect.right,SelectedRect.bottom);//語句1 Canvas.FillRect(DisplayRect); TextAlign:= DT_LEFT or DT_SINGLELINE OR DT_VCENTER; DrawText(StringAlignGrid1.Canvas.Handle, pChar(StringAlignGrid1.Cells[x,y]), Length(StringAlignGrid1.Cells[x,y]), DisplayRect, //語句2 TextAlign); end; end; end; |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
這樣?
var SelectedRect:TGridRect; DisplayRect:TRect; x, y: Integer; begin SelectedRect:=StringAlignGrid1.Selection; for x:=SelectedRect.Left to SelectedRect.Right do begin for y:= SelectedRect.top to SelectedRect.Bottom do begin StringAlignGrid1.CellFont[x, y].Style := [fsBold]; StringAlignGrid1.CellFont[x, y].Color := clRed; end; end; end;--- --<-<-<@ |
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
感謝前輩hagar的回應! 看到前輩的回應不覺啞然失笑,我怎麼又用DrawText,沒用TStringAlignGrid方便的Properties. 經過實際測試,用前輩修改後的Code,就可以改變區域內cells
的顯示效果. // 以下只做討論,如方便請給與指點
那我的問題處在哪?
我想是在TGridRect和TRect轉換出現問題的,即
DisplayRect:=Rect(SelectedRect.left ,SelectedRect.top,
SelectedRect.right,SelectedRect.bottom);
假如選擇StringGrid左上角cell(cells[1,1]),那麼SelectedRect的Left,top,right,bottom均為1.
那麼用DisplayRect:=Rect(...)得到的Rectangle還是不是cells[1,1]
呢? 我想不是.
所以問題就是如何將SelectedRect所指區域正確告訴DisplayRect‧
這問題有解嗎?
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
感谢hagar前辈的回应!
经测试
DisplayRect := StringAlignGrid1.CellRect(x, y);
还是存在问题,因时间原因我想这个问题先结案.
另外,曾见过hagar前辈发问时,将解答整理出来以方便后来查阅者。
晚辈见贤思齐,将这次发问解答整理如下: //CurrRect表示被选择的区域
//ToolButton1Click 改变 Font Style
//ToolButton2Click 改变 Font Alignment Style
function TForm1.CurrRect:TGridRect;//表示被选择的区域 begin Result:=stringAlignGrid1.Selection; end; procedure TForm1.ChangeFontStyle (Toolbtn:TToolButton;Style:TFontStyle); var x,y:integer; begin for x :=CurrRect.Left to CurrRect.Right do for y := CurrRect.top to CurrRect.Bottom do begin with StringAlignGrid1 do begin if Toolbtn.Down then CellFont[x, y].Style :=CellFont[x, y].Style [Style] else CellFont[x, y].Style :=CellFont[x, y].Style-[Style]; end; end; end; procedure TForm1.ToolButton1Click(Sender: TObject); begin ChangeFontStyle(ToolButton1,fsBold); // 或fsItalic等 end; procedure TForm1.AlignFontStyle(ToolBtn:TToolButton;AlignStle:TMyAlign); var x,y:integer; begin for x :=CurrRect.Left to CurrRect.Right do for y := CurrRect.top to CurrRect.Bottom do if Toolbtn.down then StringAlignGrid1.AlignCell[x, y]:=AlignStle; end; procedure TForm1.ToolButton2Click(Sender: TObject); begin AlignFontStyle(ToolButton2,alcenter);//或alright,alleft end;發表人 - mathewzhao 於 2003/08/25 18:08:57 |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |