食品偽装に消えた年金!「人気メルマガ発行者」が鋭く斬り込むNEWS評論!【投票は28日迄】
トップ > コンピュータ > プログラミング > Delphi 買ったけど。。

Delphi 買ったけど。。

初めてプログラムという物に触れようとして、Delphi を買ったけど全然わからないや。という方の為のメルマガです。

このメルマガの読者になる
規約 
>> メルマ!の会報誌もお届けします

Delphi 買ったけど。。No.0207 2008/07/14

発行日時: 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
で発行しています。
_________________________________________________________________











ブックマーク: はてなブックマークに追加del.icio.usに追加Buzzurlにブックマークニフティクリップに追加ライブドアクリップに追加Yahoo!ブックマークに登録

このメルマガを読んでいる人はこんなメルマガも読んでいます

使わなきゃ損!便利なフリーソフト!
まぐまぐ大賞2007コンピューター部門 第1位のあなたのパソコン生活を変えるフリーソフト専門情報誌!高性能フリーソフトから、かゆいところに手が届く孫...
Office & VBA パーフェクトマスター
Excel・Access・Word等の今さら聞けない「疑問」、今すぐ知りたい「困った」、たちまち解決!のmoug(モーグ)がお送りする、関数初心者か...
ネットワークエンジニア
ネットワークエンジニアはコンピュータでソフトウェアを開発する時、参考にできるC・VC言語の情報マガジンす。
VisualBasic エンジニア
VisualBasic エンジニアはコンピュータでソフトウェア開発をするためにVisualBasic 言語・Basic 言語・スクリプトなど、様々な...
C#プログラミングレッスン
C#での .NETプログラミングを易しく丁寧に解説するメールマガジンです。「C#プログラミング・レッスン」で、.NETプログラミングをマスターしまし...


おすすめキャンペーン

おすすめカードローン!
オリックスVIPローンカードなら

<<年率5.9%〜15.0%、利用可能枠最高500万円>>
ゆとりのカードローンです。
お申込みはこちら⇒

melma!協賛企業

アルバイトならen|
はじめようメルマガ生活
メルマガを読むには
メルマガを出すには
約64000誌から検索

メルマガデータ

  • メルマガID : 1349
  • 創刊日 : 1999-08-05
  • 最新号 : 2008-07-14
  • 発行周期 : 不定期
  • バックナンバー: 最新号のみ
  • 発行者サイト: あり
  • 読んでる人 : 450人
  • コメント数 : 0
  • Score! : -点
  • >> 月間ランキング

発行者プロフィール

ペンネーム :


注目情報


新着記事トピックス