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

设置Stringgrid单元格文字对齐

尚未結案
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-15 20:50:59 IP:222.183.xxx.xxx 未訂閱
请问大大,Stringgrid能实现将填入的各单元格的字符串,实现居中、靠左、右的对齐方式吗?
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-15 20:55:09 IP:222.183.xxx.xxx 未訂閱
我现在想扩充TStringgrid [#] TStringGridEx=Class(TStringgrid) private FTextAlignment :TAlignment ; procedure SetTextAlignment (Value:TAlignment); public published property TextAlignment :TAlignment read FTextAlignment write SetTextAlignment ; end; //如何实现呢? procedure TStringGridEx.SetTextAlignment(Value: TAlignment); begin FTextAlignment := Value; end; [/#]
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-15 21:38:18 IP:222.183.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?topic_id=41230 http://delphi.ktop.com.tw/topic.php?topic_id=41800 上个问题找到答案了,
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-15 22:04:55 IP:218.174.xxx.xxx 未訂閱
我依照你起的頭try了一下,方法有點土法煉鋼就是了,雖然你找到答案,還是貼出來參考看看了..    附上測試的專案上傳, http://delphi.ktop.com.tw/loadfile.php?TOPICID=18720230&CC=418670    
    TStringGridEx=Class(TStringgrid)
  private
    FTextAlignment :TAlignment ;
  procedure SetTextAlignment (Value:TAlignment);
  procedure DrawCell(ACol, ARow: Longint; ARect: TRect;
    AState: TGridDrawState);override;
  public      published
    property TextAlignment :TAlignment read FTextAlignment write SetTextAlignment ;
  end;    procedure TStringGridEx.DrawCell(ACol, ARow: Integer; ARect: TRect;
  AState: TGridDrawState);
begin
  inherited;
  if DefaultDrawing then  begin
     if self.FTextAlignment=taLeftJustify then begin
        Canvas.TextRect(ARect, ARect.Left+2, ARect.top+2, Cells[ACol, ARow]);
     end;
     if self.FTextAlignment=taCenter then begin
        Canvas.TextRect(ARect, (ARect.left+ARect.right-canvas.TextWidth(Cells[ACol, ARow])) div 2, ARect.Top+2, Cells[ACol, ARow]);
     end;
     if self.FTextAlignment=tarightJustify then begin
        Canvas.TextRect(ARect, ARect.right-canvas.TextWidth(Cells[ACol, ARow])-2 ,ARect.Top+2, Cells[ACol, ARow]);
     end;
  end;
end;    procedure TStringGridEx.SetTextAlignment(Value: TAlignment);
begin
  if value <> FTextAlignment then
  begin
     FTextAlignment := Value;
     Validate;
  end;
end;    
發表人 - hahalin 於 2004/11/15 22:15:40 發表人 - hahalin 於 2004/11/15 23:07:12
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-15 23:20:50 IP:222.183.xxx.xxx 未訂閱
多谢hahalin大大热心!< >< > 请问,我想实现将各列始终自动填满grid该调用什么方法?是在grid的尺寸变化的事件(消息?)中处理吗? 比如我现在绘制了5列,(就只有五列,行不限制)。如果我设置Grid的align=alclient方式时候,当Grid尺寸调整,如何设置各列按比例展开在Grid中呢?
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-16 00:26:52 IP:218.174.xxx.xxx 未訂閱
如果要按比例 是否要有屬性可以得之比例多少 其餘的 我似乎還不太了解您的意思
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-16 00:41:26 IP:222.183.xxx.xxx 未訂閱
为什么我测试的时候是好的,单元格很清楚,但是当我在程序中运行,单元格显示的很难看,格与格之间界限模糊?
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-16 00:56:21 IP:218.174.xxx.xxx 未訂閱
我用上面自己寫的元件作測試 還好耶... 中間的模糊...???
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-16 18:47:54 IP:222.183.xxx.xxx 未訂閱
为什么单元格的线显示模糊呢?是不是绘制的矩形将格线挡住了?    
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-17 13:48:01 IP:222.183.xxx.xxx 未訂閱
为什么画完了成了这个样子?
代码如下:
procedure TStringGridEx.DrawCell(ACol, ARow: Integer; ARect: TRect;
  AState: TGridDrawState);
var
  FixRect: TRect;
begin
  inherited;
  if Cells[ACol, ARow] <> '' then
  begin
    //填滿每一 Cell 背景 (清掉舊 Cell Text)
    Canvas.FillRect(ARect);
    //繪製新的 Cell Text
    FixRect := ARect; //修正 Rect 座標
    FixRect.Left := ARect.Left +2;
    FixRect.Top := ARect.Top +2;
    FixRect.Right := ARect.Right ;
    FixRect.Bottom := ARect.Bottom;
    if self.FTextAlignment = taLeftJustify then begin
      DrawText(canvas.Handle, PChar(Cells[ACol, ARow]), Length(Cells[ACol, ARow]), FixRect, DT_LEFT);
     // Canvas.TextRect(ARect, ARect.Left + 2, ARect.top + 2, Cells[ACol, ARow]);
    end;
    if self.FTextAlignment = taCenter then begin
       DrawText(canvas.Handle, PChar(Cells[ACol, ARow]), Length(Cells[ACol, ARow]), FixRect, DT_CENTER);
     //Canvas.TextRect(ARect, (ARect.left + ARect.right - canvas.TextWidth(Cells[ACol, ARow])) div 2, ARect.Top + 2, Cells[ACol, ARow]);
    end;
    if self.FTextAlignment = tarightJustify then begin
      DrawText(canvas.Handle, PChar(Cells[ACol, ARow]), Length(Cells[ACol, ARow]), FixRect, DT_RIGHT);
      //Canvas.TextRect(ARect, ARect.right - canvas.TextWidth(Cells[ACol, ARow]) - 2, ARect.Top + 2, Cells[ACol, ARow]);
      //exit;
    end;
  end;
//这里尝试添加invalidategrid好像也不行也< >
                                  //>< >    發表人 - 
        
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-17 13:54:21 IP:218.170.xxx.xxx 未訂閱
嗯 我沒試過你這樣的做法 也許你應該順著源頭 根據你之前搜尋到的post, 使用 DrawText(canvas.Handle, PChar(Cells[ACol, ARow]), Length(Cells[ACol, ARow]), FixRect, DT_RIGHT); 這個方式的問題,請教使用這個方法的人 會比較有好的解答...
系統時間:2024-11-22 22:01:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!