記事カテゴリ

ユーザー機能


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

[Delphi] 切り捨て、四捨五入、切り上げ

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

Delphiで切り捨て、四捨五入、切り上げする際にどんな関数を使っていますか?
Floor、Trunc、Round、SimpleRound、Ceil などを使っていることと思う。
これらの関数は、戻り値の範囲がLongintの範囲であったり、正負での扱いが対照でなかったりするので作ってみた。
x に丸めたい値を、Factor に丸め位置(小数点以下桁数:小数部第一位は1、整数部1桁目は-1)を与える。
※Delphi7 以降には、標準で通常の四捨五入関数 (SimpleRoundTo) が付いている。

切り捨て
function MyRoundDown(x: Currency; Factor: Integer): Currency;
var
  dFactor: Double;
begin
  Factor := Factor -1;
  dFactor := IntPower(10, Factor);
    if Factor < 0 then Factor := Factor +1;
  if x >= 0 then
    Result := Int(x * dFactor) / dFactor
  else
    Result := Int((x * dFactor) + 0.9) / dFactor;
end;
四捨五入
function MySimpleRound(x: Currency; Factor: Integer): Currency;
var
  Sgn: Integer;
  dFactor: Double;
begin
  if x >= 0 then Sgn := 1 else Sgn := -1;
  if Factor < 0 then Factor := Factor +1;
  Factor := Factor -1;
  dFactor := IntPower(10, Factor);
  Result := Int(Abs(x) * dFactor + 0.5) / dFactor * Sgn;
end;
切り上げ
function MyRoundUp(x: Currency; Factor: Integer): Currency;
var
  dFactor: Double;
begin
  Factor := Factor -1;
  dFactor := IntPower(10, Factor);
  if Factor < 0 then Factor := Factor +1;
  if x >= 0 then
    Result := Int((x * dFactor) + 0.9) / dFactor
  else
    Result := Int(x * dFactor) / dFactor;
end;
 

[Delphi] 簡単なファイル移動方法

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    13,264
Delphiでファイルの移動をする際に、いつもどんなコマンドを使用していますか? FileCopy API とDelteFile API を組み合わせて使ってますか?
これからは、API を使うよりも簡単にできる1発関数を使いましょう!
この関数は通常のフォルダ間の移動、ドライブ間の移動に加え、UNCで記述されたフォルダにも移動できます。
ただし、移動先のフォルダが未定義だったり、すでに同名のファイルが存在していると失敗し、 False を返します。
その関数は、RenameFile 関数です。一見名前変更しか対応していないと見せかけておいて、ファイル移動もOKなんです。
使用例は以下のとおり、
RenameFile('c:\autoexec.bat', 'd:\autoexec.bat');
繰り返しになりますが、この関数は失敗すると False を、成功すると True を返します。

[Delphi] 実行中のアプリケーションのインスタンスの取得

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

つい最近まで実行中のアプリケーションやフォームのハンドルなどを取得するには、FindWindow API や EnumWindow API を使用してクラス名やタイトルで引っ掛けて取得するものだと思ってました。 しかし、OLEオブジェクトであれば VB が GetObject 関数でインスタンスを取得できるように、Delphi は GetActiveOleObject 関数でインスタンスを取得できます。(※1 Excel 2000 で GetObject を使用すると問題が発生することがあるようです。 詳細はここを参照してください。
http://support.microsoft.com/default.aspx?scid=http://www.microsoft.com/japan/support/kb/articles/JP413/9/00.asp)
GetActiveOleObject関数で外部アプリケーションにアクセスする
CreateOleObject関数は、外部アプリケーションの新しいインスタンスを作成する関数でした。 したがって、すでにアプリケーションが起動している状態でCreateObject関数を使うと、同一のアプリケーションが次々に起動してしまうことになります。
 一方、GetObject関数は、すでに起動している外部アプリケーションにアクセスする関数になります。 したがって、GetObject関数を使えば、同一のアプリケーションが複数起動することはありません。
VB の GetObject関数は 2 つの引数をとりますが、Delphi の GetActiveOleObject はクラス名のみを引数にとります。

function GetActiveOleObject(const ClassName: string): IDispatch;

以下のサンプルでは、GetObject関数を使ってWordにアクセスしています。すでにWordが起動している場合はそのまま処理を続行しますが、未起動のときには EOleSysError のエラーが発生します。このエラーを検知したときには、CreateOleObject 関数で Word を起動しています。(※2 このサンプルプログラムを動作させるには、implementation 部に ComObj を追加する必要があります。)

procedure TForm1.Button1Click(Sender: TObject);
var
  objWord: OleVariant;
  bAppOpen: Boolean;
begin
  try
    objWord := GetActiveOleObject('Word.Application');
    bAppOpen := true;
  except
    on E: EOleSysError do
    begin
      bAppOpen := false;
    end;
  end;

  // Wordのインスタンスが作成されていなかったら作成する
  if not bAppOpen then
  begin
    objWord := CreateOleObject('Word.Application');

    // 新規文書を挿入する
    objWord.Visible := true;
    objWord.Documents.Add;
  end;
  objWord := Unassigned;
end;

[Delphi] ボタン・チェックボックスの描画

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

リストやグリッドにボタンチェックボックスを 表示したいと考えたことはないですか?
私はグリッドにボタンとチェックボックスの両方を付け加えました。ダウンロードしていただいた方々の中から数人の方が描画方法について質問されましたので、ここで解説したいと思います。 ボタンチェックボックスを描画するには、DrawFrameControl API を使用します。この API は、Delphi Professional 以上をお持ちの方でしたら、TBitBlt、TDBGrid や TCheckListBox などで使用されています。 DrawFrameControl API は SDK で以下のように定義されています。詳細はこちら

BOOL DrawFrameControl(
 HDC hdc,     // デバイスコンテキストのハンドル
 LPRECT lprc, // 境界の長方形
 UINT uType, // フレームコントロールのタイプ
 UINT uState // フレームコントロールのスタイル
);

パラメータ説明:

hdc
コントロールの描画に使いたいデバイスコンテキストのハンドルを指定します。
lprc
長方形の論理座標を保持する 1 個の RECT 構造体へのポインタを指定します。
uType
フレームコントロールのタイプを指定します。ボタン、メニューやスクロールバーなどを指定します。
uState
フレームコントロールの初期状態を指定します。

uTypeでボタンを指定した場合は、チェックボックスの状態を指定します。

[Delphi] ソースファイルのないパッケージの追加方法

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    6,108
インストール手順
  1. どこか適当なフォルダにアーカイブファイルの中身すべて(*.bpl,*dcu,*resなどがあると思います。)を展開します。
  2. 1で展開した先が $(Delphi)\Lib でない場合、Delphiのライブラリパスの設定が必要です。詳細は、ライブラリパスの追加を参照してください。
  3. Delphiのメニューバーから[コンポーネント|パッケージのインストール]でプロジェクトオプションダイアログボックスを開きます。
    追加ボタンをクリックし、JDBGrids.bpl を選択し、開く、OKの順でボタンをクリックします。

サイトカレンダー

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

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