PRGAPLI'S

 


  管理者の勝手な書き込み
 2010/09/24

事務連絡 : Delphi 2010で起動時に「displayNotification:メモリが不足しています」が出る症状を無くする方法 → ショートカットのプロパティで起動時のパラメーターの最後に「-np」を追加してDelphiの初期ホーム画面を強制的に出さないようにする。 これの最良な改善方法はないのかな〜

 2010/04/07

 Delphi 2010でD7やD2007で作成したものを修正作業しました。 便利になったのが「CenterEdit」や「RightEdit」を作成・使用の必要がななったのが一番かな〜。 ってなんだい!!の突っ込みがはいりそうですが... また、圧縮解凍関連ファイルの改造も各所閲覧で対応が可能となりました。 ヒント「PChar」の仕様が「PChar→PAnsiCharとなり、PAnsiChar→PWideChar」で稼働OKとなりました。 全部PCharがPWideCharでないのがミソでした...

 D2010で困っているのがDBGridの色設定がWindow7では不可??になっているようです。 プログラム内でアクティブ・非アクティブ時に色使いを変更していますが、表示では無視されています。 はて、どうしたものかな〜

 2009/12/16

 ようやっとDelphiも誘惑に負けてVer. 2010へアップグレードしてしまいました。 どこが良いのか未だに分かりませんし、インストールソフトの使用方法が不明で四苦八苦です。 どうも紙の取説が無いと不安です。 で、2010の使用感は2007とほとんど変わらないのは良い_?ですが、どこが良いのかも判読不明で困った時にはDelphi7を使用している昨今です。 VISTAでもDelphi7が使用できるし開発したソフトも動くしで困らない状態ですから諸兄も...ですよね。

  2009/03/06

 あれま、気がつけば昼間の仕事とも忙しいのに人助けのプログラム作成で四苦八苦とはいかに!!  おかげでDelphi2007 for Win32の使い方も覚えたりして...

FindComponentの再掲載

procedure THosyuForm.SpeedButton9Click(Sender: TObject);
var
  St : TStringList;
  j : Integer;
  DumyEdit : TEdit;
begin
  St := TStringList.Create;
  try
  St.LoadFromFile(MainForm.InitSysFolder.Caption + '\DATA\SUITOU\NyusituIn.KAM');
  for j := 0 to St.Count - 1 do
    begin
      DumyEdit := FindComponent('N_IN' + IntToStr(j + 1)) as TEdit;
      DumyEdit.Text := St.Strings[j];
    end;
  St.LoadFromFile(MainForm.InitSysFolder.Caption + '\DATA\SUITOU\NyusituOut.KAM');
  for j := 0 to St.Count - 1 do
    begin
      DumyEdit := FindComponent('N_OUT' + IntToStr(j + 1)) as TEdit;
      DumyEdit.Text := St.Strings[j];
    end;
  finally
    St.Free;
  end;
end;

ソートのエンジン     (uses文に DBTablesとBdeの記述が必要)

procedure THosyuForm.TableSortItself(Table: TTable; nFields: Integer; pFields,
pCases, pOrders: Pointer);
var
  hTable : hDBIDb;
  nRecord : LongInt;
  Actived : Boolean;
begin
  with Table do
    begin
      Actived := Active;
      Open;
      hTable := DBHandle;
      Close;
      nRecord := High(Integer);
      try
      Check(DbiSortTable(hTable, PChar(TableName), nil, nil, nil, nil, nil, nFields, pFields, pCases, pOrders, nil, False, nil, nRecord));
      finally
        if Actived then
          Open;
      end;
    end;
end;

ソートの命令部分

procedure THosyuForm.SpeedButton8Click(Sender: TObject);
const
  ORDER : array[Boolean] of SORTOrder = (sortDESCEND, sortASCEND);
var
  bASCEND : Boolean;
  SortFields : word;   <---- SortFields : array[0..3] of Wordと複数でも可能
  SortCases : Bool;   <---- 上に同じ
  SortOrders : SORTOrder; <---- 上に同じ
begin
  if (DatasForm.OwnersTable.Active) then
    begin
      SortFields := DatasForm.OwnersTableCODE.Index + 1;
      SortCases := False;
      SortOrders := ORDER[bASCEND];
      TableSortItself(DatasForm.OwnersTable, 1, @SortFields, @SortCases, @ SortOrders); <--- 1の部分が複数と同じ数字となります。
    end;
end;

 2009/02/10

 DelphiでExcelを操るPRGを作るときには、Excelの記録マクロを 参考にするとベターだし理解しやすいですよ。 ただし、構文になれが必要ですが...当方も躊躇する事多々ありました。

 2009/01/30

 DelhiでExcel操作の事後確認の結果について、ColumnWidthを実行するとエラー(Rangeなんたら...)を吐いて停止する事に関してですが、ColumnWidthを実行する前にCellsになんらかの書き込み行を先行させると、同じColumnWidthもなんら問題なく実行できるようです。 DelphiのバグなのかExcelのバグなのか根拠はありませんが...

 2006/03/26

 Excelを起動しての操作を業務連絡(防備箱)です。

 Excelシートに入力済みの行数(Row)を数える  変数 := WorkSheet.UsedRange.Rows.Count  RowsをColumnsに変更したら列数を数えてくれるかな?

 Excelを新規ファイルで起動する。 保存はファイル名をつけてからでないと、名前をつけろとメッセージが...

            Excel := CreateOleObject('Excel.Application');
            Excel.Visible := True;
            Excel.WorkBooks.Add;
            WorkBook := Excel.ActiveWorkBook;

 VBAを併用するには、なかなか奥が深すぎです。 でも、DelphiでExcelを使うのも楽しいな〜

 2005/01/22

  昨年暮れにDelphi2005が届き、Delphi8より良くなっている事を期待していましたが想像していた感じよりD8に近いもののようです。 とりあえずD8の様なエラーを吐かないので安心しました。  が、D7で使用していたユニットやらパッケージをインストールすべく思考錯誤してきましたが、ヘルプが不完全なのには閉口ものです。 マニュアルが付属していないのにヘルプが不完全では...(^^;)>

  で、試行錯誤の結果ユニットのインストールはヘルプどうりに行きませんので以下にその方法を業務連絡します。

今回DelphiにインストールするユニットはTEditからの継承もののEditコンポのセンター版です。

unit CenterEdit;

interface

uses
SysUtils, Classes, System.ComponentModel, Borland.Vcl.Controls,
Borland.Vcl.StdCtrls;

type
TCenterEdit = class(TEdit)
private
{ Private 宣言 }
protected
{ Protected 宣言 }
public
{ Public 宣言 }
procedure CreateParams(var Params: TCreateParams); override;
published
{ Published 宣言 }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TCenterEdit]);
end;

{ TCenterEdit }

procedure TCenterEdit.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams (Params);
Params.Style := Params.Style or ES_MULTILINE or ES_CENTER;
end;

end.
 

これをインストールする工程を解説します。

まず、Delphi 2005を起動します。

右側にあるプロジェクトマネージャ内の何もない部分で右クリックし、メニューから【既存のプロジェクトを追加】を選択します。

Program Files\Borland\BDS\3.0\lib内のdclusr.dpkを指定します。

プロジェクトマネージャ内の何もない部分で右クリックして【追加】で、先に示したCenterEdit.pasのある場所を取得します。

これでプロジェクトマネージャ内のProjectGroup1/dclusr90.dpl/Contains内にCenterEdit.pasが登録されます。

さらに、再構築・コンパイル・インストールと進めて問題が無ければ

Samples内にTCenterEditがインストールされDelphi2005で使用が可能となります。

この方法が正規かどうかは分かりませんが使用できますのでOKと言うことでしょうか?!  ただ、.Netには無理でしょう<(__;)> 当分はD7で頑張りまが....

 2004/01/12  Delphi8も使い込めない内にDelphi2005となってしまいました。 早いバージョンアップには閉口ものです。 アンチMにとってはアンチBになるのがとても恐い...今日は腰痛治療で正月勤務の代休を取りました。 どうも寝てられなくてPC前へ集合状態です。 腰が痛いのと使い切れないDelphiで疾駆八苦症候群です。

  Delphi 7 で頑張っていますが、Delphi2005へUnitを移植できないのには参っています。 Synetsy君ヘルプです。

 2003/03/19  Delphi8へバージョンアップ?したのは良いんだけれど、Delphi7まで作成したPRGがそのままではコンパイル出来ないのには閉口しました。 まだ勉強不足なのかも知れませんが.NETとかで参ってしまいました。 また一からの勉強には先が思いやられます。 SYEINETU君に教えて貰うことになりそうです。
 2003/10/15 業務連絡>> D7付属のクイックレポートをインストールする方法は、
>> DelphiIDEのメニューから〔コンポーネント|パッケージのインストール〕を選
>> 択して、表示されたダイアログの「追加」ボタンをクリックして、Delphi7イン
>> ストールディレクトリの\binフォルダの「dclqrt70.bpl」を選択すれば、コンポ
>> パレットに見慣れたクイックレポートコンポが追加されます。
 
 2003/08/24 ようやっと草地畑管理支援の作成がひと段落しましたので画面一こまを発表します。Delphi-MLの方々には大変迷惑をお掛けしましたが希望の仕様を達成することが出来ました。 ありがとうございました。 まだ改善箇所がありますのでプログラムとしての発表はもう少しかと...(^^;)

 2003/05/24 地図を取込んで、ある部分の面積を求めるって事でいささか時間を要してしまいました。 ヘロンの公式が使えるのは簡略式に分かりましたが、いざ凸凹な部分の面積を求めなければいけないってトコで可也悩みましたしNETサーフで調べましたが、なかなか的を得たヒントが見つかりませんでした。 いかに勉強不足だったかを思い知らされました。 が、簡単な図形なら下記のソースで求められますが他のHPでの計算結果とは違う事が多々ありますのであくまでも簡易計算と言う事で利用しました。 これは、マウスでポイントした各頂点をメモへ書き出し、それから計算させているソースです。 ちなみに下のソースでは頂点数を31点までとしています。 分かりますよね...(^^;)> ここまででDelphi-MLで叱咤・激励・ヒントを頂いてしまいました。 言葉足らずの頭ウニ状態でMLへの投稿でしたのでご容赦願います。

procedure TPointForm.SpeedButton4Click(Sender: TObject);
var
  AddX, AddY : array [0..30] of Double;
  n, j, Dp : Integer;
  DumyS : String;
  X1, Y1, X2, Y2, Menseki : Double;
begin
  n := PointMemo.Lines.Count;
  if n > 2 then
    begin
      for j := 0 to n -1 do
        begin
           DumyS := PointMemo.Lines.Strings[j];
           Dp := Pos(',', DumyS);
           DumyS := LeftStr(DumyS, Dp -1);
           AddX[j] := StrToInt(DumyS);
           DumyS := PointMemo.Lines.Strings[j];
           DumyS := RightStr(DumyS, Length(DumyS) - Dp);
           AddY[j] := StrToInt(DumyS);
        end;
      X1 := AddX[1] - AddX[0];
      Y1 := AddY[1] - AddY[0];
      Menseki := 0;
      for j := 2 to n -1 do
        begin
          X2 := AddX[j] - AddX[0];
          Y2 := AddY[j] - AddY[0];
          Menseki := Menseki + (X2 * Y1 - X1 * Y2) * 0.5;
          X1 := X2;
          Y1 := Y2;
        end;
     KaniMenseki.Text := FormatFloat('#,##0.0', Menseki);
    end
  else
    begin
      Beep;
      MessageDlg('図形の頂点が3点以下では計測できません。', mtError, [mbOk], 0);
    end;
end;

 2002/12/28  Delphi7での作り込みもだいぶ実施して見ましたが、アイコンが綺麗になって増えたのは良いんですが、出来上がったプログラムがWindowsXP仕様にならないのが ちょっと寂しいですよね。 結果、Delphi6との差はマイナーアップって事でしょうか? 大枚叩いた割には残念でした。 あと、QuickReportがアイコンから無くなって別仕様となったのには喜んで良いのやら、悲しいやら...(^^;)
 2002/08/26  ついにDelphi7が出てしまいました。 今日帰宅しましたらアップデートの案内状が届いていました。 まだ完全に使用出来ないうちにアップデートとは...まして大枚25K円とは懐も痛い!! トホホホ...(^^;)>
 2002/07/09 今まで同じような構文を多用して来て、DOS版プログラム作成では出来る事がWindowsでは諦めていた事が、なんとも簡単に解決した一つの事例を紹介します。 取説を良く読んでいなかっただけかもしれませんが目から鱗状態でした。

  QReportに名が同じで添え字を配したQLabelを多数使用している場合に同じような構文をだらだらと書かなくともOKというものです。  FindComponent()を使用します。  このFindComponentには非常に助けてもらいました。  今まで作成していたプログラムの書き直しをしようかなと思いましたが...そのままにしましょう!!

procedure TYoteiForm.SpeedButton2Click(Sender: TObject);
var
  DumyCompo : TQRLabel;
  j : Integer;

begin

  for j := 1 to 任意

begin
  if j <= JRec then
    begin
       JyuseiCode := 'Jyusei' + IntToStr(j);
       JyuseiDate := 'J_Day' + IntToStr(j);
       JyuseiDays := 'JDays' + IntToStr(j);
       DataForm.JyuseiYoteiTable.RecNo := j;
       DumyCompo := FindComponent(JyuseiCode) as TQRLabel;
       TQRLabel(DumyCompo).Caption := DataForm.JyuseiYoteiTableShortCode.AsString;
       if DataForm.JyuseiYoteiTableJYUSEI_DATE.IsNull = False then
         begin
           DumyCompo := FindComponent(JyuseiDate) as TQRLabel;
           TQRLabel(DumyCompo).Caption := '''' + Copy(DateTimeToStr(DataForm.JyuseiYoteiTableJYUSEI_DATE.AsDateTime), 3, 8);
           DumyCompo := FindComponent(JyuseiDays) as TQRLabel;
           TQRLabel(DumyCompo).Caption := '授精後' + IntToStr(DataForm.JyuseiYoteiTableJYUSEI_NISSU.AsInteger);
        end
      else
        if DataForm.JyuseiYoteiTableBUNBEN_DATE.IsNull = False then
          begin
             DumyCompo := FindComponent(JyuseiDate) as TQRLabel;
             TQRLabel(DumyCompo).Caption := '''' + Copy(DateTimeToStr(DataForm.JyuseiYoteiTableBUNBEN_DATE.AsDateTime), 3, 8);
             DumyCompo := FindComponent(JyuseiDays) as TQRLabel;
             TQRLabel(DumyCompo).Caption := '分娩後' + IntToStr(DataForm.JyuseiYoteiTableBUNBEN_NISSU.AsInteger);
          end;
  中略.....
    end;

 2002/07/04 最近は牛の繁殖管理支援プログラムを作っていますが、思ったほど作業が進まず疲れが出始めています。  また、今回は『MultiButton』を使用したプログラムです。 そこで、一部紹介します。

  一つのボタンに三行表示としていますが、各行ごとにフォントが指定できないので苦肉の策の跡が見られると思います。  が、MultiButtonの使用を快く了承下さった河邦 正(GCC02240@nifty.com)さんには感謝致します。(http://homepage2.nifty.com/kht0000)

procedure TCowsForm.FormShow(Sender: TObject);
var
  CowsRow, CowsCol, CowsSqrt : integer;
  j, p, MC : integer;
  CowsList : TStrings;
  Moji, Comm1, Comm2, Comm3 : string;
begin
  Cows := DataForm.CowsTable.RecordCount;
  CowSuu.Text := IntToStr(Cows);
  CowsSqrt := Ceil(SQRT(Cows));
  CowsCol := CowsSqrt;
  CowsRow := Ceil(Cows / CowsSqrt);
  MultiButton.Count := CowsCol * CowsRow;
  MultiButton.ColCount := CowsCol;
  MultiButton.RowCount := CowsRow;
  if CowsCol > 5 then
    CowsForm.Width := CowsCol * 70 + 24
  else
    Width := 345;
  if CowsRow > 4 then
    CowsForm.Height := CowsRow * 44 + 116 + 7
  else
    Height := 292;
  Refresh;
  Comm1 := '';
  Comm2 := '';
  Comm3 := '';
  DataForm.CowsTable.First;
  CowsList := TStringList.Create;
  try
  for j := 1 to CowsCol * CowsRow do
    begin
      while not DataForm.CowsTable.Eof do
        begin
          Comm1 := '';
          Moji := Copy(DataForm.CowsTableCODE.AsString, 6, 4);
          for p := 1 to 4 do
            begin
              MC := StrToInt(Copy(Moji, p, 1));
              case MC of
                0: Comm1 := Comm1 + 'o';
                1: Comm1 := Comm1 + '1';
                2: Comm1 := Comm1 + '2';
                3: Comm1 := Comm1 + '3';
                4: Comm1 := Comm1 + '4';
                5: Comm1 := Comm1 + '5';
                6: Comm1 := Comm1 + '6';
                7: Comm1 := Comm1 + '7';
                8: Comm1 := Comm1 + '8';
                9: Comm1 := Comm1 + '9';
             end;
          end;
          Comm2 := ' ';
          with DataForm do
            begin
               Comm3 := CowsTableNote.AsString;
               if CowsTableBUY_CODE.AsInteger > 0 then
                 Comm2 := '廃用予定'
               else
                 if Comm3 = '授' then
                   begin
                     if CowsTableKANTEI.AsBoolean then
                       begin
                         if CowsTableJyuseigoNissu.AsInteger > StrToInt(Days4) then
                           Comm2 := '長期在胎'
                         else
                           Comm2 := '(^+^)';
                       end
                     else
                       begin
                         if CowsTableJyuseigoNissu.AsInteger > 70 then
                           Comm2 := '長期不受胎';
                       end;
                   end
                 else
                   if (Comm3 = '分') and (CowsTableBunbengoNissu.AsInteger > 70) then
                     Comm2 := '長期不授精'
                   else
                     if (Comm3 = '育') and (CowsTableIkuseiNissu.AsInteger > (StrToInt(Days10) + 70)) then
                       Comm2 := '適期逸脱';
                     if Comm3 = '授' then
                       Comm3 := Comm3 + IntToStr(CowsTableJyuseigoNissu.AsInteger)
                     else
                       if Comm3 = '分' then
                         Comm3 := Comm3 + IntToStr(CowsTableBunbengoNissu.AsInteger)
                       else
                         if Comm3 = '育' then
                           Comm3 := Comm3 + IntToStr(CowsTableIkuseiNissu.AsInteger);
            end;
          CowsList.Add(Comm1 + ',' + Comm2 + ',' + Comm3);
          DataForm.CowsTable.Next;
        end;
      if j > Cows then
        CowsList.Add('Non');
    end;
  MultiButton.Items := CowsList;
  finally
    CowsList.Free;
  end;
  KotaiForm.SetBunbenDays.Caption := Days4;
  KotaiForm.SetKannyuDays.Caption := Days7;
end;

 2002/01/06  ついに我がPC群はWindowsXP一色になってきました。 ですが、軽快にDelphi6が動いていた環境で再インストールした途端にコンパイルエラーが出るようになってしまいました。 ですので、業を煮やしてBorlandのDelphiサポートへ対策云々のメールを送りつけてやりました。 お正月休み中ですので返事が返って来ませんが楽しみです。 Windows2000で動けば良いと言う物でもないはずですので...(怒りモード!!)
 2001/12/30  ノートPCのWindows XP ProfessionalでDelphiを起動し、大き目のプログラムをコンパイルするとエラーを起こす不具合が時々出ますが、メモリーを増やしたらエラーを吐かなくなってくれました。 この件の対策関係がBorlandのホームページに書き込みがありませんし対策云々も無いようです。 ほかのユーザーは大丈夫だったのかなー
 2001/10/21
ようやっと念願のKylixをインストールしました。

それも二台のPCへ!!

ですがPRG作りまではいっていませんが...何故って職場にはLinux環境がありませんので趣味の域だけに存在しています。

 2001/09/02 Delphi6で早々に再コンパイルを敢行しましたが、VARIANT関係でかなり手直しを要求される事態に遭遇?してしまって四苦八苦症候群状態の日々が続いています。 でも、もう少し隠し技が在りそうなので探しましょうね。
 2001/08/08 Delphiがバーアップで6となり発売されましたが、買い入れに大蔵大臣との直接折衝で負けそうになりましたが、今月中過ぎにでも発注出来る運びとなりました。 UNIX版共々楽しみにしています。 でも、出費と大臣の目が刺さる!!
 2001/05/29 DelphiでMicrosoft Excelへ書き込む場合の応用例です。 結構事務作業でExcelデータが必要になりますので覚えておくと便利です。 普段、Delphiて゜使用するTableをParadox仕様にしていますので、こんなプログラムが必要なんです。 って言うか、Excelで直に読まれたり、改変されないように・・・。 また、最後の変数クリアは必ず書き込むようにして下さい。

 必要部分は赤色

procedure TTougouForm.SpeedButton2Click(Sender: TObject);
var
  TestNum, i, CalcNum : integer;
  Zei : double;
  SM : string;
  K_Code : integer;
  Excel, WorkBook, WorkSheet : variant;
  j, RowNo : integer;
  WorkDir : string;
begin

//Excelシート作成
  CopyFile(PChar(GetCurrentDir + '\DATA\Init_YAT.XLS'), PChar  (GetCurrentDir + '\WORK\' + GetCode.Text + '_YAT.XLS'), True);
  WorkDir := GetCurrentDir + '\WORK\' + GetCode.Text + '_YAT.XLS';
  Excel := CreateOleObject('Excel.Application');

  Excel.Visible := False;                                  //Excelを表示しない
  Excel.WorkBooks.Open(WorkDir);
  WorkBook := Excel.ActiveWorkBook;
  WorkSheet := WorkBook.Sheets['Sheet1'];

  YatyouTable.First;
  RowNo := 1;
  for j := 0 to YatyouTable.FieldCount - 1 do
    WorkSheet.Cells[RowNo, j + 1].Value := YatyouTable.Fields[j].FieldName;
    YatyouTable.First;
    while not YatyouTable.Eof do
      begin
        PBar.Position := PBar.Position + 1;
        RowNo := RowNo + 1;
        for j := 0 to YatyouTable.FieldCount - 1 do
          WorkSheet.Cells[RowNo, j + 1].Value := YatyouTable.Fields[j].AsString;
        YatyouTable.Next;
      end;
    Excel.ActiveWorkBook.Saved := True;           //保存時に確認を表示しない
    Excel.ActiveWorkBook.Save;                       //Excelデータ保存
    Excel.Quit;                                              //Excel終了
    Excel := Unassigned;                                 //変数のクリア
    WorkBook := Unassigned;                           //変数のクリア
    WorkSheet := Unassigned;                         //変数のクリア
end;

 2001.04.14 プログラム作成上でどうしてもフロッピーへのデータ移動・保管が必要になり、どうしても容量的に無理でしたので下記のコンポーネントを使用して見ました。 コンポーネント内には理解不能な記述が多々ありましたが使用する上には大丈夫でした。

 >> 【作品名称】統合アーカイバコンポーネント for Delphi v1.28
 >> 【書庫名称】CMARC128.LZH
 >> 【書庫Size】73,470 Byte
 >> 【作者氏名】米田 昌司 ( NORG1964 )
 >> 【MAIL】norg1964@ceres.dti.ne.jp
 >> 【作者 URL】http://www.ceres.dti.ne.jp/~norg1964

 以下が上記コンポーネントを利用した私作成のプログラムの一部紹介です。 

procedure TForm.SpeedButtonClick(Sender: TObject);
var
  ArchiveFile : TArchiveFile;
  FileList : TStringList;
  cond : integer;

begin
  Beep;
  if MessageDlg('フロッピーへ圧縮バックアップします。確認して下さい。', mtInformation, [mbCancel, mbOk], 0) = mrOk then
begin
  Refresh;
  if not DirectoryExists('A:') then
    begin
      Beep;
      MessageDlg('フロッピーディスクが挿入されていないか、フォーマットされていないフロッピーのようです。 確認して下さい。', mtError, [mbOk], 0);
    end
  else
    begin
      ArchiveFile := TArchiveFile.Create(Self);
      FileList := TStringList.Create;

      try
      ArchiveFile.FileName := 'A:\Data.LZH';
      ArchiveFile.ArchiverType := atLha;
      FileList.Add(GetCurrentDir + '\DATA\*.*');
      cond := ArchiveFile.PackFiles(Handle, nil, '', FileList);
      finally
        ArchiveFile.Free;
        FileList.Free;
      end;
      ArchiveFile := TArchiveFile.Create(Self);
      FileList := TStringList.Create;
      try
      ArchiveFile.FileName := 'A:\Work.LZH';
      ArchiveFile.ArchiverType := atLha;
      FileList.Add(GetCurrentDir + '\WORK\*.*');
      cond := ArchiveFile.PackFiles(Handle, nil, '', FileList);
      finally
        ArchiveFile.Free;
        FileList.Free;
      end;
      Beep;
      MessageDlg('フロッピーへ圧縮バックアップを完了しました。', mtInformation, [mbOk], 0);
    end;
  end;
  Refresh;
end;

上記サンプルプログラム中には二種類のファイル圧縮がありますので良く見て下さいね。

 

 2000.10.29 テーブルの物理ソートU (複数のフィールド対応)
uses Db, DBTables, Bde;
procedure TableSortItSelf(Table: TTable; nFields: Integer; pFields, pCases, pOrders: Pointer);
var
  hTable: TTable;
  nRecord: LongInt;
  Actived: Boolean;
begin
  with Table do
    begin
      Actived := Active;
      Open;
      hTable := DBHandle;
      Close;
      nRecord := High(Integer);
      try
        Check(DbiSortTable(hTable, PChar(TableName), nil, nil, nil, nil, nil, nFields, pFields, pCases, nil, False, nil, nRecord));
      finally
        if Actived then
          Open;
      end;
    end;
end;

[使用例]
procedure TForm1.DBGrid1TitleCleck(Column: TColumn);
const
  bASCEND: Boolean = False;
  ORDER: array[Boolean] of SORTOrder = (sortDESCEND, sortASCEND);
var
  i: Integer;
  SortFields: array[0..2] of Word; 三種類のフィールドをソート対象にしている
  SortCases: array[0..2] of Bool;
  SortOrders: array[0..2] of SORTOrder;
begin
    bASCEND := not bASCEND;
    for i := 0 to 2 do
      begin
        SortFields[i] := i + 1;
        SortCases[i] := False;
        SortOrders[i] := ORDER[bASCEND];
      end;
    TableSortItself(Column, Field.DataSet as TTable, 3, @SortFields, @SortCases, @SortOrders);
end;
 2000.10.01  テーブルの物理的ソートの方法で物議をしましたが、『Delphiツール』ヘルプを参照で解決しました。

テーブルをソートして,出力テーブルへその結果を出力します。呼び出し形式は次のとおりです。

fDbiSortTable(CustomerTbl, CustomerTbl2, CustomerTbl.FieldByName('COMPANY'));

function fDbiSortTable(SrcTbl, DestTbl: TTable; SortField: TField): longint;
var 

  Field: Word;
  CaseIns: boolean;
  Recs: longint;

begin
  Recs := SrcTbl.RecordCount;
  CaseIns := True;
  Field := SortField.Index + 1;

  if DestTbl.Active = False then
  raise EDatabaseError.Create('Cannot complete operation with destination table closed');

  Check(DbiSortTable(SrcTbl.DBHandle, nil, nil, SrcTbl.Handle, nil, nil,
  DestTbl.Handle, 1, @Field, @CaseIns, nil, nil, False, nil, Recs));
  Result := Recs;
end;

これでソートと書き込みは完了なんですが、ソートされたデータが元のデータの次へ書き込みとなりますので不都合ですのでソート前のデータをカウントし書き込み後に削除する方法をとらなければなりません。

 1999.12.30 見栄えばかりを追及すると、ちょっとした落とし穴にはまってしまうことがあります。 その際たる部分が処理の速度です。 で、今回はEXCELやLOTUSで画面の更新をしないマクロでかなりの量のデータの作業させる事が良くありますよね。 これと同様にさせることが出来るのが

   AbcdTable.DisableControls;

      try

        各データ処理

      finally

      AbcdTable.EnableControls;

      end;

 これで、ずいぶん以上に処理速度を上げることが出来ます。  知っている方は申し訳ないですが我慢してくださいね

 1999.11.27 ついにDelphiもバージョンが5.0となりました。 当方のHDDにもようやっと5.0がインストールされました。 今回のバージョンアップの額は今までの3倍程度とごっい感じでした。 しかし、以前のバージョンの不快な部分が大分無くなっていましたので良い方向へ向いたと思います。
 1999.09.08 Delphi 5.0がついに出ましたが、さすがにINPRISEですね。 すっかり上げてバージョンアップをしたようで、さすがにアップに尻込みをしています。 いずれは5.0を手に入れなければなりませんが、少々きつい価格構成です。
 1999.05.23 すっかりHP更新をさぼってPRG作りに没頭していましたが、EVariantErrorに泣かされ続けています。 でも、Delphiのトレース操作が分かりましたので結構はかどりました。 自分専用のPRGであればこんなに悩まなくても良いですが、他人様用にはちょっと考えなければなりませんものね。 信悦君も以前にVariantでブツブツ言っていましたよね。
 1999.05.07  以下がPHOTO MAEDAさん用に作成したフォトライブラリ管理データベースのメインメニューです。 まあまあでしょ。 ここでは一切高等なコードは無いです。 まっ、メニュー画面ですからね。

 これが下のコード他を実際に見たWindow状態です。

unit MainMenu;

interface

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

type
   TMainForm = class(TForm)
   Bevel1: TBevel;
   Image1: TImage;
   BitBtn1: TBitBtn;
   BitBtn2: TBitBtn;
   BitBtn3: TBitBtn;
   Bevel2: TBevel;
   BitBtn4: TBitBtn;
   procedure Image1Click(Sender: TObject);
   procedure BitBtn1Click(Sender: TObject);
   procedure BitBtn2Click(Sender: TObject);
   procedure BitBtn3Click(Sender: TObject);
   procedure BitBtn4Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
   MainForm: TMainForm;

implementation

   uses Prg, PhotoSee, BirdSee, FlowerSee;

   {$R *.DFM}

procedure TMainForm.Image1Click(Sender: TObject);
begin
   Top := 0;
   Left := 0;
   Enabled := False;
   PrgForm.Show;
end;

procedure TMainForm.BitBtn1Click(Sender: TObject);
begin
   Top := 0;
   Left := 0;
   PhotoForm.Show;
   PhotoForm.PhotoTable.TableName := GetCurrentDir + '\DATA\PHOTO.DB';
   PhotoForm.PhotoTable.Active := True;
   PhotoForm.PHO_CodeTable.TableName := GetCurrentDir + '\DATA\PHO_CODE.DB';
   PhotoForm.PHO_CodeTable.Active := True;
   PhotoForm.Label11.Caption := FormatFloat('#,###', PhotoForm.PhotoTable.RecordCount);
   PhotoForm.DBGrid1.Color := clYellow;
   PhotoForm.PhotoTable.Edit;
   BitBtn1.Enabled := False;
   BitBtn2.Enabled := False;
   BitBtn3.Enabled := False;
   BitBtn4.Enabled := False;
   Enabled := False;
end;

procedure TMainForm.BitBtn2Click(Sender: TObject);
begin
   Top := 0;
   Left := 0;
   BirdForm.Show;
   BirdForm.BirdTable.TableName := GetCurrentDir + '\DATA\BIRD.DB';
   BirdForm.BirdTable.Active := True;
   BirdForm.BID_CodeTable.TableName := GetCurrentDir + '\DATA\BIR_CODE.DB';
   BirdForm.BID_CodeTable.Active := True;
   BirdForm.Label15.Caption := FormatFloat('#,###', BirdForm.BirdTable.RecordCount);
   BirdForm.DBGrid1.Color := clYellow;
   BirdForm.BirdTable.Edit;
   BitBtn1.Enabled := False;
   BitBtn2.Enabled := False;
   BitBtn3.Enabled := False;
   BitBtn4.Enabled := False;
   Enabled := False;
end;

procedure TMainForm.BitBtn3Click(Sender: TObject);
begin
   Top := 0;
   Left := 0;
   FlowerForm.Show;
   FlowerForm.FlowerTable.TableName := GetCurrentDir + '\DATA\FLOWER.DB';
   FlowerForm.FlowerTable.Active := True;
   FlowerForm.FLW_CodeTable.TableName := GetCurrentDir + '\DATA\FLW_CODE.DB';
   FlowerForm.FLW_CodeTable.Active := True;
   FlowerForm.Label9.Caption := FormatFloat('#,###', FlowerForm.FlowerTable.RecordCount);
   FlowerForm.DBGrid1.Color := clYellow;
   FlowerForm.FlowerTable.Edit;
   BitBtn1.Enabled := False;
   BitBtn2.Enabled := False;
   BitBtn3.Enabled := False;
   BitBtn4.Enabled := False;
   Enabled := False;
end;

procedure TMainForm.BitBtn4Click(Sender: TObject);
begin
   Close;
end;

end.

 1999. 4. 2   大まかなプログラムは結構作れるようになり、対外的にも作成してみました。 でも、なかなか頭の中で計画した感じを実現するには、以前に使用していたデータベースソフト(dBXL)の概念?が邪魔して苦労しています。  Windows仕様のプログラム作成に取り掛かってしまった以上仕方がないので自分から慣れるしか算段はありません。
 1999. 2. 21  本日も休日返上?!Delphi三昧をしていました。 腰が完全に固まってしまいましたが、結構な勉強をさせて頂きました。 今回はLotusやExcelの様に矢印キーでDBEdit間を縦横無尽に移動しょうと言う仕様作成に挑戦して見ました。 なんとか出来ました。 ついでに移動先のColorをも変える方法を取って見ましたら結構見やすい事に気がついたりして。(^^;)> 当方は未だにDelphiのサービスパックを手に入れていません。  誰かー Help me !!
 1998.11. 7 結構とDelphi4.0の書き方が理解出来て来ましたが、まだまだ奥が深いようです。 やはりデータベースの扱いが標準なんでしょうね。  今までの操作が信頼性ない感じだったって事でしょう。
 1998.10.13 ようやっと、Delphi 4.0への3.1からのビルド方法が分かりました。 またもや、新マニュアルには載っていませんでしたが、なんとか初心者は頑張りました。 3.1で作成したプロジェクトファイルを削除してから、4.0で新しくプロジェクトファイルを作成して3.1で作成した*.PASファイルを追加して行ったら、なんとかコンパイルしてくれます。 が、あまりいじっていないプログラムであれば、そのままでも4.0でコンパイル出来るようです。 一時はサポートセンターへ怒鳴り込みを掛けようかとしましたが、ちょっと大人げない気がして止めました。
 1998. 9. 8 文字列で命令?を作成して実行させることが『SINYESU』君に出来ないと言われて、かなり焦ってしまいました。 DOS版のDBXLでは実現できた操作ですが。。。。( _ _ ;)ガクッ!! としました。 どうも使い慣れた方法を選択してしまうのは、頭が固いからかも知れませんね。 忙しい仕事の合間を利用しての作成では頭が完全にウニ状態です。
 1998. 8. 2 クイックリポートの作成で用紙の大きさをカスタム設定した場合に、プレビュー表示でプリンターセットアップの表示で出てしまいます。 これにはホトホト参ります。
 1998. 8. 1 AsVariant 変換関数ってのは便利な関数ですね。 データベースのフィールドへ数値や文字を代入する時のすべてに使用出来るようです。 ただし、他の変換関数が使用出来る場合がありますが、コンパイルに成功しても、当てはまらない使用ではエラーになってしまいますので、なかなか奥が深いです。
 1998. 7.20 おおまかにプログラムが作られるようになって来ました。 なんだか、Visual Basicにも似ていますが、本当はそうではないんでしょうがね。 If ... Then の場合にはIf文が真の場合に次の一行が実行されます。 ですので複数行を対応させる為にbegin とendで括って実行させます。 これがなかなか理解できなかったです。 マニュアルは初心者を完全に無視していますので。
 なんだかんだで、Windows用のプログラム作成を実行しています。 なかなか難しいって言いますか、とっつき難いですね。 パスカルとか言って反って難しくしている気がします。 Sinyetu君に教えて頂いた第一弾Delphi制覇術は

  1. テーブル

  2. データソース

  3. グリッド

  4. ナビゲーター

で、決してゲーマーの合い言葉ではありませんが、Delphiでデータベースプログラムを作成する上で絶対必要かつ短絡作業工程です。 と、いつかは このページで有意義なプログラムを発表させて頂きますね。


趣味紹介 My PC's お気に入り Delphi's Room FreeBSD奮戦記 Win Tip's