자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다. 
  • 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)

FM에서 DB올리고 Live Binding으로 String Grid에 뿌렸을데

Grid의 타이틀을 멀티(2줄3줄)로 사용할려고 하는데 어떻게 해야 하는지 난감하네요.

Headerd에 접근이 않되는 것인지? 알려 주세요

 

아래 소스는 VCL의 DBGrid의 Title을 2줄또는 그 이상으로 멀티로 하는 소스인데

이것을 FM에 적용해 보니 에러 떨어지는데 소스라도 좀 FM에 맞게 수정 좀 부탁 합니다.

 

 

 

unit MLDBGrid;


interface

uses Windows, Classes, SysUtils, Controls, Graphics, DBGrids, Db, Grids;

type
  TMultiLineGrid = class(TDBGrid)
    private
      FTitleHeight: Integer;
    protected
      procedure LayoutChanged; override;
      procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
      procedure SetTitleHeight(Value: Integer);
    public
      constructor Create(AOwner: TComponent); override;
      property Row;
      property Col;
    published
      property TitleHeight: Integer read FTitleHeight write SetTitleHeight;
      property OnMouseMove;
  end;

procedure Register;

implementation

constructor TMultiLineGrid.Create(AOwner: TComponent);
begin
  inherited;
  FTitleHeight:=17;
end;

procedure TMultiLineGrid.SetTitleHeight(Value: Integer);
begin
  if FTitleHeight<>Value then
  begin
    FTitleHeight:=Value;
    LayoutChanged;
  end;
end;

procedure TMultiLineGrid.LayoutChanged;
begin
  inherited;
  if dgTitles in Options then RowHeights[0]:=FTitleHeight;
end;

function BreakStr(ACanvas: TCanvas; StrWidth: Integer; Str: String): TStringList;
const Dividers=' ,.<>:;-*/+"''$#()=';
var i: Integer;
    tmp: String;
    Words: TStringList;
begin
  Words:=TStringList.Create;
  Result:=TStringList.Create;
  tmp:='';
  for i:=1 to Length(Str) do
  begin
    tmp:=tmp+Str[i];
    if Pos(Str[i],Dividers)>0 then begin Words.Add(tmp); tmp:='' end;
  end;
  Words.Add(tmp);
  tmp:='';
  Result.Add(Words[0]);
  for i:=1 to Words.Count-1 do
  begin
    if (ACanvas.TextWidth(Result[Result.Count-1]+Words[i])>StrWidth) then
    begin
      Result[Result.Count-1]:=Trim(Result[Result.Count-1]); //trim the blanks at the line's edges
      Result.Add(Words[i]);
    end
    else
      Result[Result.Count-1]:=Result[Result.Count-1]+Words[i];
  end;
  Words.Free;
end;

procedure TMultiLineGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
var
    MasterCol,Column: TColumn;
    TitleRect: TRect;
    LeftPoint,i, LineHeight: Integer;
    Strs: TStringList;
begin
  if (dgTitles in Options) and (ARow=0) and ((ACol>0) or (not (dgIndicator in Options))) then
  begin
    if dgIndicator in Options then Column:=Columns[ACol-1] else Column:=Columns[ACol];
    TitleRect:=CalcTitleRect(Column, ARow, MasterCol);
    if MasterCol = nil then
    begin
      Canvas.Brush.Color := FixedColor;
      Canvas.FillRect(ARect);
      Exit;
    end;
    Canvas.Font := MasterCol.Title.Font;
    Canvas.Brush.Color := MasterCol.Title.Color;
    Canvas.FillRect(TitleRect);
    Strs:=BreakStr(Canvas,ARect.Right-ARect.Left-4,MasterCol.Title.Caption);
    LineHeight:=Canvas.TextHeight('Wg');
//    Strs:=BreakStr(Canvas,ARect.Right-ARect.Left-4,'asdfgad adsfgdffff gfdfg dfgdfgdg');
    for i:=0 to Strs.Count-1 do
    begin
      case Column.Title.Alignment of
        taLeftJustify:
          LeftPoint:=ARect.Left+2;
        taRightJustify:
          LeftPoint:=ARect.Right-Canvas.TextWidth(Strs[i])-3;
        taCenter:
          LeftPoint:=ARect.Left+(ARect.Right-ARect.Left) shr 1 - (Canvas.TextWidth(Strs[i]) shr 1);
      else
        LeftPoint:=0;
      end;
      Canvas.TextRect(ARect,LeftPoint,ARect.Top+2,Strs[i]);
      ARect.Top:=ARect.Top+LineHeight+2;
    end;
    Strs.Free;
    if [dgRowLines, dgColLines]*Options=[dgRowLines, dgColLines] then
    begin
      DrawEdge(Canvas.Handle, TitleRect, BDR_RAISEDINNER, BF_BOTTOMRIGHT);
      DrawEdge(Canvas.Handle, TitleRect, BDR_RAISEDINNER, BF_TOPLEFT);
    end;
  end
  else inherited;
end;

procedure Register;
begin
  RegisterComponents('Data Controls', [TMultilineGrid]);
end;

end.
번호 제목 글쓴이 날짜 조회 수
공지 [프로그래밍 강의] 2021.6~2021.12 관리자 2015.01.22 15762
공지 유용한 관련 사이트 관리자2 2014.03.20 54577
공지 본 게시판은 개발자 여러분들의 질문과 답변을 공유하는 공간입니다. 관리자 2012.01.10 97974
799 바코드 Generator 관련 질문 [1] 유레너스 2015.05.13 312
798 [XE8 웹세미나] 웹 환경의 업무 프로젝트 개발이 얼마나 편리한가요? Humphery 2015.05.13 235
797 [XE8 웹세미나] 유니코드관련 델파이 마이그레이션 정보를 알고 싶습니다. Humphery 2015.05.13 202
796 [XE8 웹세미나] 비콘 센서와 연동하는 방법에 대해 자세히 알고 싶습니다. Humphery 2015.05.13 628
795 [XE8 웹세미나] 멀티디바이스 플랫폼과 데이터스냅서버(파이어댁으로 db연결) 시 db커넥션이 두개씩 생성이 되던데, 그 이유? 혹은 어떤 설정이 잘못된것인지? 정상적인 데모소스를 구할수 있는지요? [1] 관리자 2015.05.08 395
794 리스트박스 PACKETRECORDS [6] 김하나 2015.05.08 528
793 XE7에서 개발한 앱을 XE8에서 컴파일시 질문입니다. [1] 희망나라 2015.05.09 308
792 [XE8 웹세미나] 실행중 발생하는 Access violation시 클래스명이라도 표시 해줬으면 디버깅 속도 개선에 많은 도움이 될듯합니다. [1] 관리자 2015.05.08 401
791 XE7사용 블루투스 통신앱 안드로이드 롤리팝업그레이드 후 이상증세 [1] 아기사랑 2015.05.08 751
790 [XE8 웹세미나] 기존 델파이 5/7/XE3 와 같이 설치 개발 가능한지 궁금합니다 관리자 2015.05.08 264
789 [XE8 웹세미나] reFind.exe를 XE이하 환경에서도 쓸 수 있는 방법을 알고 싶네요. 관리자 2015.05.08 349
788 델파이로 스마트폰 전화번호 가져요기 가능한가여? [1] 코더만들기 2015.05.04 3115
787 아이폰 앱 글자깨짐 [2] file 사랑남 2015.04.23 1140
786 XE7에서 Mac IOS Simulator 연결 문제. [2] kmtl 2015.04.30 511
785 [XE8 출시세미나] RAD Studio XE8 출시세미나 질문과 답변 Humphery 2015.05.01 1466
784 [XE8 출시세미나] RAD Studio 2007에서 XE8로 마이그레이션할 때 검토해야할 사항은 어떤 것이 있나요? [1] 관리자 2015.04.30 266
783 [XE8 출시세미나] 기존에 유니코드가 아니라 ANSI를 사용하고 있습니다. 델파이 2009 버전 이상에서는 무조건 유니코드를 써야하나요? 업그레이드 하더라도 ANSI를 계속 사용하려면 어떻게 하나요? [1] 관리자 2015.04.30 366
782 [XE8 출시세미나] 구글글래스 앱을 만들어야 하는 프로젝트가 있습니다. 델파이로 개발할 수 있나요? [1] 관리자 2015.04.30 483
781 [XE8 출시세미나] 델파이로 윈도우 메트로 UI를 구현할 수 있다고 했는데, 인텔 윈도우가 아닌 윈RT 앱도 만들 수 있나요? [1] 관리자 2015.04.30 413
780 [XE8 출시세미나] 데이터스냅 서버나 EMS 서버를 확장 (Scale out) 할 수 있나요? [1] 관리자 2015.04.30 441