記事カテゴリ

ユーザー機能


 2024年12月11日(水) 03:14 JST

[Delphi]条件分岐をすっきりと(配列をうまく使う)

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

条件により処理が変わるなんてことは日常茶飯事だろう。処理ではなくセットする値が異なる場合もある。
「もしAがtrueだったら処理1を、falseだったら処理2を実行する」なーんてやつだ。

信号機とその色をプログラムにしてみる。

信号機には、進んでよし/注意/止まれの3種の状態がある。これを定義してみる。

type
  TSignal = (sgGo, sgWarning, sgCritical);

それぞれの状態に対応する色を返す関数はこんな感じになるだろうか?

function GetColor(ASignal: TSignal): TColor;
begin
  case ASignal of
    sgGo:
      Result := clBlue;
    sgWarning:
      Result := clYellow;
    sgCritical:
      Result := clRed;
  end;
end;

case文で結構すっきり書けた。

[Delphi] マウスイベントの発生順序

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

マウス関連イベントの発生順序は直感的に想像する順序と異なります。
くろねこの直感ではダブルクリックを行った場合のイベントの発生順序を以下のどちらかであると考えていました。

  1. MouseDown
  2. MouseUp
  3. Click
  4. MouseDown
  5. MouseUp
  6. DblClick

又は

  1. MouseDown
  2. Click
  3. MouseUp
  4. MouseDown
  5. DblClick
  6. MouseUp

しかし実際は、以下のような順序でした。

  1. MouseDown
  2. Click
  3. MouseUp
  4. DblClick
  5. MouseDown
  6. MouseUp

なんで、このような順序になるのですかね.

[Delphi] 大文字・小文字変換の関数(Delphi)

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

⚠⚠⚠ 注意!:この記事はUnicode対応する前のDelphiが対象です。⚠⚠⚠

TEditのCharCaseプロパティ、AnsiUpperCase/AnsiLowerCase についてDBCSはその処理の対象外であると思いこんでいたが、的がはずれて結構時間を費やしてしまったので備忘録としてまとめておく。
ちなみに、MBCS(DBCS)対応でSBCSのアルファベット(ASCII)部分のみ変換する関数は、Ansi~FileName関数であった。
TEditのCharCaseプロパティには、そのような動作を指定できる値がないため、別途KeyPressなどで処理をする必要がある

procedure TfrmXXXXX.InplaceEditorKeyPress(Sender: TObject; var Key: Char);
begin
  // 小文字→大文字変換例
  if Key in ['a'..'z'] then Key := Char(Ord(Key)-$20);
end;

[Delphi] インプレースエディタの取得

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

下記のようなコードでインプレースエディタを取得すると、グリッドの内容を編集中の場合だけなどに限定した処理が可能です。

function GetGridEditor(Grid: Tc1UltGrid): TCustomEdit;
var
  i: Integer;
begin
  Result := nil;
  for i := 0 to pred(Grid.ControlCount) do
  begin
    if (Grid.Controls[i] is TCustomEdit) then
    begin
      Result := TCustomEdit(Grid.Controls[i]);
      exit;
    end;
  end;
end;

[Delphi] コントロールの描画を中止

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

下記のコードでどの様なコントロールの描画も中止することが出来る。
結果は同じようだ。LockWindowUpdate の内部処理は、WM_SETREDRAW メッセージを送信してるんじゃないかな?

  1. 方法1
      LockWindowUpdate(DrawStopCtrl.Handle);
      try
        // 処理
      finally
        LockWindowUpdate(0);
        DrawStopCtrl.invalidate;
      end;
    
  2. 方法2
      SendMessage(DrawStopCtrl.Handle, WM_SETREDRAW, 0, 0);
      try
        // 処理
      finally
        SendMessage(DrawStopCtrl.Handle, WM_SETREDRAW, 1, 0);
        DrawStopCtrl.invalidate;
      end;

サイトカレンダー

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

2024年 01月
«
»
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日)