記事カテゴリ

ユーザー機能


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

[Delphi] 実行時にダイナミックにDLLをロードする

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

以下のサンプルコードは実行時にDLLを動的にロードし、その中のエントリポイントを取得します。
DLLがロードでき、エントリポイントが正常に見つかってその機能を使用できる場合には true を返しますが不幸にもロードできなかった場合にはfalseを返します。
GetModuleHandle、GetProcAddress WindowsAPIを使用して指定した名前のエントリポイントを探していますが、この方法はDelphiがControlユニットなどでIMMを使用するのに使っています。

function FuncAvail(Lib, Func: string; var hnd: THandle; var ptr: 
Pointer): boolean;
begin 
  Result := false;
  hnd := 0;
  if LoadLibrary(PChar(Lib)) = 0 then
  begin
    Exit;
  end;
  hnd := GetModuleHandle(PChar(Lib));
  if (hnd <> 0) then
  begin
    ptr := GetProcAddress(hnd, PChar(Func));
    if (ptr <> nil) then
    begin
      Result := true;
    end;
  end;
end;

[Delphi] キーボードとマウスを使えなくする

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    3,422
Windows2000 / WindowsXP で動作確認しています。
以下のサンプルコードを実行すると、15秒間キーボードとマウスを受け付けなくなります。
以下のサンプルは、USER32.DLL にある BlockInput というエントリポイントの機能を使用しています。
BlockInput は引数に true を与えるとロックを false を与えるとロック解除します。
function FuncAvail(Lib, Func: string; var hnd: THandle; var ptr: Pointer): boolean;
begin
  Result := false;
  hnd := 0;
  if LoadLibrary(PChar(Lib)) = 0 then
  begin
    Exit;
  end;
  hnd := GetModuleHandle(PChar(Lib));
  if (hnd <> 0) then
  begin
    ptr := GetProcAddress(hnd, PChar(Func));
    if (ptr <> nil) then
    begin
      Result := true;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hnd: THandle;
  xBlockInput: function(Block: BOOL): BOOL; stdcall;
begin
  if FuncAvail('USER32.DLL', 'BlockInput', hnd, @xBlockInput) then
  begin 
    xBlockInput(true);
    Sleep(15000);         // 15秒 
    xBlockInput(false); 
    FreeLibrary(hnd);
  end;
end;

[Delphi] TDataSet をカンマ区切り ASCII ファイルにエクスポートする

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    4,132
以下のDataSetToASCII 手続きを使ってASCIIファイルにエクスポートします。
DataSetToASCIIは、TDataSetから指定されたASCIIファイルにレコードをエクスポートします。
フィールドは指定されたデリミタ文字により区切られ、レコードは改行コードによって区切られます。
また引数 QuoteStrings が True の際には、以下の種類のフィールドは単一引用符によって囲われた形で出力されます。
最後に出力しない(したくない)フィールドは、Tag プロパティを0(デフォルト)以外に設定してください。
0以外に設定することでエクスポートの対象外となります。
unit Unit1;

interface

uses
  Db, Classes, Dialogs, SysUtils;

procedure DataSetToASCII(const ADataSet: TDataSet;
  const ASCIIFile: TFileName; const Delimiter: Char;
  const QuoteStrings: Boolean);

implementation

procedure DataSetToASCII(const ADataSet: TDataSet;
  const ASCIIFile: TFileName; const Delimiter: Char;
  const QuoteStrings: Boolean);
var
  i, LastIndex: LongInt;
  AsciiRecord: String;
begin
  with TStringList.Create, ADataSet do
  try
    LastIndex:= Pred(Fields.Count);
    First;
    while not EOF do
    begin
      AsciiRecord:= '';
      for i := 0 to LastIndex do
      begin
        if Fields.Fields[i].Tag = 0 then
        begin
          if (QuoteStrings) and
            (Fields.Fields[i].DataType
            in [ftString, ftMemo, ftFmtMemo, ftFixedChar, ftWideString]) then
          begin
            AsciiRecord := AsciiRecord + AnsiQuotedStr(Fields.Fields[i].AsString);
          end
          else
          begin
            AsciiRecord := AsciiRecord + Fields.Fields[i].AsString;
          end;
          if (i < LastIndex) then AsciiRecord:= AsciiRecord + Delimiter;
        end;
      end;
      Append(AsciiRecord);
      Next;
    end;
    try
      SaveToFile(ASCIIFile)
    except
      ShowMessage('テーブルは指定されたファイル: ' + ASCIIFile + ' にセーブできませんでした。');
    end;
    finally
    Free;
  end;
end;
end.

[Delphi] ファイル情報を取得する

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

以下のサンプルコードを参考にしてください。
このサンプルアプリケーションは、どのようにしてファイル、フォルダ、ドライブの情報を取得するかを提供しています。

サンプルプログラムのダウンロードは→[Delphi FAQ用サンプル] ファイル情報を取得する

[Delphi] メニューのフォントサイズの取得・設定方法

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    9,514
以下のサンプルコードを参考にしてください。
このサンプルアプリケーションは、メニューのフォントサイズの変更方法を示しています。

注意: フォントサイズを変更するとシステム設定である「画面のプロパティ」-「デザイン」のメニューフォントサイズが変更されます。したがって依存しているアプリケーションすべてが 変更されます。
{ メニューフォントサイズの取得 } 
function GetMenuFontSize: integer; 
var 
  ncm: TNonClientMetrics; 
  PixelsPerInch: integer; 
begin 
  ncm.cbSize := sizeof(TNonClientMetrics); 
  SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS),
    @ncm, SPIF_UPDATEINIFILE); 
  PixelsPerInch := GetDeviceCaps(GetDC(0), LOGPIXELSY); 
  Result := -MulDiv(ncm.lfMenuFont.lfHeight, 72, PixelsPerInch); 
end; 

{ メニューフォントサイズの設定 } 
procedure SetMenuFontSize(FontSize: integer); 
var 
  ncm: TNonClientMetrics; 
  PixelsPerInch: Integer; 
begin 
  ncm.cbSize := sizeof(TNonClientMetrics); 
  SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS),
    @ncm, 0); 
  PixelsPerInch := GetDeviceCaps(GetDC(0), LOGPIXELSY); 
  ncm.lfMenuFont.lfHeight := -MulDiv(FontSize, PixelsPerInch, 72); 
  SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS),
    @ncm, SPIF_UPDATEINIFILE); 
end;

サイトカレンダー

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

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