フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: XE2 以降の憂鬱
DEKO
管理者
投稿数: 2690
XE2 以降の憂鬱
on: 2013/06/10 23:40 Mon

本職のほうでは未だ TComboGrid 等を使っておりますが、古いコンポーネントを XE2 の VCL スタイルや 64bit に対応させようとすると骨が折れる作業になります。

TStringGrid は当然 VCL スタイルや 64bit にも対応しています。右寄せ / 中央寄せさえできればそこそこ使えるのですが、標準では無理です。TDBGrid でやっているような [...] ボタンやコンボボックスを出すのは簡単にできるのですが。

…で、これを機に "VCL スタイルや 64bit に対応する TComboGrid 代替グリッドを作ってしまえ" という事になりました。

公開はしないと思いますが、一応仕様を。

  • セルの種類は 通常 / [...] ボタン付き / コンボボックス / チェックボックス
  • セルは "左寄せ / 中央寄せ / 右寄せ" と "上寄せ / 中央寄せ / 下寄せ" が可能。
  • セル内でのワードラップが可能
  • セルにマスク文字列または数値用のフォーマット文字列を設定可能
  • 文字色の変更が可能
  • 通常セルの背景色を変更可能
  • 列単位で "入力可 / 不可" を設定可能
  • 列単位で IME モードを設定可能

…大体出来てるのですが。

DEKO
管理者
投稿数: 2690
[...] ボタンやコンボボックスを出すのは簡単
on: 2013/06/11 03:56 Tue

TDBGrid で使われている機能ですから、相当古い Delphi でも普通にできます。

[uGridEx.pas]
unit uGridEx;

interface

uses
Classes, Grids;

type
TEditBtnClick = procedure(Sender: TObject; ACol, ARow: Integer) of object;
TGetPickListItems = procedure(Sender: TObject; ACol, ARow: Integer; Items: TStrings) of object;
TGetEditStyle = procedure(Sender: TObject; ACol, ARow: Integer; var EditStyle: TEditStyle) of object;

TStringGridEx = class(TStringGrid)
private
FOnEditBtnClick: TEditBtnClick;
FOnGetPickListItems: TGetPickListItems;
FOnGetEditStyle: TGetEditStyle;
procedure EditButtonClick(Sender: TObject);
procedure GetPickListItems(ACol, ARow: Integer; Items: TStrings);
protected
function CreateEditor: TInplaceEdit; override;
function GetEditStyle(ACol, ARow: Integer): TEditStyle; override;
published
property OnEditBtnClick: TEditBtnClick read FOnEditBtnClick write FOnEditBtnClick;
property OnGetPickListItems: TGetPickListItems read FOnGetPickListItems write FOnGetPickListItems;
property OnGetEditStyle: TGetEditStyle read FOnGetEditStyle write FOnGetEditStyle;
end;

implementation

{ TStringGridEx }

function TStringGridEx.CreateEditor: TInplaceEdit;
begin
result := TInplaceEditList.Create(Self);
TInplaceEditList(result).OnGetPickListItems := Self.GetPickListItems;
TInplaceEditList(result).OnEditButtonClick := Self.EditButtonClick;
end;

procedure TStringGridEx.EditButtonClick(Sender: TObject);
begin
if Assigned(FOnEditBtnClick) then
FOnEditBtnClick(Self, Self.Col, Self.Row);
end;

function TStringGridEx.GetEditStyle(ACol, ARow: Integer): TEditStyle;
var
LEditStyle: TEditStyle;
begin
LEditStyle := esSimple;
if Assigned(FOnGetEditStyle) then
FOnGetEditStyle(Self, ACol, ARow, LEditStyle);
result := LEditStyle;
end;

procedure TStringGridEx.GetPickListItems(ACol, ARow: Integer;
Items: TStrings);
begin
Items.Clear;
if Assigned(FOnGetPickListItems) then
FOnGetPickListItems(Self, ACol, ARow, Items);
end;

end.

 
こんな感じのユニットを作っておけば、

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, uGridEx;

type
TStringGrid = class(TStringGridEx);

TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormShow(Sender: TObject);
procedure EditBtnClick(Sender: TObject; ACol, ARow: Integer);
procedure GetEditStyle(Sender: TObject; ACol, ARow: Integer; var EditStyle: TEditStyle);
procedure GetPickListItems(Sender: TObject; ACol, ARow: Integer; Items: TStrings);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.FormShow(Sender: TObject);
// フォーム表示時
begin
OnShow := nil;

StringGrid1.Options := [goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,goRangeSelect,goEditing,goAlwaysShowEditor];

// イベントハンドラを設定
StringGrid1.OnEditBtnClick := EditBtnClick;
StringGrid1.OnGetEditStyle := GetEditStyle;
StringGrid1.OnGetPickListItems := GetPickListItems;
end;

procedure TForm1.EditBtnClick(Sender: TObject; ACol, ARow: Integer);
begin
// グリッドの [...] ボタンが押された時
ShowMessage(IntToStr(ACol));
end;

procedure TForm1.GetEditStyle(Sender: TObject; ACol, ARow: Integer;
var EditStyle: TEditStyle);
begin
// グリッドのセルの種類を設定
case ACol of
2: EditStyle := esEllipsis; // [...] ボタン
3: EditStyle := esPickList; // コンボボックス
else
EditStyle := esSimple;
end;
end;

procedure TForm1.GetPickListItems(Sender: TObject; ACol, ARow: Integer;
Items: TStrings);
begin
// コンボボックスのリストを設定
Items.Add('AAA');
Items.Add('BBB');
Items.Add('CCC');
end;

end.

 
こんな感じで使えます。現在作っているものとはちょっとやり方が異なりますが、基本的には同じようなものです。

※ 画像の開発環境は Delphi 7 です。

DEKO
管理者
投稿数: 2690
Re: XE2 以降の憂鬱
on: 2013/06/11 14:05 Tue

ふむ。後はチェックボックス周りだけか。

DEKO
管理者
投稿数: 2690
Re: XE2 以降の憂鬱
on: 2013/06/13 07:37 Thu

ほぼ完成。コンポーネントエディタもできており、パッケージの分離も行ってある。

[テーマなし]

[テーマあり]

[VCL スタイル (Carbon)]

後は "現状で使っていない機能" を整備するかどうかだな。

DEKO
管理者
投稿数: 2690
Re: XE2 以降の憂鬱
on: 2013/06/13 07:49 Thu

書き忘れていましたが、TComboGrid は謎全さんの "Delphi2.0Jコンポーネントセット (ISBN: 4756110576) " に含まれています。

[TComboGrid (雑談)]
http://ht-deko.minim.ne.jp/ft1012.html#101210_01

アップデータが Nifty-Serve にアップされていた記憶があるのですが、当然の事ながらもはや入手する事はできません。

DEKO
管理者
投稿数: 2690
Re: XE2 以降の憂鬱
on: 2013/06/14 02:34 Fri

とりあえず完成。すべてを同時に見せる事はできないけれど、先日来からの機能を使うと以下のような表現が可能になる。

機能は増えているけれど、コード量は元の 2/3 になった。今回の作業は確かに面倒だったけれど、意味も解らずに追加した香ばしいコードを一掃できてよかったのかもしれない。"秘伝のタレ" 的なコードは確かに動作するのだけれど、今となっては必要のない Win9x 用コードや Delphi のバグ回避のためのバッドノウハウなコードが無駄に書かれている事が多いので。

XE2 以降用という事になっていますが、(TStrinGrid の) DrawingStyle プロパティが追加された Delphi 2010 以降で動作するように作られています。
(2010 / XE 用のパッケージも一応作って動作確認してあります)

…あとは実戦投入して細部を煮詰めるだけかな。

Mr.XRAY
メンバー
投稿数: 192
Re: XE2 以降の憂鬱
on: 2013/06/14 08:55 Fri

なるほど,いいですね.きっと欲しい方もいるでしょうね.
公開はしない,らしいということですが,公開するとなると,それなりの整備が必要となりますが,自分だけが利用する場合は,実際に使いながら修正していくという使い方になるような気がします.

でも,この拡張した TStringGrid の説明と図があるだけでも,自分でも作ってみようと考えている方の参考になるのではないかと思います.
結構,動作仕様等の決定も試行錯誤がありますから.
それにしても謎全さんのコンポはすごいですよね.今現在なら中古の在庫まだ数点ありますね.

uGridEx,思わず「ユークリッドエクスプレス」と読んでしまった !

DEKO
管理者
投稿数: 2690
Re: XE2 以降の憂鬱
on: 2013/06/14 13:21 Fri

引用 Mr.XRAY on 2013/06/14 08:55 Fri
でも,この拡張した TStringGrid の説明と図があるだけでも,自分でも作ってみようと考えている方の参考になるのではないかと思います.
結構,動作仕様等の決定も試行錯誤がありますから.
それにしても謎全さんのコンポはすごいですよね.今現在なら中古の在庫まだ数点ありますね.

 
仕様的なものはこちらになります。

[TAltCombogrid 取扱説明書]
http://ht-deko.minim.ne.jp/delphiforum/wp-content/uploads/taltcombogrid.pdf

TStringList を改変する際の参考になるかもしれません。

TAltComboGrid は TComboGrid を置換するために作られているので、プロパティやイベント等を TComboGrid に合わせてあります。コンポーネントエディタなんかはほぼ丸パクリでして、そのせいで "公開しない (できない)" という事だったりします。

本書は著作権法上の保護を受けています。本書の一部あるいは全部について (ソフトウェア及びプログラムを含む)、
株式会社アスキーから文書による許諾を得ずに、いかなる方法においても無断で複写、複製することは禁じられています。

 
"Delphi 2.0J コンポーネントセット" には上記の一文があるのです。

Mr.XRAY
メンバー
投稿数: 192
Re: XE2 以降の憂鬱
on: 2013/06/14 13:52 Fri

なるほどです.
しかし,すでに,取扱説明書まで作成しているとは.

DEKO
管理者
投稿数: 2690
Re: XE2 以降の憂鬱
on: 2013/06/15 06:21 Sat

補足ですが、Delphi 3 以降では TStringGrid に OnGetEditMask イベントがあり、このイベント内でインプレースエディタのマスク文字列を指定できます。下記コードは 2 列目に日付用のマスク文字列を指定します。

procedure TForm1.StringGrid1GetEditMask(Sender: TObject; ACol,
ARow: Integer; var Value: String);
begin
case ACol of
1: Value := '!9999/99/00;1; ';
end;
end;

 
TComboGrid が作成された時点 (Delphi 2) ではこのイベントは存在しなかったのです。

See Also:
[Vcl.Grids.TDrawGrid.OnGetEditMask (DocWiki)]
http://docwiki.embarcadero.com/Libraries/ja/Vcl.Grids.TDrawGrid.OnGetEditMask

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.062 sec.