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

☆PSDファイルを表示させる。

ニュースグループborland.public.delphi.graphicsでPSDファイル(Adobe Photoshopのファイル形式)を表示させることができるGraphicEx image libraryというライブラリが紹介されていたので試してみました。

フォームにTImageを配置して、次の処理をするだけできちんと画像が表示されました。
uses GraphicEx;

procedure TForm1.FormCreate(Sender: TObject);
var
  PSDGraphic: TPSDGraphic;
begin
  PSDGraphic := TPSDGraphic.Create;
  try
    PSDGraphic.LoadFromFile('c:\sample.psd');
    Image1.Picture.Assign(PSDGraphic);
  finally
    FreeAndNil(PSDGraphic);
  end;
end;

Psdview

もっとセンスのある画像ができないのかな・・・。



ニュースグループborland.public.delphi.graphics
delphi + PSD
2008年2月26日yannis氏からのコメント

soft-gems
www.soft-gems.net
GraphicEx image library

|

■TMS Advanced ToolBars & Menusアップデート

TMS Advanced ToolBars & Menus が v3.5.3.0 から v3.5.4.0 にアップデートされました。

メーカーホームページからの引用です。

in v3.5.4.0
- New : TStickyMenuItem isControlItem style added to have a menu item with only a control
- New : method ArrangeToolBars added in TAdvDockPanel to programmatically auto arrange toolbars in the dockpanel
- New : property SubItemHeight added in TAdvPreviewMenuItem to have different heights in different submenus
- Improved : AddAdvToolBar function assigns styler automatically
- Fixed : TAdvToolBarContainer transparency issue

tmssoftware.com

|

☆CAPICOMを使った暗号化/復号化

daily dayflowerさんのところで、CAPICOMを使った暗号化のサンプルを見つけました。
(CAPICOMとは、Crypto APIをCOMにしたものらしいです。)
サンプルではHEXへの変換を行っておられますので、ここでは、暗号化したものをファイルに書き込み、又、ファイルから読み込んで復号化してみました。
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses ActiveX, CAPICOM_TLB;

// 暗号化  ファイルに書き込む
procedure CAPICOM_Encrypt_SaveToFile(FileName: String;
  Key, S: WideString);
var
  EncryptedData: TEncryptedData;
  FileStream: TFileStream;
  Buffer: WideString;
begin
  EncryptedData := TEncryptedData.Create(nil);
  try
    EncryptedData.Algorithm.Name      := CAPICOM_ENCRYPTION_ALGORITHM_DES;
    EncryptedData.Algorithm.KeyLength := CAPICOM_ENCRYPTION_KEY_LENGTH_128_BITS;
    EncryptedData.SetSecret(Key, CAPICOM_SECRET_PASSWORD);
    EncryptedData.Content := S;
    Buffer := EncryptedData.Encrypt(CAPICOM_ENCODE_BINARY);
    FileStream:= TFileStream.Create(FileName, fmCreate or fmShareDenyWrite);
    try
      FileStream.WriteBuffer(Pointer(Buffer)^, SysStringByteLen(PWideChar(Buffer)));
    finally
      FreeAndNil(FileStream);
    end;
  finally
    FreeAndNil(EncryptedData);
  end;
end;

// 復号化 ファイルから読み込む
function CAPICOM_Decrypt_LoadFromFile(FileName: String;
  Key: WideString): WideString;
var
  FileStream: TFileStream;
  Buffer: WideString;
  EncryptedData: TEncryptedData;
begin
  Result := '';
  EncryptedData := TEncryptedData.Create(nil);
  try
    EncryptedData.Algorithm.Name      := CAPICOM_ENCRYPTION_ALGORITHM_DES;
    EncryptedData.Algorithm.KeyLength := CAPICOM_ENCRYPTION_KEY_LENGTH_128_BITS;
    EncryptedData.SetSecret(Key, CAPICOM_SECRET_PASSWORD);
    try
      FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
      try
        Pointer(Buffer) := SysAllocStringByteLen(nil, FileStream.Size);
        FileStream.ReadBuffer(Pointer(Buffer)^, FileStream.Size);
        EncryptedData.Decrypt(Buffer);
        Result := EncryptedData.Content;
      finally
        FreeAndNil(FileStream);
      end;
    except
      //ShowMessage('error');
      Abort;
    end;
  finally
    FreeAndNil(EncryptedData);
  end;
end;

// 暗号化  ファイルに書き込む
procedure TForm1.Button1Click(Sender: TObject);
var
  FileName: String;
begin
  FileName := ExtractFilePath(Application.ExeName) + 'Angou.dat';
  CAPICOM_Encrypt_SaveToFile(FileName, Edit1.Text, Edit2.Text);
end;

// 復号化  ファイルから読み込む
procedure TForm1.Button2Click(Sender: TObject);
var
  FileName: String;
begin
  FileName := ExtractFilePath(Application.ExeName) + 'Angou.dat';
  Edit3.Text := CAPICOM_Decrypt_LoadFromFile(FileName, Edit1.text);
end;

initialization
  CoInitialize(nil);
finalization
  CoUninitialize;
end.

Capicom


このように高度な暗号化がとても簡単に扱えます。


daily dayflower
Delphi で暗号化するなら CAPICOM を使うと楽
http://d.hatena.ne.jp/dayflower/20071024/1193208297

|

☆TShellResourcesって?

TShellResourcesって、何に使うのだろうという疑問から少し調べてみました。
ヘルプによるとVistaのシェルアニメーションは、システムの外部からアクセスできなくなっているらしく、TShellResourcesはこのアニメーションリソースを提供するようです。まあ、ソースを見てもリソースのためだけに用意されていることが明らかですけどね。ということで、このリソース(CopyFiles)を表示させてみました。
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellAnimations, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Animate1: TAnimate;
    Animate2: TAnimate;
    ShellResources1: TShellResources;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // XP
  Animate1.CommonAVI := aviCopyFiles;
  Animate1.Active := True;

  // Vista(TShellResourcesより)
  // リソースエディターでIDを調べました。
  Animate2.ResID := 160; // CopyFiles.res
  Animate2.ResHandle := hInstance;
  Animate2.Active := True;
end;

end.


実行させるとこんな感じ・・・。

Shellresource


ご覧のように少しイメージが異なります。 ヘルプには「TShellResources は、Vista で実行され、共有ライブラリからアニメーションを使用するプログラムにのみ使用してください。それ以外の場合は、必要のないオーバーヘッドを増やすだけです。 」とありますが、この微妙な差が気に入った方は使ってみてはいかが(笑)

|

☆文字列を後方から検索する。

次のような規則に従って作られたファイル名から部分文字列(金額)を取り出す処理です。
[半角空白]名称[-]金額.txt

ここで問題だったのは、名称と金額を繋いでいる-(hyphen)が名称にも含まれている場合があるため、 後方から-(hyphen)の位置を検索しなくてはいけないことでした。
そこで今回はAnsiReverseString関数を使って処理してみました。
uses StrUtils;

procedure TForm1.Button1Click(Sender: TObject);
const
  S = '2008 Delphi-fan-123,456,789円.txt';
  Delimiter = '-';
var
  WS, RS: WideString;
  Len, I: Integer;
begin
  // 拡張子を削除する。
  WS := ChangeFileExt(S,'');
  // 後方から検索したいので、文字列をリバースさせてPos関数が使えるようにする。
  RS := AnsiReverseString(WS);
  Len := Length(WS);
  I := Len-Pos(Delimiter, RS)+1;
  Edit1.Text := Copy(WS, I+1, Len-I);
end;
この処理できちんと123,456,789円が取得できました。

|

■2008 Delphi Survey

もう既にいろんな方から紹介されていますが、一応書いておきますね。
質問数もたくさんあり、時間もかかりますが、みなさんの思うところをぜひお伝え下さい。

日本語版アンケート
http://video.codegear.com/survey/2008DelphiSurvey_Japanese.html

|

■日経ソフトウェア2008年3月号

本屋でぶらっと見てたら、特別付録「C言語まるごと学習ブック」というのがあったので、久しぶりに買ってきました。いや、そんな付録はどうでもいいんですけど、もうDelphiの記事が全くないんですね。それどころかプログラム言語をリストアップしている文章にすら載っていません。まあ、Delphiで新しい記事を書くこと自体難しそうですし、ある意味仕方ないのかも知れませんが・・・。
でもそんな扱いを受けようとも(笑)、プログラムが仕事でない私にとっては開発言語のシェア率など全く関係ないので、これからもお気に入りのツールとして使っていこうと思います。

|

☆RichEditの行間を広げる。

TMemoを使ったプログラムで、行間が狭くて読みづらいのでなんとかならないかと言われたので、 調べてみるとTRichEditなら行間を広げられるということで試してみました。
uses RichEdit;

// 行間の設定
procedure SetGyokan(RichEdit: TRichEdit; bLineSpacingRule: Byte);
var
  ParaFormat2: TParaFormat2;
begin
  RichEdit.SelectAll;
  FillChar(ParaFormat2, SizeOf(ParaFormat2), 0);
  ParaFormat2.cbSize := SizeOf(ParaFormat2);
  ParaFormat2.dwMask := PFM_LINESPACING;
  ParaFormat2.bLineSpacingRule := bLineSpacingRule;
  SendMessage(RichEdit.Handle, EM_SETPARAFORMAT, 0, Longint(@ParaFormat2));
  RichEdit.SelStart := 0;
end;

// 行間を広げる。
procedure TForm1.Button1Click(Sender: TObject);
begin
  SetGyokan(RichEdit1, 1); // 行間を1.5倍にする。
end;

// 行間を戻す。
procedure TForm1.Button2Click(Sender: TObject);
begin
  SetGyokan(RichEdit1, 0); // 行間を標準にする。
end;


行間1.5倍

Re1



行間標準

Re2



Rich Edit
http://msdn2.microsoft.com/en-us/library/bb787605%28VS.85%29.aspx

PARAFORMAT2 Structure
http://msdn2.microsoft.com/en-us/library/bb787942.aspx

|

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