標準的 StringGrid 的 Cols 與 Row有 Autosize 與 文字對齊 的功能嗎? |
答題得分者是:flyup
|
bestlong
站務副站長 發表:126 回覆:734 積分:512 註冊:2002-10-19 發送簡訊給我 |
|
flyup
資深會員 發表:280 回覆:508 積分:385 註冊:2002-04-15 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
//參考看看
{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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |