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

StringGrid的使用問題?

答題得分者是:hagar
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-06 10:52:16 IP:219.145.xxx.xxx 未訂閱
各位先進好! Q:請問StringGrid是否有類似Richedit的SelLength和SelAttributes 的properties? 可以: 1:判斷選定Cells的區域及cell中是否有字? 2:改變cells的字體的的大小及顏色? 謝謝!
hagar
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-06 12:33:14 IP:202.39.xxx.xxx 未訂閱
1.StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] <> '' 2.在 TStringGrid 的 OnDrawCell 事件中改變字型 --- --<-<-<@
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-06 13:31:44 IP:61.150.xxx.xxx 未訂閱
感謝前輩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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-06 20:29:22 IP:202.39.xxx.xxx 未訂閱
我想您得記錄每個 cell 內的字型/大小/前背景色才能達到這個目的 --- --<-<-<@
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-07 09:06:38 IP:219.145.xxx.xxx 未訂閱
感謝Hager前輩的熱心回應! 請問:OnDrawCell的trigger時機?
hagar
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-07 20:41:09 IP:202.39.xxx.xxx 未訂閱
觸發 OnDrawCell 的時機很多, 比方說: 切換 Form 的時候, 移動 Form 的時候, click 的時候, 輸入的時候 ... --- --<-<-<@
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-10 17:10:13 IP:202.100.xxx.xxx 未訂閱
首先,感謝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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-08-10 17:29:36 IP:202.39.xxx.xxx 未訂閱
小弟用您的程式碼來測試 每次 click StringGrid 不同的 Cell 時 Cell 內的字型都會改變 還是 StringGrid1.DefaultDrawing 被設為 False 了? 另外 ToolButton2 在 Down 的情況下, Hello 這個 Message 會一直出現(因為一直在執行 OnDrawCell) --- --<-<-<@
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-10 18:16:33 IP:61.185.xxx.xxx 未訂閱
感謝hagar前輩的回應!  前輩下次'見面',自稱'我'即可,說'小弟'晚輩不好承受。 前輩在測試時出現的情況與晚輩迥然不同,晚輩推測是前輩將
hagar
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-08-11 08:35:43 IP:202.39.xxx.xxx 未訂閱
使用 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-08-13 17:50:30 IP:61.150.xxx.xxx 未訂閱
各位先進好!     晚輩參考前輩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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-08-13 18:13:02 IP:202.39.xxx.xxx 未訂閱
這樣?
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-08-13 19:38:24 IP:219.145.xxx.xxx 未訂閱
感謝前輩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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-08-13 20:07:23 IP:202.39.xxx.xxx 未訂閱
改一行試試: DisplayRect := StringAlignGrid1.CellRect(x, y); --- --<-<-<@
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-08-25 18:02:17 IP:202.100.xxx.xxx 未訂閱
感谢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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-08-25 18:08:14 IP:202.39.xxx.xxx 未訂閱
存在什麼問題? 小弟這邊試是可以達到效果的.    --- 歡迎光臨 KTop 研究院--<-<-<@
系統時間:2024-11-01 7:30:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!