2009年10月24日土曜日

Delphiでファイルの変化に反応するプログラム

よく、アプリケーションを使っていると、ファイルが他のプログラムで
変更されたことを検地する機能を持ったものがある。

これは、どうやってやっているんだろうかとぼんやりと思っていたのだけど、
必要に迫られることがなかったので、ずっと放置していたのだけども、
最近、ツールが作りたくなってこの機能があればスマートに実装できるので
ちょっと調べてみた。

すると、Delphiには、まさにそのためのコンポーネントがあるではないか。

それは、TShellChangeNotifierというクラス。

このクラスは、指定したフォルダ以下のファイルに変化があったら反応してくれる
コンポーネント。

下記が今回参考にしたサイトです。
http://www.geocities.jp/fjtkt/problems/2005_0008.html

2009年10月8日木曜日

シリアライズのテストプログラム

シリアライズをして復元するというようなプログラムをテストで
作ってみました。

いままではフレームワークで勝手にシリアライズしてくれるような部分で意識していなかった
部分だったのだけど、ちょっと自前で書いてみました。

Serializable なクラスをもつSerializable を作って
byte[]に格納した後に、そこからオブジェクトに復元してみる
というのを確かめたサンプルのソースコードです。

package SerializeTest;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import javax.xml.parsers.DocumentBuilder;

import org.w3c.dom.Document;

public class Main {

 /**
  * @param args
  * @throws IOException 
  * @throws ClassNotFoundException 
  */
 public static void main(String[] args) throws IOException, ClassNotFoundException {
  classA  test = new classA();
//  DocumentBuilder docbu = DocumentBuilder.get;
  test.setLoginInfo(new LoginInfo("useree","passhhh"));
  test.setVal1("かきくけこ");
  test.setVal2("あいうえお");
  System.out.println(test.toString());
  
  ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  ObjectOutputStream p = new ObjectOutputStream(baos);

  p.writeObject(test);
  p.writeObject("String");

  p.flush();
  byte [] bit = baos.toByteArray();
  baos.close();
    //
  ByteArrayInputStream bais = new ByteArrayInputStream(bit); 
  ObjectInputStream ois = new ObjectInputStream(bais);
  classA cla = (classA ) ois.readObject();
  String str = (String ) ois.readObject();
  System.out.println(cla.toString());
  System.out.println(str);
 }

}
 

============================
package SerializeTest;

import java.io.Serializable;

public class classA implements Serializable {
 /**
  * 
  */
 private static final long serialVersionUID = -345225844394172659L;
 LoginInfo loginInfo;
 String val1 ;
 String val2 ;
 
 public LoginInfo getLoginInfo() {
  return loginInfo;
 }

 public void setLoginInfo(LoginInfo loginInfo) {
  this.loginInfo = loginInfo;
 }

 public String getVal1() {
  return val1;
 }

 public void setVal1(String val1) {
  this.val1 = val1;
 }

 public String getVal2() {
  return val2;
 }

 public void setVal2(String val2) {
  this.val2 = val2;
 }

 public String toString(){
  return loginInfo.getUserName()
       +"/"+loginInfo.getPassword()
  +"/"+val1+"/"+val2;
 }
 
}

===============================
package SerializeTest;

import java.io.Serializable;

public class LoginInfo implements Serializable {
 /**
  * 
  */
 private static final long serialVersionUID = -8712859729005134670L;
 private String userName;
 private String password;
 public LoginInfo(String string, String string2) {
  userName =string;
  password=string2;
 }
 public String getUserName() {
  return userName;
 }
 public void setUserName(String userName) {
  this.userName = userName;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }

}