記事カテゴリ

ユーザー機能


 2024年5月19日(日) 22:52 JST

[Delphi] DBGrid のスクロールバーを消す

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    11,916

まず、TDBGird コンポーネントから垂直スクロールバーを消すためには、UpdateScrollBar メソッドをオーバーライドする必要がある。

UpdateScrollBar メソッドの内部で、スクロールバーの最小値と最大値を 0 に変更するために SetScrollnfo API を呼び出さなくてはならない。 (最小値と最大値をともに 0 に変更することで、スクロールバーを表示しないよう視することが出来る。TCustomDBGrid のUpdateScrollBar でこのAPIを用いてスクロールバーの処理を行っている。)

以下にスクロールバーの非表示化を行ったコンポーネントのコードを示す。

unit NoScrollbarDBGrid;

interface

uses
  SysUtils, Classes, Controls, Grids, DBGrids;

type
  TNoScrollbarDBGrid = class(TDBGrid)
  protected
    procedure UpdateScrollBar; override;
  end;

procedure Register;

implementation

uses
  Windows;

procedure Register;
begin
  RegisterComponents('Black Cat', [TNoScrollbarDBGrid]);
end;

{ TNoScrollbarDBGrid }

procedure TNoScrollbarDBGrid.UpdateScrollBar;
var
  si: TScrollInfo;
begin
  inherited;
  si.cbSize := sizeof(si);
  si.fMask := SIF_RANGE;
  si.nMin := 0;
  si.nMax := 0;
  SetScrollInfo(Handle, SB_VERT, si, false);
end;

end.

一般的に実際に使う場合には、TDBGrid を継承したコンポーネントを作成するより、TCustomDBGrid の様に TCustom~ で始まるコンポーネントを継承する方がオススメだ。 なぜならコーディング量は多少多くなるが、不要なプロパティなどを見せなくすることが出来るからだ。理由として、C++ だと親クラスのメンバを子クラス側で見せないようにすることも可能だが、Delphi では出来ないということがある。

ちなみに、水平スクロールバーを消すには、SB_VERT を SB_HORZ に変えたら出来ると思い、やってみたが出来なかった。何か一ひねり必要なのかもしれない...

[Excel VBA] IsMissing...

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    5,918

VB/VBAでは引数にOptional が使える。Delphi、C++、VB.Net にはない機能だ...
関数を作る際に、Optional A As Variantなど Optional付で指定したパラメータは省略ができるようになる。
そしてその関数を利用する際に、Optional のパラメータが省略されたかどうかを調べることができるのが、IsMissing というわけ!

しかし、VB6以前には Optional パラメータには Variant 型しか指定できなかったのが、VB6からは Boolean 型なども指定できるようになった。しかし、Variant 型以外を指定した場合には、IsMissing 関数が使用できないのだ!!

知らんかった...

型指定の省略可能パラメータを省略した場合には、デフォルトの省略値が最初からセットされた形で関数が処理されている。
Boolean であれば False、数値型であれば 0、文字列型であれば空文字列がデフォルトの省略値。
変数宣言して初期値で初期化しなかったときのデフォルトと同じですな...

Boolean 型の省略パラメータに対し、 IsMissing を使用して省略判定しようとして期待した結果にならないからと、デバッグして初めてわかったポカミスでした。(T_T)

[Excel VBA] セルの形式をR1C1形式からA1形式に変換

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    31,846

なぜ、今まで知らなかったのだろう...

というか何で今までちゃんと調べなかったのだろう?
セルの形式をR1C1形式からA1形式に変換するのに自作関数まで作ってたことがとてもばからしい...
あるはずだとは思っていたのだが、見つからなかった。ヘルプでキーワード検索しても、全文検索しても... オブジェクトパッケージャで上から順に怪しいメソッドを順に試せば、わかったはずだった。しかしやらなかった。
結論を言うと、Cells もしくは Range オブジェクトには Address というプロパティがあって、それを利用するとセルもしくは範囲がA1形式の絶対表記で取得できる。セル自体を参照する分には必ずしも必要ではないが、列を選択する際にはA1形式の方が圧倒的に表記が楽だ!
使い方はこんな感じ...

    With Worksheets(1)
        Debug.Print .Range(.Cells(1, 1), .Cells(1, 1)).Address
        Debug.Print .Cells(1, 1).Address
    End With

Excelには便利な機能があるが、使い方を知らないものたくさんある。
今一番知りたいのは、オートフィルタでフィルタされずに表示されている行だけ、ループで順に処理できる方法。わかったらまたここにメモしておくことにしよう。

しかし、最近の Office のヘルプはとても使いづらい...

[Delphi] データ行が 0 行のグリッドを表示する

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    8,604

Delphi 標準搭載の TStringGrid はデータ行(非固定行)が 0 件(RowCount = FixedRows)になる様に設定することが禁じられています。
行数を固定行数と等しくなるように設定すると、自動的に固定行の値が減ります。
また、固定行の数を行数と同じに設定しようとすると、以下のエラーが発生し設定を完了することが出来ません。

固定行の数は行数より小さくなければなりません.

仕方がないので、StringGrid のデータ行を隠すことを検討します。隠すことによってユーザからはあたかも存在しないように見せることが出来ます。
以下のように設定します。

with StringGrid1 do
var
  i: integer;
begin
  for i := FixedRows to RowCount - 1
    RowHeights[i] := -GridLineWidth;
end;

データ行を隠し行に設定しています。マイナスの GridLineWidth にしているのは、隠すために 0 を設定すると罫線が残ってしまうために、罫線の高さ分も計算して減らしています。
これで見た目はデータ行がないように見えますが、マウスカーソルが移動してしまうので移動キーを押された場合の制御が別途必要になることがあります。

Delphi 2005 General Update 3 (Japanese) リリース.

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    3,325

先週MLでCapricornさんにDelphi 2005 Update3 Englishがでてるのを教えてもらってたので、日本語有るかな?と見てみたら、日本語版が有った!

早速MLに報告だー。と思ってメールを見たら、すでに報告済みでした。(お昼頃)


サイトカレンダー

サイトカレンダーをスキップ

2024年 05月
«
»
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

新着情報

記事 新着(24時間)

-

コメント 新着(2日)

-

トラックバック 新着(2日)

-

リンク 新着(2週)

新しいリンクはありません

ファイル (14日)