線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2872
推到 Plurk!
推到 Facebook!

標準的 StringGrid 的 Cols 與 Row有 Autosize 與 文字對齊 的功能嗎?

答題得分者是:flyup
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-13 21:52:21 IP:210.202.xxx.xxx 未訂閱
找了老半天, 好像 Delphi 的標準 StringGrid 的 Cols 與 Rows 沒有 Autosize 與 文字對齊的設定功能, 不知道要如何加入這些功能? 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
flyup
資深會員


發表:280
回覆:508
積分:385
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-13 22:28:16 IP:61.225.xxx.xxx 未訂閱
StringGrid 的 Cols 與 Rows .. Autosize StringGrid1->Options->goRowSizing設為True StringGrid1->Options->goColSizing設為True 文字對齊的設定: ============================================================== StringGrid沒有這樣的屬性設置,但利用自繪功能可以很容易地實現。如果Grid的DefaultDrawing屬性設置為True(預設值),Delphi會繪製儲存格,包括背景色、邊框、焦點框、固定儲存格的三維效果。如果用戶處理了OnDrawCell事件,Delphi會接著調用用戶的DrawCell程序。如果DefaultDrawing屬性設置為False,Delphi只調用用戶的DrawCell程序。我們在自行繪製儲存格時一般應設置DefaultDrawing屬性為True,這樣我們只需要繪製我們需要改變的單元,而其它單元交給Delphi去做好了。 下面是一個簡單的例子: procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin // 只有標題列的字體為粗體 if (ARow = 0 ) then StringGrid1.Canvas.Font.Style := [fsBold]; if ( ARow = 0 ) or // 標題列 ( ACol = 3 ) then // 第3列右對齊 begin // FillRect將清楚掉Delphi繪製的文字 StringGrid1.Canvas.FillRect(Rect); DrawText(StringGrid1.Canvas.Handle, pChar(StringGrid1.Cells[ACol,ARow]), Length(StringGrid1.Cells[ACol,ARow]), Rect, // 包含文字的矩形 DT_CENTER or // 水平居中 DT_SINGLELINE or // 不折行 DT_VCENTER) // 垂直居中 end else if (ACol = 2) then // 第2列右對齊 begin 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; 在這裡,我們調用Win32 API的DrawText繪製字體,而DrawText可以進行左或右對齊。在繪製程序中,你可以改變文字的字體。我們沒有處理背景色、邊框、固定儲存格的三維效果等,因為Delphi會替我們完成的。也可以進一步添加其他效果,如貨幣格式。 善用「注意力」,就是善於掌握「優先次序」—分清那些是重要的及不重要的。 「捨」才會「得」,集中焦距,才能發揮核心優勢。 發表人 - flyup 於 2003/04/13 22:40:39
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-14 01:13:45 IP:210.202.xxx.xxx 未訂閱
引言: StringGrid 的 Cols 與 Rows .. Autosize StringGrid1->Options->goRowSizing設為True StringGrid1->Options->goColSizing設為True 發表人 - flyup 於 2003/04/13 22:40:39
先感謝您的回答, 關於 Autosize 的問題您所說的這個方法我記得是讓 col 或 row 在執行期可以用滑鼠人工調整 欄寬 或 列高. 我也在 Delphi 7 的環境下在作一次嘗試, 或許是我沒有表達清楚我所謂的 Autosize 功能, 目的就是希望 col 的欄寬會自動依據其中內容長度最寬的 cell 來自動調整. 至於自動對齊的部分您的回覆我一時間還看不透徹, 弄清楚後再請教. 我是雪龍 發表人 - bestlong 於 2003/04/14 01:16:22
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
flyup
資深會員


發表:280
回覆:508
積分:385
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-14 11:16:08 IP:61.216.xxx.xxx 未訂閱
//參考看看 {1.}     procedure SetGridColumnWidths(Grid: TStringGrid;    const Columns: array of Integer);  {    When you double-Click on a Column-Header the Column    autosizes to fit its content  }       procedure AutoSizeGridColumn(Grid: TStringGrid; column, min, max: Integer);      { Set for max and min some minimal/maximial Values}        var      i: Integer;      temp: Integer;      tempmax: Integer;    begin      tempmax := 0;      for i := 0 to (Grid.RowCount - 1) do      begin        temp := Grid.Canvas.TextWidth(Grid.cells[column, i]);        if temp > tempmax then tempmax := temp;        if tempmax > max then        begin          tempmax := max;          break;        end;      end;      if tempmax < min then tempmax := min;      Grid.ColWidths[column] := tempmax + Grid.GridLineWidth + 3;    end;       procedure TForm1.StringGrid1DblClick(Sender: TObject);    var      P: TPoint;      iColumn, iRow: Longint;    begin      GetCursorPos(P);      with StringGrid1 do      begin        P := ScreenToClient(P);        MouseToCell(P.X, P.Y, iColumn, iRow);        if P.Y < DefaultRowHeight then          AutoSizeGridColumn(StringGrid1, iColumn, 40, 100);      end;    end;       {************************************************}       {2.}       procedure TForm1.Button1Click(Sender: TObject);    { by P. Below }    const      DEFBORDER = 8;    var      max, temp, i, n: Integer;    begin      with Grid do      begin        Canvas.Font := Font;        for n := Low(Columns) to High(Columns) do        begin          max := 0;          for i := 0 to RowCount - 1 do          begin            temp := Canvas.TextWidth(Cells[Columns[n], i]) + DEFBORDER;            if temp > max then              max := temp;          end; { For }          if max > 0 then            ColWidths[Columns[n]] := max;        end; { For }      end; { With }    end; {SetGridColumnWidths  }         善用「注意力」,就是善於掌握「優先次序」—分清那些是重要的及不重要的。 「捨」才會「得」,集中焦距,才能發揮核心優勢。
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-14 23:06:36 IP:210.202.xxx.xxx 未訂閱
好棒喔, 我想重點就是在 TextWidth(Cells[Col,Row]) 來取得該欄所有 Cell 繪出的文字寬度取最寬的當作依據, 然後再去作調整 ColWidth 的值. 這樣我就有方向可以來處理了, 不過這些資料 flyup 都是怎麼找的呢? 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
系統時間:2024-05-04 18:09:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!