記事カテゴリ

ユーザー機能


 2024年4月20日(土) 12:09 JST

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

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

つい最近まで実行中のアプリケーションやフォームのハンドルなどを取得するには、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,109

リストやグリッドにボタンチェックボックスを 表示したいと考えたことはないですか?
私はグリッドにボタンとチェックボックスの両方を付け加えました。ダウンロードしていただいた方々の中から数人の方が描画方法について質問されましたので、ここで解説したいと思います。 ボタンチェックボックスを描画するには、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,115
インストール手順
  1. どこか適当なフォルダにアーカイブファイルの中身すべて(*.bpl,*dcu,*resなどがあると思います。)を展開します。
  2. 1で展開した先が $(Delphi)\Lib でない場合、Delphiのライブラリパスの設定が必要です。詳細は、ライブラリパスの追加を参照してください。
  3. Delphiのメニューバーから[コンポーネント|パッケージのインストール]でプロジェクトオプションダイアログボックスを開きます。
    追加ボタンをクリックし、JDBGrids.bpl を選択し、開く、OKの順でボタンをクリックします。

[Delphi] FindFirst、FindNext中に追加されたファイルは見けることができる?

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    7,116
ディレクトリ中のファイルの一覧を取得するには、FindFirst、FindNext 関数を使ってリストアップします。 このときファイルは辞書順にファイルを見つけるようです。
ところでこの関数でファイルを検索中に追加されたファイルは、FindNext 関数で見つけ出すことができるでしょうか?テストの結果、FindFirst 関数を実行後に追加されたファイルは見つけることができませんでした。 どうやら FindFirst 関数実行時にリストを作成し、その後 FindNext 関数でそのリストを読み出して返しているのではないかと想像できます。 もしかしたら、EnumWindow API や、WNetEnumResource API も WNetOpenEnum API 以降に追加されたリソースは発見できないかもしれません。

[Delphi] フォームの OnCreate イベントや OnShow イベント中にクローズさせる

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

フォームの OnCretae イベントや OnShow イベントでは、Close メソッドをコールしても、クローズさせることはできません。
原因は、OnCreate イベントの段階では、まだメッセージループが開始されていないからということのようです。
これらのイベント中で、クローズさせたい場合には、下記のように記述します。

PostMessage(Handle, WM_CLOSE, 0, 0);

こうすることで現在実行中のイベント終了後、クローズしてくれるようになります。
ですから厳密にはイベント中ではありません。でもやりたいことはだいたいできると思います。

ボーランドの公式回答では、raise で処理するとのことです。

□CodeGearのホームページ
http://www.codegear.com/

□CodeGearのサポートページ
http://support.codegear.com/

□CodeGearの旧Delphi FAQサイト
http://support.codegear.com/article/37355

□該当の公式回答 - Form の OnCreate の処理中に中断
http://support.codegear.com/article/37355#37355_tocentry18


サイトカレンダー

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

2024年 04月
«
»
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

新着情報

記事 新着(24時間)

-

コメント 新着(2日)

-

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

-

リンク 新着(2週)

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

ファイル (14日)