記事カテゴリ

ユーザー機能


 2024年3月28日(木) 17:19 JST

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

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

まず、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 に変えたら出来ると思い、やってみたが出来なかった。何か一ひねり必要なのかもしれない...

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

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

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] ひらがなからカタカナへ、カタカナからひらがなへ(.Net)

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

ひらがなからカタカナに、カタカナからひらがなに変換したい時って無いですか?たとえば、フリガナ入力欄などにユーザがカタカナって書いてるのにひらがなで入力してくる人いませんか?そんなとき、変換関数があったら便利ですよね。
でも、結構こんな日本語の変換関数を作るのは骨が折れるもの、作ってもデバッグが大変。だったら、あるものを使う方が楽じゃない?標準で日本語変換してくれる関数を持った言語って...と考えると C 言語とかありますね。でも、C 言語は .Net Frramework には見あたらないです。C# にはそのような変換関数は無いようです。でも、Visual Basic には StrConv 関数がありますね。これを使いましょう。
今までだと、他の言語の機能を使うときは、その言語でその機能を呼び出す DLL を作って使っていたかもしれませんが、StrConv は .Net Framework で Microsoft.VisualBasic アセンブリとして、元々入っています。ということは、これを使っても配布の必要すらないということです。
これを呼び出すには、プロジェクトツリーの「参照先」を右クリックして、参照の追加で Microsoft.VisualBasic を追加します。これだけで、使う準備は完了です。
あとは、必要な場所で StrConvを呼び出すだけです。

カタカナに変換する場合
edtKata.Text := Strings.StrConv(edtHira.Text, VbStrConv.Katakana);
    
ひらがなに変換する場合
edtHira.Text := Strings.StrConv(edtKata.Text, VbStrConv.Hiragana);
    

StrConv には、半角⇔全角変換などの機能があります。これらも同様の方法で使えるので、是非試してみてください。

[Delphi] アプリケーションの多重起動を防止する(.Net)

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

アプリケーションの多重起動を防止したい場面は結構あるのではないでしょうか? 処理結果を特定のファイルに出力するケースなどがあった場合、複数のアプリケーションがその処理を行うと、最悪そのファイルが壊れるケースが出てきそうですし、ファイルが壊れなくても、内容が変になる危険性が高いと思います。 多重起動防止方法にはいくつか方法があると思いますが、ここではもっとも実装が一般的だと思われる Mutex を使った方法をご紹介します。
Mutex に付いての詳細は、@ITにわかりやすい解説があったのでそちらを参照してもらえれば、くろねこの下手な文章よりわかりやすいと思います。
ただ、@IT では Delphi のサンプルが無かったので、Delphi での多重起動防止についてサンプルを作ってみました。
Delphi で .Net 対応アプリを作るのは大きく分けて2とおりの方法があります。VCL.Net を使う方法と、 Windows Form を使用する方法です。VCL.Net で Mutex を実装する際にまた2とおりの方法に分かれます。2とおりの方法とは、VCL.Net (SyncObjs ユニット) にある TMutex クラスを使う方法と、.Net Framework (System.Threading) にある Mutex クラスを使う方法です。くろねこ的には、.Net Framework を使用する方が美しいかと思います。

[Delphi] 半角(SBCS)と全角(MBCS)を区別する (for VCL.Net)

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

半角文字と全角文字を区別する方法です。.Net環境ではDelphiもほかの言語と同じように Unicode になってしまったので、従来のような ByteType 関数による半角文字と全角文字の判定は行うことができません。
同じように、Win32 API のIsDBCSLeadByte などの API も使用できなくなっています。
(ここでは半角 = 1バイト文字、全角文字 = 2バイト以上の文字としています。2バイト半角文字もありますが、使用される頻度がほとんど無いため考慮の対象から除外しています。)
そこで、Unicodeの環境では、Shift-JIS(Windows環境ではコードページ932と定義されています)の形に変換してからチェックを行う必要があります。
以下は、エディットボックスに半角文字しか入力させないようにする例です。このコードを埋め込むには uses に System.Text を追加する必要があります。

procedure TForm5.Edit1KeyPress(Sender: TObject; var Key: Char);
const
  VK_Z = 26;
var
  nByteSize: Integer;
begin
  if not (Ord(Key) in [VK_BACK, VK_RETURN, VK_Z]) then // 除外キー
  begin
    nByteSize := Encoding.GetEncoding(932).GetByteCount(String(Key));
    if (nByteSize <> 1) then Key := #0;
  end;
end;

サイトカレンダー

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

2022年 12月
«
»
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日)