記事カテゴリ

ユーザー機能

カウンター


 2017年5月23日(火) 04:16 JST

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

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

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

DMM FX
低スプレッドのFX会社で快適トレード

プロミス
取りあえずのピンチをしのぐときにどう?

[Delphi] ひらがなからカタカナへ、カタカナからひらがなへ(.Net)

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

ひらがなからカタカナに、カタカナからひらがなに変換したい時って無いですか?たとえば、フリガナ入力欄などにユーザがカタカナって書いてるのにひらがなで入力してくる人いませんか?そんなとき、変換関数があったら便利ですよね。
でも、結構こんな日本語の変換関数を作るのは骨が折れるもの、作ってもデバッグが大変。だったら、あるものを使う方が楽じゃない?標準で日本語変換してくれる関数を持った言語って...と考えると 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] 半角(SBCS)と全角(MBCS)を区別する (for VCL.Net)

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

半角文字と全角文字を区別する方法です。.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;

[Delphi] コンポーネントを使用したらアドレス違反が...

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    4,400
コンポーネントを自身のプログラムに組み込んだら、アプリケーションの起動時または、追加したフォームの作成時に「アドレス違反が発生した。」ということはありませんか?こんな時、くろねこ製のコンポーネントだと、ふつうは真っ先にコンポーネントのバグを疑います。(またテスト漏れしてやがると、サポート掲示板にでも苦情を書き込んでやってください。)がしかし、ほかのプログラムでは正常に動いてるのに...
こんな時には、プロジェクトの設定を確認してください。プロジェクト|オプション|パッケージ の「実行時パッケージを使って構築」にチェックがついていませんか?このチェックが ON の場合には、パッケージ本体のファイルが必要になります。具体的にはアプリケーション実行時にパスの通ったディレクトリに、*.bpl ファイルが必要になります。

実行時パッケージを使って構築って?

実行時パッケージを使って構築を使うと DLL を使った時のように、重複するコードをプログラムの外に出すので EXE ファイルのサイズを小さくできます。実行時に BPL ファイルを読み込んでダイナミックにプログラムと結合してアプリケーションの動作に寄与します。このため実行時に参照できる状態にないと、アドレス違反が発生するのです。 小さいアプリケーションの場合には、実行時パッケージを使わない方がよいでしょう。EXE 一つで配布が完了するので、配布ファイルの管理が非常に楽になります。
ではいつ実行時パッケージを使った方がよいのでしょうか?それは、プログラムの配布サイズが企業ポリシーで制限されている場合や、頻繁に修正されるようなプログラムで修正される部分と修正されない部分を分けてしまう場合などがあります。大きなアプリケーションですと、サブシステム毎に分割を行うということもあるでしょう。
分割してしまうと、その実行時パッケージに修正を行った場合(機能拡張やバグ修正など)、にその実行時パッケージを配布すればよいので、配布するプログラムのサイズを大幅にカットできます。大企業やソフトハウスなどで遠隔地のパソコンに修正プログラムを配布しなければいけない場合には、時間の短縮にもなりますね。

[Delphi] フリガナを自動で入力する (for VCL.Net)

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

WM_IME_COMPOSITION メッセージが発生したときに、ImmGetCompositionString 関数を使ってFEP (IME など) が持つフリガナを取得します。

この例は、フリガナ機能付きコンポーネントの作成例です。
TEdit コンポーネントに KanaOut プロパティを追加しています。 この追加したプロパティに、Edit1(TEdit クラス) を設定すると、入力した文字のフリガナが Edit1.Text に入力されていきます。

unit KanaEdit;

interface

uses
  Windows, Messages, Classes, Graphics, Controls, StdCtrls;

type
  { TKanaEdit }
  TKanaEdit = class(TEdit)
  private
    FKanaOut: TEdit; // KanaOutプロパティ
  protected
    procedure SetKanaOut(AValue:TEdit);
    procedure WndProc(var Msg: TMessage); override;
  published
    // プロパティ
    ...
    property KanaOut: TEdit read FKanaOut write SetKanaOut;
    ...
  end;

procedure Register;

implementation

uses
  IMM;

procedure Register;
begin
  RegisterComponents('Samples', [TKanaEdit]);
end;

{*******************************************************************************
機能: カナ出力プロパティーセット
引数:
戻値:
*******************************************************************************}
procedure TKanaEdit.SetKanaOut(AValue: TEdit);
begin
  if (AValue = nil) or (AValue = Self) then
  begin
    FKanaOut := nil;
  end
  else
  begin
    FKanaOut := AValue;
  end;
end;

{*******************************************************************************
機能: メッセージ処理
引数:
戻値:
*******************************************************************************}
procedure TKanaEdit.WndProc(var Msg: TMessage);
var
  imc: HIMC; // IMEのコンテキストを格納
  sbKana: StringBuilder;
  nSize: Integer;
begin
  if (FKanaOut <> nil) then
  begin
    if (Msg.Msg = WM_IME_ENDCOMPOSITION) then
    begin
      imc := ImmGetContext(Handle);
      case Msg.Msg of
        WM_IME_ENDCOMPOSITION:
        begin
          // 変換結果の「読み」を取得
          nSize := ImmGetCompositionString(imc, GCS_RESULTREADSTR, nil, 0);
          sbKana := StringBuilder.Create;
          sbKana.Length := nSize;
          ImmGetCompositionString(imc, GCS_RESULTREADSTR, sbKana, nSize+1);
          ImmReleaseContext(Handle, imc);
          // 更新後文字列作成
          FKanaOut.Text := FKanaOut.Text + sbKana.ToString;
        end; // WM_IME_ENDCOMPOSITION
      end; // case
    end;  // if
  end;  // if
  inherited;
end;
end.
最初 | 前へ | 1 234567| 次へ | 最後

サイトカレンダー

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

2017年 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日)