[BCB/Delphi] 再描画に関するメソッド

再描画に関連するメソッド

・Invalidate
  再描画が必要であることを宣言します。実際の再描画は適当なタイミングで実施されます。

・Update
  Invalidateなどで保留中の再描画を強制的に実施します。

・Repaint
  Invalidateを呼び出した後、Updateを呼び出します。強制的に再描画します。

・Refresh
  Repaintと同じです。

|

[BCB,Delphi] RGBとHLSの変換

#include <GraphUtil.hpp>

void __fastcall ColorRGBToHLS(unsigned clrRGB, Word &Hue, Word &Luminance, Word &Saturation);

unsigned __fastcall ColorHLSToRGB(Word Hue, Word Luminance, Word Saturation);

|

[Delphi] 「デスクトップの表示」や「Windows+D」でも最小化されないウインドウの作り方

「デスクトップの表示」や「Windows+D」でも最小化されないウインドウの作り方

constructor TForm1.Create(AOwner: TComponent);
var
  ProgmanHwnd: THandle;
begin
  inherited;
  ProgmanHwnd:=FindWindow('Progman','Program Manager');
  if ProgmanHwnd<>0 then
  begin
    ParentWindow:= ProgmanHwnd;
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
    //前面に表示する
    SetZOrder( True);
end;

|

[Delphi,BCB] アイコンリソースを追加したらアプリのアイコンが変わった!

rcファイルを使ってアイコンリソースをEXEファイルに埋め込んだときに、アプリケーションのメインアイコンが変わってしまうことがあります。これは、Delphi,BCBはリソース名でリソースを並び替えてしまうためにおきる問題です。

解決策としては、Delphi,BCBではメインアイコンをMAINICONの名前で保持していますので、ソートした時に、これよりも後に来るような名前を付けます。例えば、

OREICON  ICON  "aaa.ico"

のような感じです。MよりもOの方がアルファベット順が後になります。

|

[Delphi] マウスホイールに対応する

type
  TForm1 = class(TForm)
  private
   procedure WMMousewheel(var Msg: TMessage); message WM_MOUSEWHEEL;
        :

implemetation

procedure TForm1.WMMousewheel(var Msg: TMessage);
begin
 if (Msg.WParam > 0) then begin
    //奥の方向にホイール
  Sendmessage(○○.Handle, WM_VSCROLL, SB_LINEUP, 0); //or SB_PAGEUP
 end
  else
  begin
    //手前の方向にホイール
  Sendmessage(○○.Handle, WM_VSCROLL, SB_LINEDOWN, 0); //or SB_PAGEDOWN
 end;
end;

|

[Delphi,BCB] StrToIntで例外が発生するのがめんどくさい

StrToIntは文字列を数字に変換するための関数ですが、引数に数字として不正な文字列(例えば「125a」とか)を渡すと例外が発生してしまいます。これをきちんと処理するのが面倒だったり、単純に不正な文字列が渡された場合は-1を返してほしいと思う場合があったりします。そういう時に便利なのがStrToIntDefという関数です。

i:=StrToIntDef(Edit1.Text,-1);

というようにデフォルト値を指定して変換ができます。変換に失敗した場合はデフォルト値が返される仕組みです。例外は発生しません。場合によっては非常に便利な関数です。

|

[Delphi/BCB] manifestファイルをexeに埋め込む

manifestファイルの書き方はこちらを参照してください。

作成したmanifestファイルをexeファイルにリソースとして埋め込む方法です。

#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define CONTROL_PANEL_RESOURCE_ID 123
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "○○.exe.manifest"

これをmanifest.rcというようなファイル名で保存します。なお上記の○○の部分には実行ファイルの名前を書きます。「プロジェクト」-「プロジェクトに追加」で作成したrcファイルをプロジェクトに追加します。

これでコンパイルすればOKです。

|

[Delphi] 独自のリソースを使う

リソースをテキストエディタなど作成して「tmp.rc」というような名前で保存します。そのファイルをプロジェクトに追加してコンパイルします。rcファイルをBRCC32でコンパイルしてresファイルに変換しなくてもOKです。

リソースファイル(*.rc)の中身は

リソース名  リソースタイプ  "ファイル名"

のように書きます。例えば、

MYICON  ICON  "MyIcon.ico"
MYBMP  BITMAP  "MyBmp.bmp"

のようです。

| | コメント (0)

[Delphi] 画面をキャプチャする

procedure TScreenSaverForm.FormCreate(Sender: TObject);
var
  dc:hdc;
begin
  //キャプチャ
  Image1.Picture.Bitmap.width:=screen.Width;
  Image1.Picture.Bitmap.height:=screen.Height;

  dc:=GetDC(0);
  BitBlt(Image1.Picture.Bitmap.Canvas.Handle,0,0,
           Image1.Picture.Bitmap.Width,Image1.Picture.Bitmap.Height,
           dc,0,0,SRCCOPY);
  ReleaseDC(0,dc);
end;

| | コメント (0)

[Delphi/BCB] manifestファイルの書き方

manifestファイルを使うと、アプリケーションの外観を簡単にWindowsXPのスタイルにすることができます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
  version="1.0.0.0"
  processorArchitecture="X86"
  name="CompanyName.ProductName.YourApp"
  type="win32" />
<description>Description</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*" />
    </dependentAssembly>
</dependency>
</assembly>

これを、○○.exe.manifestという名前のファイルに保存します。このとき文字コードはUTF-8にします。○○の部分は実行ファイルの名前を入れます。このファイルを実行ファイルと同じ場所においておけばOKです。

Delphi5の場合は、PageControlなど一部のコンポーネントは、うまくスタイルが変更されません。これらに対応したコンポーネントを作られている方もいるようです。

| | コメント (0)

[Delphi] ImageListからIcon形式で取り出す

var
  TempIcon:TIcon;
begin
  TempIcon:=TIcon.Create;
  ImageList1.GetIcon(2,TempIcon);//インデクスが2の画像を取り出す

  //TempIconにアイコンが格納されている
  //何か処理をする

  //使い終わったらフリー
  TempIcon.Free;
end;

| | コメント (0)

[Delphi] 中間ファイルを使用せずにWebBrowserに直接書き込む

動的にHTMLを生成して表示したい場合は以下のようにします。WebBrowser1.Documentがnilの場合はWebBrowser1.Navigate('about:blank')を呼び出すとWebBrowser1.Documentが作成されます。

uses mshtml;

OLEVariant(WebBrowser1.Document as IHTMLDocument2).Write('<html>aaaa</html>');

| | コメント (0)

[Delphi] WebBrawserに表示されている内容をクリアする

WebBrowserに表示されている内容を消したい場合は以下のようにします。

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('about:blank');
end;

| | コメント (0)

[Delphi] WebBrowserに関連した情報(MSDN)

http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/browser_control_node_entry.asp

| | コメント (0)

[Delphi] WebBrowserをスクロールする

水平方向x、垂直方向yが指定できます。yを0にすると一番上までスクロールされます。

uses mshtml;

OLEVariant(WebBrowser1.Document as IHTMLDocument2).parentWindow.scroll(x, y);

| | コメント (0)

[Delphi] WebBrowser上をプログラムからクリックする

「次へ」のリンクをプログラム内からクリックする場合などに使える方法です。クリックする座標は、WebBrowserの左上を(0,0)としたときの座標で指定します。

uses mshtml;

procedure TForm1.Button1Click(Sender: TObject);
var
  hWB:HWND;
begin
  hWB := FindWindowEx(WebBrowser1.Handle,0,'Shell DocObject View',nil);
  hWB := FindWindowEx(hWB,0,'Internet Explorer_Server',nil);
  if hWB <> 0 then begin 
    //指定した座標をクリック
    SendMessage(hWB,WM_LBUTTONDOWN,0,MakeLParam(570,70)); 
    SendMessage(hWB,WM_LBUTTONUP,0,MakeLParam(570,70));
  end;
end;

| | コメント (0)

[Delphi] WebBrowserからHTMLソースを取得する

uses mshtml;

Memo1.Text:= OLEVariant(WebBrowser1.Document as IHTMLDocument2).Body.InnerHTML;

| | コメント (0)

[Delphi] アプリのフォントをまとめて変更する

 通常、FormやLabelのフォントを変えるときは、コンポーネントをマウスで選択してフォントを変更します。変更するものが少ないときはこれでいいのですが、アプリで使用しているフォントを全部、まとめて変更したいと言うときは、この方法だと、時間がかかりますし、変更もれが出る場合もあります。こういうときは、「*.dfm」ファイルを直接、編集してしまうと楽です。

 dfmファイルはただのテキストファイルですのでメモ帳などで開くことができます。やり方です。

(1) 変更したいフォームの.dfmファイルをメモ帳などで開きます。(例:Unit.dfm)

(2) Font.Name = 'MS Pゴシック'といった行がフォントを指定している場所ですので、これを変更したいフォント名に置換してやります。(例:Font.Name = 'MS ゴシック')
 正規検索の置換がつかえるエディタを使用してFont.Name = '*'に該当する箇所をすべて変換するようにすれば、もれなく変換することが可能です。

この方法は、海外製のソフトを日本語対応に変換したりするときにも使える方法です。

| | コメント (0)

[Delphi] 電源(バッテリ)の状態を取得する

GetSystemPowerStatus関数を使います。この関数はWindows NTでは使用できません。

procedure TForm1.Button1Click(Sender: TObject);
var
 SystemPowerStatus: TSystemPowerStatus;
begin
 GetSystemPowerStatus(SystemPowerStatus);
end;

関数を実行するとTSystemPowerStatus構造体に結果が格納されます。構造体のメンバは以下のとおりです。

ACLineStatusAC電源の状態
BatteryFlagバッテリの充電状態
BatteryLifePercentバッテリの残り(%)
Reserved1未使用(常に0)
BatteryLifeTimeバッテリの残り時間(秒)
BatteryFullLifeTimeフル充電状態での残り時間(秒)

値の意味は以下のとおりです。

ACLineStatus

0オフライン
1オンライン
255不明

BatteryFlag

1残り66%以上
2残り33%以下
4残り5%以下
8充電中
128バッテリはない
255不明

| | コメント (0)

[Delphi] 実数を整数部分と小数部分に分ける

Frac関数、およびInt関数を使用します。

uses System,Math;

var
 J:Extended;
 I:Integer;
 S:Extended;
begin
 J:=1.23;

 I:=Int(J); //整数部分 1
 S:=Frac(J); //小数部分 0.23
end;

| | コメント (0)

[Delphi] TColorにRGB値を代入する

var
 Color : TColor;
begin
 //RGBの引数はR,G,Bの順番
 Color:=RGB(255,0,0);
end;

| | コメント (0)

[Delphi] Memoでキャレット位置に文字列を挿入する

Memo1.SelText:='挿入する文字列';

| | コメント (0)

[Delphi] 画面のサイズを取得する

画面のサイズを取得するにはTScreenのプロパティを使います。

W:=Screen.Width; //画面の幅
H:=Screen.Height; //画面の高

|

[Delphi] FontをIniファイルに保存する

procedure TForm1.ReadFromInifile(IniFilename: String);
var
 ini:TInifile;
 FStyle:TFontStyles;
 Fs :Byte absolute FStyle;
 FPitch:TFontPitch;
 Fp :Byte absolute FPitch;
begin
 ini:=TInifile.Create(IniFilename);
 try
  Fs:= ini.ReadInteger('Option','FontStyle',0);
  Fp:= ini.ReadInteger('Option','FontPitch',0);
  if Fs<>0 then FFont.Style:= FStyle;
  if Fp<>0 then FFont.Pitch:= FPitch;
  FFont.Color:= StringToColor(Ini.ReadString('Option','FontColor','clBlack'));
  FFont.Name := ini.ReadString('Option','FontName','MS ゴシック');
  FFont.Size := ini.ReadInteger('Option','FontSize',13);
  FFont.Charset:=ini.ReadInteger('Option','FontCharset',SHIFTJIS_CHARSET);
 finally
  ini.Free;
 end;
end;

procedure TForm1.WriteToInifile(IniFilename: String);
var
 ini:TInifile;
 FStyle:TFontStyles;
 Fs :Byte absolute FStyle;
 FPitch:TFontPitch;
 Fp :Byte absolute FPitch;
begin
 ini:=TInifile.Create(IniFilename);
 try
  FStyle:=FFont.Style;
  FPitch:=FFont.Pitch;
  ini.WriteInteger('Option','FontStyle',Fs);
  ini.WriteInteger('Option','FontPitch',Fp);
  ini.ReadString('Option','FontColor',ColorToString(FFont.Color));
  ini.WriteString('Option','FontName',FFont.Name);
  ini.WriteInteger('Option','FontSize',FFont.Size);
  ini.WriteInteger('Option','FontCharset',FFont.Charset);
 finally
  ini.Free;
 end;
end;

| | コメント (0)

[Delphi] 仮想キーコードで英数字を扱うには

Ord関数を使います。

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if Key=Ord('K') then begin
  //Kが押されたときの処理
 end;
end;

| | コメント (0)

[Delphi] StatusBarに別のコンポーネントをのせたい

Parentプロパティを設定することでStatusBar上に別のコンポーネントを配置することができます。
Parentプロパティを設定した後は、Top、Leftプロパティを親コンポーネントの左上を(0,0)とした座標系で設定し直す必要があります。

procedure TForm1.FormCreate(Sender: TObject);
begin
 Button1.Parent:=StatusBar1;
 Button1.Top:=0;
 Button1.Left:=0;
end;

| | コメント (0)

[Delphi] Memoで現在カーソルがある行を取得する

戻り値は1行目が0となります。

LineNo:=Memo1.Perform(EM_LINEFROMCHAR, -1, 0);

| | コメント (0)

[Delphi] Memoで左右のマージンを設定する

以下の例では左に10ドット、右に20ドットのマージンを設定します。

Memo1.Perform(EM_SETMARGINS,
   EC_LEFTMARGIN or EC_RIGHTMARGIN,
   MAKELONG(10, 20));

| | コメント (0)

[Delphi] Memoで座標から文字位置へ変換する

マウスカーソルの位置にある文字の位置(先頭からのバイト数)と行番号を表示する例です。

procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
 Res:DWORD;
begin
 //座標から文字位置を取得
 Res := Memo1.Perform(EM_CHARFROMPOS, 0, MAKELONG(X, Y));

 //先頭からのバイト数を表示
 Label1.Caption := IntToStr(LOWORD(Res));
 //行数を表示
 Label2.Caption := IntToStr(HIWORD(Res));
end;

| | コメント (0)

[Delphi] Memoで入力できる文字数を制限する

入力できるバイト数を制限する方法です。以下の例では32Kバイトに制限しています。

Memo1.Perform(EM_SETLIMITTEXT, 32*1024, 0);

| | コメント (0)

[Delphi] MemoやRichEditをスクロールする

プログラムからMemoやRichEditをスクロールさせるには EM_SCROLL を使用します。

 //1ページ上へ
 Memo1.Perform(EM_SCROLL, SB_PAGEUP, 0);
 //1ページ下へ
 Memo1.Perform(EM_SCROLL, SB_PAGEDOWN, 0);
 //1行上へ
 Memo1.Perform(EM_SCROLL, _SB_LINEUP, 0);
 //1行下へ
 Memo1.Perform(EM_SCROLL, SB_LINEDOWN, 0);

EM_LINESCROLLを使用することもできます。

 //水平方向に3文字、垂直方向に2行スクロール
 Memo1.Perform(EM_LINESCROLL, 3, 2);

| | コメント (0)

[Delphi] Memoで現在カーソルがある行までスクロールする

Memo1.Perform(EM_SCROLLCARET, 0, 0);

| | コメント (0)

[Delphi] LabelのCaptionを改行したい

Labelに複数行の文字列を表示する方法です。

 Label1.Caption:='1行目'+#13#10+'2行目';

#13、#10はそれぞれCRコード、LFコードを表します。

| | コメント (0)

[Delphi] Caps Lock、Num Lockの状態を調べる

Caps LockがOnになっているかを調べる例です。

begin
 if (GetKeyState(VK_CAPITAL) and $1 <> 0) then begin
  //Caps LockがOnになっている
 end else begin
  //Caps LockがOffになっている
 end;
end;

VK_CAPITALの代わりにVK_NUMLOCKとすればNum Lockの状態を取得できます。

| | コメント (0)

[Delphi] 仮想キーコード

VK_LBUTTONVK_RBUTTONVK_CANCEL
VK_MBUTTONVK_BACKVK_TAB
VK_CLEARVK_RETURNVK_SHIFT
VK_CONTROLCtrlVK_MENUAltVK_PAUSE
VK_CAPITALVK_KANAVK_HANGUL
VK_JUNJAVK_FINALVK_HANJA
VK_KANJIVK_CONVERTVK_NONCONVERT
VK_ACCEPTVK_MODECHANGEVK_ESCAPE
VK_SPACEVK_PRIORVK_NEXT
VK_ENDVK_HOMEVK_LEFT
VK_UPVK_RIGHTVK_DOWN
VK_SELECTVK_PRINTVK_EXECUTE
VK_SNAPSHOTVK_INSERTVK_DELETE
VK_HELP'0'($30) ~ '9'($39)'A'($41) ~ 'Z'($5A)
VK_LWINVK_RWINVK_APPS
VK_NUMPAD0~VK_NUMPAD9VK_MULTIPLYVK_ADD
VK_SEPARATORVK_SUBTRACTVK_DECIMAL
VK_DIVIDEVK_F1~VK_F24VK_NUMLOCK
VK_SCROLLVK_PROCESSKEYVK_ATTN
VK_CRSELVK_EXSELVK_EREOF
VK_PLAYVK_ZOOMVK_NONAME
VK_PA1VK_OEM_CLEAR 

以下はGetAsyncKeyState() と GetKeyState()で使用するためのキーコード。右と左が区別できる。

VK_LSHIFTVK_RSHIFT
VK_LCONTROLVK_RCONTROL
VK_LMENUVK_RMENU

| | コメント (0)

[Delphi] 2地点の緯度経度から方位を計算する

球面三角法を利用した方位の計算です。

uses Math;

// 引数
//  Lon1 地点1の経度(度)
//  Lat1 地点1の緯度(度)
//  Lon2 地点2の経度(度)
//  Lat2 地点2の緯度(度)
//
//   北緯は0~90度、南緯は-90~0度
//   東経は0~180度、西経は-180~0度
//
// 戻り値
//  地点1から見た地点2の方位(度)
function GetDirection(Lon1:Double; Lat1:Double; Lon2:Double; Lat2:Double):Double;
var
 Lon1Rad, Lat1Rad, Lon2Rad, Lat2Rad:Double;
 LonDiff:Double;
 X,Y:Double;
 Direction:Double;
begin
 //ラジアンに変換
 Lon1Rad := Lon1 * PI / 180;
 Lat1Rad := Lat1 * PI / 180;
 Lon2Rad := Lon2 * PI / 180;
 Lat2Rad := Lat2 * PI / 180;

 LonDiff := Lon2Rad - Lon1Rad;

 Y := Cos(Lat2Rad)*Sin(LonDiff);
 X := Cos(Lat1Rad)*Sin(Lat2Rad) - Sin(Lat1Rad)*Cos(Lat2Rad)*Cos(LonDiff);
 Direction := ArcTan2(Y, X);

 Direction:=Direction*180/PI;
 if Direction < 0 then Direction:=Direction+360;

 Result:=Direction;
end;

| | コメント (0)

[Delphi] 2地点の緯度経度からその間の距離を計算する

Hubenyの簡易式を使用した方法です。

uses Math;

// 引数
//  Lon1 地点1の経度(度)
//  Lat1 地点1の緯度(度)
//  Lon2 地点2の経度(度)
//  Lat2 地点2の緯度(度)
//
//   北緯は0~90度、南緯は-90~0度
//   東経は0~180度、西経は-180~0度
//
// 戻り値
//  2地点間の距離(km)
function GetHubenyDistance(Lon1:Double; Lat1:Double; Lon2:Double; Lat2:Double):Double;
var
 Lon1Rad, Lat1Rad, Lon2Rad, Lat2Rad:Double;
 LatAveRad, LatDiff, LonDiff:Double;
 Meridian, PrimeVertical:Double;
 X,Y:Double;
begin
 //ラジアンに変換
 Lon1Rad := Lon1 * PI / 180;
 Lat1Rad := Lat1 * PI / 180;
 Lon2Rad := Lon2 * PI / 180;
 Lat2Rad := Lat2 * PI / 180;

 LatAveRad := (Lat1Rad + Lat2Rad) / 2;
 LatDiff := Lat1Rad - Lat2Rad;
 LonDiff := Lon1Rad - Lon2Rad;

 //子午線曲率半径
 Meridian := 6334834 / Sqrt(Power(1 - 0.006674*Sin(LatAveRad)*Sin(LatAveRad),3));
 //卯酉線曲率半径
 PrimeVertical := 6377397 / Sqrt(1 - 0.006674*Sin(LatAveRad)*Sin(LatAveRad));

 //ヒュベニの公式
 X := Meridian*LatDiff;
 Y := PrimeVertical*Cos(LatAveRad)*LonDiff;

 Result := Sqrt(X*X + Y*Y);
end;

| | コメント (0)

[Delphi] 修正ユリウス通日と年月日の変換

uses Math;

//年月日から修正ユリウス通日へ
function YMD2MJD(y,m,d:Integer):Integer;
begin
 if (m = 1) or (m = 2) then begin
  y:=y-1;
  m:=m+12;
 end;
 //フリーゲルの公式
 Result:=Floor(365.25*y) + (y div 400) - (y div 100) + Floor(30.59*(m-2)) + d -678912;
end;

//修正ユリウス通日から年月日へ
procedure MJD2YMD(mjd:Integer; var y,m,d:Integer);
var
 k:Integer;
begin
 y := Floor( (mjd - 15078.2) / 365.25 );
 m := Floor((mjd - 14956.1 - Floor(y*365.25)) / 30.6001 );
 d := mjd - 14956 - Floor(y*365.25) - Floor(m*30.6001);
 If (m = 14) or (m = 15) then k := 1
 else k := 0;
 y := y + k + 1900;
 m := m - 1 - k*12;
end;

ユリウス通日は紀元前4713年1月1日からの経過日数を表します。修正ユリウス通日はユリウス通日から2400000.5引いたものでMJD(Modified Julian Day)と略されます。ユリウス通日は2つの日付間の日数を計算したりするの使えます。とはいっても、標準で用意されている関数があるのでわざわざ実装することはないと思いますが。ご参考まで。 

| | コメント (0)

[Delphi] 起動引数を取得する

起動引数をListBoxに一覧表示する例です。

var
 i:Integer;
begin
 for i:=1 to ParamCount do begin
  ListBox1.Items.Add(ParamStr(i));
 end;
end;

ParamCountは引数の数で、ParamStr(i) で実際の引数が取得できます。ParamStr(0) はアプリケーション自身のファイル名で、ParamStr(1) が1つ目の引数になります。

| | コメント (0)

[Delphi] キーが押されているか調べる

あるキーが押されているかどうかは GetKeyState 関数を使います。引数には仮想キーコードを渡します。キーが押されている場合は戻り値の最上位1ビットが1にセットされます。 Caps Lockなどトグルするキーの状態は最下位の1ビットを調べます。

begin
 if (GetKeyState(VK_F1) < 0) then begin
  //キーが押されているときの処理
 end;
end;

まさにそのとき、キーが押されているかを取得するにはGetAsyncKeyStateを使ったほうがよいかもしれません。

| | コメント (0)

[Delphi] コントロールパネルを表示する

コントロールパネルを表示するには以下のようにします。

WinExec('control.exe', SW_SHOW);

さらに、コントロールパネル内の「マウスのプロパティ」を表示したいときは、

WinExec('control.exe main.cpl',SW_SHOW);

とします。 ほかにもmain.cplの部分を書き換えることでいろいろな設定ダイアログが表示できます。

WindowsXPの例

access.cplユーザ補助のオプション
appwiz.cplプログラムの追加と削除
bthprops.cplBluetooth
desk.cpl画面のプロパティ
firewall.cplWindowsファイアウォール
hdwwiz.cplハードウェアの追加ウィザード
inetcpl.cplインターネットのプロパティ
irprops.cplワイヤレスリンク
joy.cplゲームコントローラ
main.cplマウスのプロパティ
mmsys.cplサウンドとオーディオデバイスのプロパティ
netsetup.cplネットワークセットアップウィザード
nusrmgr.cplユーザアカウント
powercfg.cpl電源オプションのプロパティ
sysdm.cplシステムのプロパティ
telephon.cpl電話とモデムのオプション
timedate.cpl日付と時刻のプロパティ
wscui.cplWindowsセキュリティセンター
wuaucpl.cpl自動更新

| | コメント (0)

[Delphi] INIファイルの読み書き

INIファイルを読み書きするにはTIniFileクラスを使うと便利です。

uses IniFiles;

procedure TForm1.Button1Click(Sender: TObject);
var
 ini:TIniFile;
 Str:String;
begin
 ini:=TIniFile.Create('test.ini');
 try
  //INIファイルから文字列を読み込む
  ini.ReadString:=('Section','TestFile','C:\tmp\tmp.txt');
 finally
  ini.Free;
 end;
end;

値を読む

ReadString文字列値
ReadBool論理値
ReadDate日付値
ReadTime時刻値
ReadDateTime日付時刻値
ReadFloat浮動小数点値
ReadInteger整数値

値を書く

WriteString文字列値
WriteBool論理値
WriteDate日付値
WriteTime時刻値
WriteDateTime日付時刻値
WriteFloat浮動小数点値
WriteInteger整数値

管理

ValueExistsデータが存在するか
SectionExistsセクションが存在するか
DeleteKeyデータを削除
EraseSectionセクションをすべて削除
ReadSectionsすべてのセクション名を読み出す
ReadSectionセクション内にあるすべてのキー名を読み出す
ReadSectionValuesセクション内にあるすべてのキーと値を読み出す

| | コメント (0)

[Delphi] シャットダウンダイアログを表示する

タスクバーを閉じるとシャットダウンのダイアログが表示されます。

provedure TForm1.ShutdownWindows;
var
 h : HWND;
begin
 h := FindWindow('Shell_TrayWnd', nil); //タスクバーのハンドルを取得
 SendMessage(h, WM_CLOSE, 0, 0);
end;

| | コメント (0)

[Delphi] 動的に配列を作成する

var
 Arry: array of Char; //1次元配列
 Arry2: array of array of Char; //2次元配列
begin
 //1次元配列の場合
 SetLength(Arry, 256);

 //2次元配列の場合
 SetLength(Arry2, 30);
 SetLength(Arry2[0], 100);
 SetLength(Arry2[1], 100);
end;

| | コメント (0)

[Delphi] ひらがなとカタカナを変換

//ひらがなからカタカナ
function TForm1.HiraToKata(Str : String) : String;
var
 Buf:array [0 .. 1023] of Char;
begin
 LCMapString(GetUserDefaultLCID, LCMAP_KATAKANA, PChar(Str), Length(Str)+1, Buf, 1024);
 Result:=String(Buf);
end;

//カタカナからひらがな
function TForm1.KataToHira(Str : String) : String;
var
 Buf:array [0 .. 1023] of Char;
begin
 LCMapString(GetUserDefaultLCID, LCMAP_HIRAGANA, PChar(Str), Length(Str)+1, Buf, 1024);
 Result:=String(Buf);
end;

| | コメント (0)

[Delphi] 半角と全角を変換する

//半角から全角
function TForm1.HanToZen(Str : String) : String;
var
 Buf:array [0 .. 1023] of Char;
begin
 LCMapString(GetUserDefaultLCID, LCMAP_FULLWIDTH, PChar(Str), Length(Str)+1, Buf, 1024);
 Result:=String(Buf);
end;

//全角から半角
function TForm1.ZenToHan(Str : String) : String;
var
 Buf:array [0 .. 1023] of Char;
begin
 LCMapString(GetUserDefaultLCID, LCMAP_HALFWIDTH, PChar(Str), Length(Str)+1, Buf, 1024);
 Result:=String(Buf);
end;

| | コメント (0)

[Delphi] 文字が全角か半角か調べる

//'ああああ'の3バイト目を調べる例
case ByteType('ああああ',3) of
 mbSingleByte: Lable1.Caption:='半角です';
 mbLeadByte: Lable1.Caption:='全角の1バイト目です';
 mbTrailByte: Label1.Caption:='全角の2バイト目です';
end;

全角1バイト目の文字集合であるLeadBytesを利用する方法もあります。

Str:='aああ';
if (Str[3] in LeadBytes) then Label1.Caption:='全角の1バイト目です';

| | コメント (0)

[Delphi] ListBoxをスクロールさせる

ListBoxのTopIndexプロパティを設定します。
TopIndexプロパティを使うと、リストボックスの一番上に表示したい項目を設定することができます。

| | コメント (0)

[Delphi] ListBoxに横スクロールバーをつける

ListBoxに横スクロールバーを表示する例です。ListBoxの中で一番、幅の長いアイテムを見つけてから、それにあわせて横スクロールバーを表示しています。

procedure TForm1.Button1Click(Sender: TObject);
var
 i:Integer;
 MaxWidth:Integer;
 TextWidth:Integer;
begin
 //一番、幅の長い文字列を調べる
 MaxWidth:=0;
 for i:=0 to ListBox1.Items.Count-1 do begin
  TextWidth:=ListBox1.Canvas.TextWidth(ListBox1.Items[i]);
  if (MaxWidth < TextWidth) then MaxWidth:=TextWidth;
 end;

 //横スクロールバーを表示
 ListBox1.Perform (LB_SETHORIZONTALEXTENT, MaxWidth+10, 0);
end;

| | コメント (0)

[Delphi] 文字列を表示するのに必要な幅や高さが知りたい

CanvasのTextWidthメソッドを使うと、その文字列を表示するために必要な幅がわかります。同じようにCanvasのTextHeightメソッドで表示するのに必要な高さがわかります。

TextWidth:=Form1.Canvas.TextWidth('aaaああああ');
TextHeight:=Form1.Canvas.TextHeight('aaaああああ');

| | コメント (0)

[Delphi] ProgressBarの色を変える

以下のようにするとProgressBarのバーの部分の色が変えられます。

uses CommCtrl;

procedure TForm1.FormCreate(Sender: TObject);
begin
 SendMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, clTeal);
 //SendMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, RGB(255,255,0));
end;

| | コメント (0)

[Delphi] ファイル名をドライブ、パス、ファイル名に分解

uses FileCtrl;

var
 Drive:Char;
 DirPart:String;
 FilePart:String;
begin
 ProcessPath(Application.ExeName,Drive,DirPart,FilePart);
end;

とすると各変数には次のような値が入る

Drive:'C'
DirPart:'\Program Files\Delphi5\Projects'
FilePart:'Project1.exe'

| | コメント (0)

[Delphi] ファイル名が決められた幅に収まるようにしたい

Formのキャプションにファイル名を表示するときなどに、Formの幅にうまく収まるように表示させたいときがあります。そういうときは以下の関数を使います。

uses FileCtrl;
Label1.Caption:=MinimizeName(Application.ExeName,Canvas,200);

とするとラベルには以下のように表示されます。

C:\...\Delphi5\Projects\Project1.exe

| | コメント (0)

[Delphi] フォルダ選択ダイアログを表示する

uses FileCtrl;

var
 Str:String;
begin
 if SelectDirectory('フォルダを選択してください','',Str) then begin
  //Strに選択されたフォルダ名がはいっている
 end
end

| | コメント (0)

[Delphi] フォルダが存在するか調べる

if DirectoryExists(Filename) then begin
 //フォルダが存在したときの処理
end;

| | コメント (0)

[Delphi] ファイルが存在するか調べる

if FileExists(Filename) then begin
 //ファイルが存在したときの処理
end;

| | コメント (0)

[Delphi] ファイル名からフォルダ部分だけを取り出す

FileDir:=IncludeTrailingBackSlash(ExtractFilePath(Filename));

IncludeTrailingBackSlashを使うと必ず末尾が\になるようにできます。

Delphi6以降ではIncludeTrailingBackSlashの代わりにIncludeTrailingPathDelimiterを使うようにします。IncludeTrailingPathDelimiterはWindows では '\",Linux では '/'でパス名が終わるようにしてくれます。

FileDir:=IncludeTrailingPathDelimiter(ExtractFilePath(Filename));

| | コメント (0)

[Delphi] 知っていると便利なIDEのショートカット その2

Delphi 5 です。

エディタ(デフォルト設定)

Ctrl+Eインクリメンタルサーチ
Ctrl+F検索
Ctrl+R置換
Ctrl+T1語を削除する
Ctrl+Y1行を削除する
Ctrl+Spaceコード補完ポップアップ
Ctrl+Shift+↑宣言にジャンプ
Ctrl+Shift+↓コードにジャンプ
Ctrl+Shift+C宣言やコードを補完(すごく便利)
Ctrl+Shift+GGUIDを挿入
Ctrl+Shift+Y行の終わりまで削除
Ctrl+Shift+Spaceパラメータポップアップ
Alt+[、]対応する区切り記号を探す
Ctrl+O+Aカーソル位置のファイルを開く
Ctrl+O+G指定行に移動
Ctrl+O+U大文字と小文字を切り替え

システム(デフォルト設定)

F1ヘルプ
F4カーソル位置まで実行
F5ブレークポイントの追加
F7トレース実行
F8ステップ実行
F9実行
F11オブジェクトインスペクタ
F12フォーム/ユニット切り替え
Alt+0ウィンドウの一覧
Alt+F2デバッグ CPU
Alt+F11ユニットを使う
Ctrl+F2プログラムの終了
Ctrl+F9コンパイル
Ctrl+F11プロジェクトを開く
Shift+F11プロジェクトに追加

| | コメント (0)

[Delphi] 知っていると便利なIDEのショートカット

Delphi 5 です。

フォームのデザイン

Ctrl+矢印キー 1 ピクセルだけ移動
Shift+矢印キー1 ピクセルだけサイズを変更
Ctrl+Shift+矢印キー1 グリッドだけ移動
F12フォームとユニットファイルを切り替え
Ctrl+F12「ユニットの表示」ダイアログを表示
Shift+F12「フォームの表示」ダイアログを表示
Enter「オブジェクトインスペクタ」にフォーカスが移動

オブジェクトインスペクタ

Tabオブジェクトインスペクタでプロパティ列と値列を切り替え
Tab+英字その英字で始まる最初のプロパティにジャンプ
Ctrl+Tabプロパティタブとイベントタブを切り替え
Alt+↓プロパティのドロップダウンリストを開く
Ctrl+↓オブジェクトのドロップダウンリストを開く
Ctrl+Enter[...]ボタンを選択

| | コメント (0)

[Delphi] Delphi Directを表示したくない

「ツール」-「環境オプション」の「Delphi Direct」タブで
 「ネットワーク経由で自動的に確認を行う」のチェックを外す

| | コメント (0)

[Delphi] フォームを最前面に表示する

//最前面に表示する
SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE);

//普通に戻す
SetWindowPos(Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE);

FormStyleによって最前面にするとちらつくが、上記の方法だとちらつかずにできる。

| | コメント (0)

[Delphi] Wavを鳴らす

uses MMSystem;

SndPlaySound('test.wav',SND_ASYNC);

| | コメント (0)

[BCB] StringGridで追加した行がちょうどいいとこに表示されるように

for (int i=0;i<100;i++) {
 StringGrid1->RowCount=i+1; //行を追加
 StringGrid1->Cells[0][i]=IntToStr(i); //適当にデータを入れる

 //いいところにスクロール
 StringGrid1->TopRow=StringGrid1->RowCount-StringGrid1->VisibleRowCount;
}

TStringGrid::TopRowは表示画面で一番上に表示されている行のインデックスを表します。ここで一番上というのはスクロールできない固定行は除いて一番上の行という意味です。 またTStringGrid::VisibleRowCountは画面上に表示されている行のうち、スクロールできない固定行は除いた行数を表します。

| | コメント (0)

[Delphi] エクスプローラからのDrag & Dropに対応する

type
 TForm1 = class(TForm)
  procedure FormShow(Sender: TObject);
  procedure FormCreate(Sender: TObject);
 private
{ Private 宣言 }
  procedure Nantoka(Filename:String);
  procedure WMDropFiles(var Msg: TWMDropFiles); Message WM_DropFiles;
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
 FileName: Array[0..MAX_PATH] of Char;
begin
 DragQueryFile(Msg.Drop, 0, FileName, SizeOf(FileName));
 Nanntoka(String(FileName));
 DragFinish(Msg.Drop);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
 if ParamCount<>0 then Nantoka(ParamStr(1));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 DragAcceptFiles(Form1.Handle, True);
end;

| | コメント (0)

[Delphi] 外部プロセスを起動する

var
HAPP:HWND; //起動したアプリケーションのハンドルを保持する

function EnumWindowsProc(HWND:THandle; lParam:LongInt) : BOOL; stdcall;
var
 dwProcessID:Integer;
begin
 Result:=True;
 if (GetWindow(HWND,GW_OWNER)=0) and IsWindowVisible(HWND) then begin
  GetWindowThreadProcessID(HWND,@dwProcessID);
  if (dwProcessID=lParam) then begin
   HAPP:=HWND;
   Result:=False;
  end;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 si:TStartupInfo;
 pi:TProcessInformation;
begin
 GetStartupInfo(si);
 CreateProcess(nil,PChar('Notepad.exe'),nil,nil,False,
    CREATE_DEFAULT_ERROR_MODE,nil,PChar(GetCurrentDir),si,pi);

 WaitForInputIdle(pi.hProcess,INFINITE);

 EnumWindows(@EnumWindowsProc,pi.dwProcessID);
end;

| | コメント (0)

[Delphi] Formを最背面に表示する

type
 TForm1 = class(TForm)
  procedure FormActivate(Sender: TObject);
 private
  { Private 宣言 }
 public
  { Public 宣言 }
  procedure WMWindowPosChanging(var Msg : TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormActivate(Sender: TObject);
begin
 SetWindowPos(Handle,HWND_BOTTOM,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);
end;

procedure TForm1.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
begin
 Msg.WindowPos.hwndInsertAfter:=HWND_BOTTOM;
end;

end.

| | コメント (0)

[Delphi] 搭載されているメモリ量を取得

function TForm1.GetAvailableMemory: String;
var
 ms:TMemoryStatus;
begin
 ms.dwLength:=SizeOf(TMemoryStatus);
 GlobalMemoryStatus(ms);
 Result:=IntToStr(ms.dwTotalPhys);
end;

TMemoryStatusには、以下のような値が格納されています。

dwLength構造体のサイズ
dwMemoryLoad利用中のメモリの割合
dwTotalPhys物理メモリのバイト数
dwAvailPhys物理メモリの空きバイト数
dwTotalPageFileページングファイルのバイト数
dwAvailPageFileページングファイルの空きバイト数
dwTotalVirtualアドレス空間のユーザバイト数
dwAvailVirtual空きユーザバイト数

| | コメント (0)

[Delphi] JpegとBmpの変換

use節にJpegを追加

uses Jpeg;

//BmpからJpeg
procedure TForm1.Button1Click(Sender: TObject);
Var
Jpg : TJpegImage;
Bmp : TBitMap ;
begin
 Jpg :=TJpegImage.Create;
 Bmp :=TBitmap.Create;

 Bmp.LoadFromFile('C:\From.bmp');
 Jpg.Assign(BMP);
 Jpg.SaveToFile('C:\To.jpg' );

 Bmp.Free ;
 Jpg.Free;
end;

//JpegからBmp
procedure TForm1.Button1Click(Sender: TObject);
var
 Jpg : TJpegImage; 
 Bmp : TBitmap;
begin
 Jpg :=TJpegImage.Create ;
 Bmp :=TBitmap.Create;

 Jpg.LoadFromFile('From.jpg');
 Bmp.Assign(JPG);
 Bmp.SaveToFile('To.bmp')

 Jpg.Free;
 Bmp.Free ;
end;

| | コメント (0)