フリーソフト

« 2006年1月 | トップページ | 2006年3月 »

[BCB] Windowsのメッセージを処理する

BCBでWindowsのメッセージを捕まえて処理をする場合の書き方です。

class TForm1 : public TForm
{
    :

private:
    //実際にメッセージを処理する関数の宣言
    //関数の中身はソースに自分で書く
    void __fastcall WMDropFile(TWMDropFiles &Msg);


BEGIN_MESSAGE_MAP
    //捕まえたいメッセージと、それを処理する関数を登録
    VCL_MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFile)
END_MESSAGE_MAP(TComponent)

};

[BCB] ディレクトリが存在するか調べる(Unicode版)

引数に指定されたディレクトリが存在するかを調べる関数です。ユニコードファイル名に対応しています。

bool __fastcall DirectoryExistsW(WideString WFilename)
{
  WIN32_FIND_DATAW FindFileData;
  HANDLE hFind;

  hFind = FindFirstFileW(WFilename.c_bstr(), &FindFileData);

  if (hFind != INVALID_HANDLE_VALUE) {
    // 検索ハンドルをクローズ
    FindClose(hFind);
    if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) return true;
  }
  return false;
}

[BCB] ファイルが存在するか調べる(Unicode版)

引数に指定されたファイル名(ディレクトリも含む)が存在するかを調べる関数です。ユニコードファイル名に対応しています。

bool __fastcall FileExistsW(WideString WFilename)
{
  WIN32_FIND_DATAW FindFileData;
  HANDLE hFind;

  hFind = FindFirstFileW(WFilename.c_bstr(), &FindFileData);

  if (hFind != INVALID_HANDLE_VALUE) {
    // 検索ハンドルをクローズ
    FindClose(hFind);
    return true;
  }
  return false;
}

[BCB] システムのフォントを取得

システムメニューやボタンなどで使用されるフォントを取得する方法です。以下は、システムのGUIで使用されるフォントを取得する例です。

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  HFONT hFont;
  TLogFont LogFont;
 
  hFont=GetStockObject(DEFAULT_GUI_FONT);
  GetObject(hFont,sizeof(LogFont),&LogFont);
}

DEFAULT_GUI_FONTの部分には、以下の値を指定することもできます。

  OEM_FIXED_FONT = 10;
  ANSI_FIXED_FONT = 11;
  ANSI_VAR_FONT = 12;
  SYSTEM_FONT = 13;
  DEVICE_DEFAULT_FONT = 14;
  DEFAULT_PALETTE = 15;
  SYSTEM_FIXED_FONT = 16;
  DEFAULT_GUI_FONT = 17;

[BCB] コンポーネントの継承元(祖先)を判定する

Form上のコンポーネントのうち、ある特定のクラスから派生しているものだけに対して処理をしたい場合に使えるテクニックです。以下は、TControlから派生したクラスに対してのみ処理をする場合の例です。

  for (int i=0;i<ComponentCount;i++) {
    if (Components[i]->InheritsFrom(__classid(TControl))) {
      TControl *Ctrl=(TControl *)Components[i];
      
      //何か処理をする
    }
  }

[BCB] デスクトップ作業領域の矩形を取得

TRect WorkAreaRect;

SystemParametersInfo( SPI_GETWORKAREA, 0, &WorkAreaRect, 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など一部のコンポーネントは、うまくスタイルが変更されません。これらに対応したコンポーネントを作られている方もいるようです。

[BCB] TrackBarの白い部分を消す

[ヘッダ]

class TMyTrackBar: public TTrackBar
{
public:
  __fastcall TMyTrackBar(TComponent* Owner);
  void __fastcall CreateParams(TCreateParams &Params);
};

[ソース]

//

[BCB] HTML Helpを扱う

マイクロソフトのホームページからダウンロードできるHTML Help WorkshopにはプログラムからHTML Helpを扱うためのライブラリファイル(htmlhelp.lib)が付属していますが、BCBではそのまま使うことはできません。次のようにしてhhctrl.ocxからBCB用のライブラリファイルを作成します。

implib htmlhelp.lib hhctrl.ocx

BCBのプロジェクトに、作成したhtmlhelp.libと、Workshopに付属しているヘッダファイルhtmlhelp.hを追加します。

FormのOnCreateとOnCloseに下記のようなコードを書きます。

//

[BCB] ListViewのコラムをクリックでソート

ListViewのコラムをクリックした時に、その列をキーに内容をソートする方法です。ListViewのViewStyleはvsReport、ShowColumnHeaderはtrueに設定されているとします。

クリックされた列の番号を保持しておく変数を用意しておきます。

  :
private
  int FColumnToSort;
  :
};

ListViewのOnColumnClickとOnCompareを使います。またTagプロパティは、コラムをクリックするたびに、ソートの方向(昇順か降順か)を反転するために使っています。

void __fastcall TForm1::ListView1ColumnClick(TObject *Sender,
      TListColumn *Column)
{
  FColumnToSort = Column->Index;
  ((TCustomListView *)Sender)->AlphaSort();

  //ソートの方向を切り替える 昇順、降順
  if (FColumnToSort==0)
    ListView1->Tag=(ListView1->Tag==1)?0:1;
  else
    ListView1->Columns->Items[FColumnToSort-1]->Tag=
      (ListView1->Columns->Items[FColumnToSort-1]->Tag==1)?0:1;
}
//

[BCB] 相対パスと絶対パスの変換

相対パスから絶対パスへの変換はExpandFileName。
絶対パスから相対パスへの変換はExtractRelativePath。

これらの関数を使用する前には、SetCurrentDirでベースとなるディレクトリを設定する必要がある。

AnsiString AppDir=ExtractFilePath(Application->ExeName);
if (SetCurrentDir(AppDir)) {
  Label1->Caption=ExpandFileName("../../test.txt");
}

[BCB] TSplitterでsnapされた状態で起動したい

TSplitterにおいてAutoSnapをTrueにすると、コンポーネントのサイズがMinSize以下となったときにサイズを0にしてくれます。このSnapされた状態で起動する方法です。

Panel1を見えない状態で起動する例です。

  Panel1->Height=1;
  Splitter1->Perform(WM_LBUTTONDOWN,0,0);
  Splitter1->Perform(WM_MOUSEMOVE,MK_LBUTTON|MK_MBUTTON,0);
  Splitter1->Perform(WM_LBUTTONUP,0,0);

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

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

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

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

実行ファイルを圧縮、暗号化するソフト

UPX http://upx.sourceforge.net/

有名な圧縮ソフト。Windowsの実行ファイル(EXE)やDLLに加え、Linuxの実行ファイルも圧縮できる。コマンドライン形式なので、いろいろ使いやすくするためのソフトがある。

UPX Shell http://sourceforge.net/projects/upxshell/ 

UPXのGUIソフト。ドラッグ&ドロップで実行ファイルの圧縮、解凍ができる。

UPX-iT http://www.codeplace.de/ 

UPXのGUIソフト。

UPX 日本語frontend http://www.urikire.net/

日本語で使えるUPXのGUIソフト。

ASPack http://www.aspack.com/

実行ファイルやライブラリを圧縮するソフト。

PECompact (Student version) http://www.bitsum.com/pec2.asp

実行ファイルやライブラリを圧縮するソフト。個人での利用は無料。

PEiD http://peid.has.it/

実行ファイルを暗号化するソフト。

Telock http://www.softpedia.com/

実行ファイルの暗号化と圧縮をするソフト。

XTea Encoder for Delphi http://www.irnis.net/soft/xted/

Delphiによる開発で使うソフト。プログラム内で使用する文字列を暗号化するときに使う。使い方は、隠したい文字列を、あらかじめこのソフトを使って暗号化し(このとき暗号化のための鍵を設定する)ておく。プログラムでは、この暗号化された文字列と鍵を、複合化関数に渡して複合化し変数に代入する、というようなコードを書く。

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

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

uses mshtml;

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

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

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

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

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

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

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

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

uses mshtml;

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

[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;

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

uses mshtml;

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

SyncBackを勝手に日本語化

フォルダ間の同期をとるソフトSyncBackを日本語化しました。インストールの仕方はアーカイブ内のテキストを参照ください。

注意 これは私が勝手に翻訳した非公式版です。もしかしたら訳が間違っているかもしれません。損害が発生しても責任は負えませんので自己責任でお願いします。


ダウンロード SyncBack_Jp.zip (46.7K)

フォルダ間の同期をとるソフト

フォルダ間の同期をとるソフトをいろいろ試してみたときのメモです。私の独断と偏見で書いていますので、ご参考程度にどうぞ。
ちなみに星の数は機能の多さではなく、総合的な気に入り度です。


Sync Toy 1.0  ★☆☆☆☆

マイクロソフト製の同期ソフト。無料でダウンロードできる。

いい点: 2つのフォルダをフォルダペアとして登録して、そのフォルダ間の関係をどのような状態に保つか5種類の中から選ぶ。設定自体はウィザード形式で非常に簡単にできる。実行前に、どのファイルがコピー、削除されるのかをプレビューすることも可能。フィルタなど細かい設定もでき、機能は一通りそろっている。

悪い点: メニューは英語のみ。間違えて大事なファイルを消しそうでちょっと心配。マイドキュメント内に勝手にフォルダを作って設定ファイルを保存する。保存場所は変えることができない。同期をとるフォルダにも隠しファイルを勝手に作る。まだ動作が不安定。2日間くらいしか使ってないが、例外が発生したり、同期処理もエラーで失敗したりした。ソフト上から設定ファイルが消せなくなったりもした。

結果: いまいち。2日くらい使ってアンインストールした。


Allway Sync 3.2.8  ★★★☆☆

海外製の同期ソフト。多くの言語に対応しており日本語メニューもOK。フリーソフト。シェアのプロ版もあり。

いい点: 画面上部に転送先と転送元フォルダ名が表示され、その間に矢印が表示されている。矢印は転送先向き、転送元向き、両方向きの3種類。どの方向にファイル変更が反映されるのかが見た目に分かりやすい。実行中もどのファイルが処理されているのか一覧で見やすい。プレビュー機能や包含、除外フィルタなど一通りの機能がついている。

悪い点: 同期をとるフォルダに隠しファイルを勝手に作る。一覧表示のページを変える操作がちょっとめんどくさい。画面デザインは好みが分かれるかもしれない。

結果: しばらく使ってみた感じでは落ちることもなく安定していたが、何となく、しっくりこなかった。一般的にはかなりいいソフトだと思う。


Real Sync 1.93  ★★★☆☆

日本製のフリーソフト。他の3つと比べると、機能は一番少ないがシンプルで軽量。少し前まで使っていた。

いい点: シンプル。インストールも展開するだけで、レジストリも使用しない。設定もややこしくないので気軽に使い始められる。

悪い点: プレビュー機能がないので実行するまでどのファイルが更新されるのか分からない。機能が少ないので、ちょっと細かいことを設定がしたくてもできない。たくさんのフォルダの組を登録すると、どれがどれだか分からなくなってしまう。他のソフトはそれぞれに分かりやすく名前が付けられたりする。

結果: けっこう気に入っている。気軽に使えていい。最初はとりあえずこのソフトを使って、機能が足りなくなったら、高機能なソフトに移行したらいいと思う。


SyncBack 3.2.9  ★★★★★

海外製のソフト。かなり細かな設定ができる。これがフリーソフトとはちょっと驚き。シェアの高機能版もある。

いい点: 高機能。FTPサーバー上のフォルダと同期したり、転送先をZIP圧縮したりできる。また、ファイルを更新日時やサイズだけではなくハッシュで比較したり、コピー後にベリファイしたりもできる。その他にも、たくさん機能がある。機能は多いが、簡易設定画面も用意されているのでそれほど難しくない。細かい設定をしようと思えばできる、という感じ。同期処理にかかる時間も他のソフトにくらべ速いような気がする。

悪い点: メニューが英語。参考となりそうな日本語の解説ページもあまりない。

結果: 今のところ一番気に入っている。このソフトをしばらく使ってみようと思う。

私が勝手に日本語化したものはこちら

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

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

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

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

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

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

« 2006年1月 | トップページ | 2006年3月 »