Delphi 買ったけど。。No.0207 2008/07/14
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Delphi 買ったけど。。No.0207
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
だも(^O^)/ Terry です(^-^)
┏━━━┓
┃エラー┃
┗━━━┛
デバッガカーネル BORDBK105.DLL or BORDBK105N.DLL が見つからないか,
読み込むことができません.
---------------------------
二週間以上 Delphi さわっていませんでした。
Delphi2007 に至っては半年くらい(〃^▽^〃)
こちらは単にブレークポイントで確認しようとしたら上記のエラーが
出て IDE が使えなかったので放置していたのです(^^;
普段はもっぱら「Ctrl + F9」で、実行は Exe 直接起動なのでいつ
どの時点からなっていたのかわからなかったので調べる気を途中で
なくしてしまっていたのです。
で、ひょんなことから Microsoft Visual C# のスレかどこかで同じ
ような症状を見つけまして、あっさりと解決しました。
regsvr32 /u "...\CodeGear\RAD Studio\5.0\bin\bordbk105.dll"
regsvr32 /u "...\CodeGear\RAD Studio\5.0\bin\bordbk105N.dll"
regsvr32 "...\CodeGear\RAD Studio\5.0\bin\bordbk105.dll"
regsvr32 "...\CodeGear\RAD Studio\5.0\bin\bordbk105N.dll"
DLL を登録し直しただけです。
┏━┓
┃奥┃が深いぞ「連番リネーム」
┗━┛
ファイラーとかリネーマーとかに必ずついている連番リネームですが、
皆さんはアプリにその機能をつけたことがありますか?
私が最初につけたとき「ファイル名取得関数」側は
――――――――――――――――――――――――――――――
function GetHeadName(const Head: string; FileName: string;
ChaneNumCount:integer;StartNum: integer): string;
var
Path,CountStr:string;
begin
Result := '';
Path:=ExtractFilePath(FileName);
repeat
CountStr:='%.'+ IntToStr(ChaneNumCount) +'d';
Result:=Path+
Head+Format(CountStr,[StartNum])+
ExtractFileExt(FileName);
inc(StartNum);
until not FileExists(Result);
end;
――――――――――――――――――――――――――――――
このような簡単なものでした。
Format 関数で「なんたら001.txt」とかいうファイル名を取り敢えず
作って存在したら「なんたら002.txt」「なんたら003.txt」と数を増
やしていってOSにOKって言われるまで続けるわけです。
呼び出しテストはこちら
――――――――――――――――――――――――――――――
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
S,
NewName:string;
begin
with TOpenDialog.Create(Self) do
begin
try
Options:=[ofAllowMultiSelect];
Title:='リネームするファイルを選択';
Filter:='全てのファイル|*.*';
if not Execute then exit;
for i:=0 to Files.Count-1 do
begin
NewName:=GetHeadName('連番ヘッダ',//先頭に付加する文字列
Files[i],//変更したいファイル
3,//後ろにつける連番の桁数
1);//最初の数字
S:=ExtractFileName(Files[i])+'→'+
ExtractFileName(NewName);
if RenameFile(Files[i],NewName) then
S:='◎ '+S else S:='X '+S;
Memo1.Lines.Add(S);
end;
finally
Free;
end;
end;
end;
――――――――――――――――――――――――――――――
でもこれだと例えば最初の名前が
0.txt
1.txt
連番ヘッダ003.txt
だった場合、結果はこうなっちゃいます
0.txt→連番ヘッダ001.txt
1.txt→連番ヘッダ002.txt
連番ヘッダ003.txt→連番ヘッダ004.txt
003 がすっ飛びます。(最近気づきました(p_q ))
で、対策します
――――――――――――――――――――――――――――――
function GetHeadName(const Head: string; FileName: string;
ChaneNumCount:integer;StartNum: integer): string;
var
Path,CountStr:string;
begin
Result := '';
Path:=ExtractFilePath(FileName);
repeat
CountStr:='%.'+ IntToStr(ChaneNumCount) +'d';
Result:=Path+
Head+Format(CountStr,[StartNum])+
ExtractFileExt(FileName);
inc(StartNum);
(* リネーム後も同じ名前 *)
if FileExists(Result) then
begin//同じ名前か大文字小文字の違いだけ
if AnsiUpperCaseFileName(Result)=
AnsiUpperCaseFileName(FileName) then Break;
//そんなときはその名前のままリネームしちゃえ
end;
(* リネーム後も同じ名前 *)
until not FileExists(Result);
end;
――――――――――――――――――――――――――――――
これで
◎ 0.txt→連番ヘッダ001.txt
◎ 1.txt→連番ヘッダ002.txt
◎ 連番ヘッダ003.txt→連番ヘッダ003.txt
になりました。
次に(これは早くから対策していたのですが)桁数オーバーです。
上記では三桁固定ですが例えば二桁で、百個以上のファイルが選択
された場合に困ります。
で、取り敢えずエラーを返します(★呼び出し側も一行追加)
――――――――――――――――――――――――――――――
function GetHeadName(const Head: string; FileName: string;
ChaneNumCount:integer;StartNum: integer): string;
var
i,
MaxI:integer;//桁数チェック★
Path,CountStr:string;
begin
Result := '';
//桁数チェック★(Power 関数は uses Math が必要かも知れません)
MaxI:=9;
if ChaneNumCount>1 then
for i:=2 to ChaneNumCount do
MaxI:=Round(MaxI + 9 * Power(10,(i-1)));
//桁数チェック★
Path:=ExtractFilePath(FileName);
repeat
CountStr:='%.'+ IntToStr(ChaneNumCount) +'d';
Result:=Path+Head+Format(CountStr,[StartNum])+ExtractFileExt(FileName);
inc(StartNum);
//桁数チェック★
if MaxI<StartNum then
begin
Result:='';
ShowMessage('添付 No. の桁数が少なすぎますので中止します');
exit;
end;
//桁数チェック★
(* リネーム後も同じ名前 *)
if FileExists(Result) then
begin//同じ名前か大文字小文字の違いだけ
if AnsiUpperCaseFileName(Result)=
AnsiUpperCaseFileName(FileName) then Break;
//そんなときはその名前のままリネーム
end;
(* リネーム後も同じ名前 *)
until not FileExists(Result);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
S,
NewName:string;
begin
with TOpenDialog.Create(Self) do
begin
try
Options:=[ofAllowMultiSelect];
Title:='リネームするファイルを選択';
Filter:='全てのファイル|*.*';
if not Execute then exit;
for i:=0 to Files.Count-1 do
begin
NewName:=GetHeadName('連番ヘッダ',
Files[i],
1,
1);
S:=ExtractFileName(Files[i])+'→'+
ExtractFileName(NewName);
if RenameFile(Files[i],NewName) then
S:='◎ '+S else S:='X '+S;
Memo1.Lines.Add(S);
//桁数オーバーのため中止★
if NewName='' then exit;
end;
finally
Free;
end;
end;
end;
――――――――――――――――――――――――――――――
さて、これで最初に比べればずいぶん良くなったと思うのですが、
実際に使ってみると、あるフォルダにあった五千個ほどのファイル
を処理したとき、何か途中から固まった様に遅くなったと思ったら
(Application.ProcessMessages を使って処理状況は表示させてい
ました)なんと 001 から順番に調べる作業を五千回やっていたんで
すorz
プログラムって本当に書いたとおりしか動かないんですね(^^;
で、引数 StartNum に var つけて対処しました。
詳細は端折りますが。
『プログラムは思ったとおりには動かない。
作ったとおりに動く。』
このときだけは本当に言葉でなく心で理解した瞬間でした。
そりでは(^.^)/~~
_________________________________________________________________
★わからない点などありましたら、メールしてください。
*****************************************************************
発行者:Terry terry@vega*ocn*ne*jp
スパム対策です。 「*」を「.」に変更してください↑
★ 登録 or 解除、バックナンバーはこちらから↓
http://archive.mag2.com/0000016258/
*****************************************************************
★なるべくMSゴシックなどの「等幅フォント」でお読み下さい★
_________________________________________________________________
このメールマガジンは、
・インターネットの本屋さん『まぐまぐ』
http://www.mag2.com/ ID:0000016258
・melma!
http://www.melma.com/ ID:m00001349
で発行しています。
_________________________________________________________________


![転職なら[en]社会人の転職情報!転職成功者続出 転職なら[en]社会人の転職情報!転職成功者続出](http://kamogawa.mag2.com/bn/recommend/sya.gif)
![派遣のお仕事探しなら[en]派遣のお仕事情報 派遣のお仕事探しなら[en]派遣のお仕事情報](http://kamogawa.mag2.com/bn/recommend/haken.gif)
![アルバイト探しは[en]本気のアルバイト アルバイト探しは[en]本気のアルバイト](http://kamogawa.mag2.com/bn/recommend/baito.gif)
![就職サイトは[en]学生の就職情報 就職サイトは[en]学生の就職情報](http://kamogawa.mag2.com/bn/recommend/gakusei.gif)
![転職なら[en]転職コンサルタントキャリアを活かした転職に! 転職なら[en]転職コンサルタントキャリアを活かした転職に!](http://kamogawa.mag2.com/bn/recommend/consul.gif)