2013年12月24日

更新クエリ実行件数


TADOQueryでは、ExecSQLのあとに RowsAffected Propertyで更新件数が確認できる。


ExecSQLの戻り値にも返る。
posted by しんくそふと at 15:31| Comment(0) | TrackBack(0) | おぼえ

2013年12月15日

dfmファイルを弄る

(Delphi Advent Calender2013投稿記事です)

BDEコンポーネントの切り替え方法として、
.dfmファイルを直接書き換える話をするのですが、.dfmファイルを直接弄るということをする人が少ないようなので、以前の記事に追加して少しまとめて見ます。テーブルコンポーネントの切り替え以外にどれだけ役に立つかは微妙なところですが、知っておくとまれに役立ちます。

.dfmファイルは、Delphi Ver5Ver6あたり(いまいちきちんと覚えていない)から、テキスト形式で保存できるようになっています。また、IDE上でテキスト表示もできます。


今回は、Delphi2007でいろいろ試しています。

メニューのツール=>オプション=>VCLデザイナで、テキスト形式で保存するかの指定ができます。
とりあえず、ボタンコンポーネントとパネルコンポーネントを張ったFromのソースを見てみます。

Objectの後に、オブジェクト名とクラス名がありその後にプロパティ(下記例では“〜〜略〜〜”の部分でこの例では省略します)が表示されます。プロパティは、デフォルト設定値以外のプロパティが表示されます。


Formも同じで、Formの中に各コンポーネントがあると構造も表現されています。


object Form1: TForm1

〜〜略〜〜

  object Button1: TButton

〜〜略〜〜
 
end

  object Panel1: TPanel

〜〜略〜〜
 
end

end


構造が表現されているという例で下記のように修正してみます

object Form1: TForm1
〜〜略〜〜

  object Panel1: TPanel

〜〜略〜〜
   
object Button1: TButton

〜〜略〜〜

  
  end

 
end

end


変更後、フォームとして表示すると、パネルコンポーネントの中に、ボタンコンポーネントが表示されるようになります。

このフォームを継承し、テキストがどのようになるか見てみます。

inherited Form2: TForm2

〜〜略〜〜

  inherited Panel1: TPanel

〜〜略〜〜
    inherited Button1: TButton

〜〜略〜〜

    end

 
end

end


object の部分がinheritedになっています。Formも同様です。


継承オブジェクトについては、このように定義が変わります。プロパティは、継承元と違うものが出力されます。

上記例では、ボタンコンポーネントとパネルコンポーネントの情報が表示されていますが、これは位置を少しずらしたため出力されていて、もし何も変えていない場合、これらは表示されません。
新たに、パネルにボタンを追加すると


inherited Form2: TForm2

〜〜略〜〜

  inherited Panel1: TPanel

〜〜略〜〜  
     inherited Button1: TButton
〜〜略〜〜
  

     end

     object Button2: TButton
〜〜略〜〜

     end
 
end

end


こんな感じで、objectが追加されることになります。


次に、コンポーネントクラスの切り替えを弄ります。

以前記事でも書きましたがDfmファイルのクラス定義を修正し、フォーム表示に切り替え後、保存すると、pasファイルとクラスの定義が違うけど、pasの定義を変更するかという確認メッセージが表示され、OKを押すと、pasファイルの定義を自動で変更してくれます。また、互換のないプロパティやイベントは無効となりますので注意が必要です(フォーム表示時に発生します。具体例は、後述)。
上記で、
Button2TBitBtnに変更します。その後、フォーム表示に変更します。見た目は変わらないのでこの状態ではわかりません。
保存します。

---------------------------

エラー
---------------------------
フィールド Form2.Button2 は TBitBtn 型であるべきですが,TButton として宣言されています。宣言を修正しますか?
---------------------------
はい(Y)   いいえ(N)   キャンセル   ヘルプ(H)  
---------------------------
というダイアログが出ます。“はい”を押した後に、
pasファイルを確認すると、

   Button2: TBitBtn;
という感じで書き換わっています。


ちょっと遊んでみます。

ここで、エディタに戻って、TBitBtn TEditに変えます。
---------------------------

フォームの読み込み中のエラー
---------------------------
Button2.Captionの読み込み中のエラー:プロパティCaptionは存在しません。エラーを無視して続行しますか?

注意:エラーを無視すると、コンポーネントまたはプロパティが失われる可能性があります。

---------------------------
無視(I)   キャンセル   すべて無視(A)  
---------------------------

“無視”を押すと、フォーム表示され、
BitBtnだったものが、Editコンポーネントに変わっています。



このように、互換のないプロパティやイベントについては無効になるので注意が必要で、重要なプログラムについて作業を行う場合、確認しながら進める必要があります。手抜きをして上記画面で“すべて無視”を選んでしまうと後で公開することもあるので面倒でも、確認しながら、“無視”ボタンをひとつづつ確認するのが無難です。


最後の例は、あまり意味ないですが、この、dfmを直接書き換える方法は、BDEコンポーネントの切り替えなどには、役立つと思います。


まだ弄ったことがない人は一度、いろいろ試してみてください。


<注意>

最後に、慣れないうちはバックアップを取ってから修正するようにしてください。修正時、コンポーネント構造がおかしくなると、フォーム表示に復活できなくなります。


posted by しんくそふと at 17:16| Comment(0) | TrackBack(0) | 開発TIPS

2013年12月12日

Delphiマイグレーション記録 VBReport

自社オリジナル開発での使用実績はなかったが、他社が開発したもののマイグレーション案件で数社使用されていることが確認された。
VB-Report (ActiveX版)使用のプログラムを、Delphi2007へマイグレーションを実施。
サポートに連絡することにより、Delphi 2007用パッケージファイルをもらうことができた。

こちらは、メーカーが今でもサポートしてくれているよう。
http://www.adv.co.jp/support/product/support_vb-report2007.htm
特に旧版で問題は出てなかったようだが、最新の、Dllを取得する。


#(2017.1.11追記)
dllのバグ修正は、今も継続いるようです。
http://www.adv.co.jp/download/download-confrm.php?skey=54A&ftype=U
posted by しんくそふと at 09:51| Comment(0) | TrackBack(0) | 開発TIPS

Delphiマイグレーション記録 GKit

自社オリジナル開発での使用実績はなかったが、他社が開発したもののマイグレーション案件で数社使用されていることが確認された。
Borland Edtionというのが提供されていたようだ。製品サイトを見てい見ると、DelphiVer6あたりまでサポートされていたよう。
http://jp.fujitsu.com/group/fae/support/gkitocx/updatesp4b.html

今回、Delphi2007へのマイグレーションだったので、残念ながら、Bplファイルなどのサポートはない。

ベースはActiveXなので、ActiveXからタイプライブラリを作成、ラッパファイルをそれに対応して修正することで対応できた。

ただし、いくつかプロパティやメッソドの修正が必要となったり、実行時使えないものがあったので若干のソース修正が必要になった。
このあたりの確認は、生成された、タイプライブラリの確認が必要となる。


GKitの使用感は、高機能であるけど。。。費用(工数)の余裕があるなら、他のものに変えたほうが良いのかな。という感じ。
posted by しんくそふと at 09:29| Comment(0) | TrackBack(0) | 開発TIPS

2013年06月12日

Administrator アカウント

ローカルセキュリティポリシー
 =>ローカルポリシー
  =>セキュリティオプション
   =>Administrator アカウントの状態
posted by しんくそふと at 20:55| Comment(0) | TrackBack(0) | おぼえ

2013年05月30日

BDE ⇒ FireDAC変換 (ソース変換)

dfm直接書き換えで、BDE=>FireDACに書き換えた時の記録です。

データベースはOracle。一時作業用にParadoxを使用。
すべてのプロジェクトで同じようにいくとは限りません。たまたま、弊社で対応したものの記録です。少しは参考になると思います。

一時作業用(Paradox)のTTableのTADMemTable化を先にやります。
TTable
 =>
  TADMemTable
この後一度、IDEで開いておいたほうが良いです。

次に、オラクルアクセス用のコンポーネントの変換
DMDataBase.OraDBは、TADConnectionの名前です。
----------------------
TTable
 =>
TADTable
    Connection = DMDataBase.OraDB

* SchemaNameを指定するとテーブルがないとエラーが出ることがある。この場合、 SchemaNameは削除する。
----------------------
TQuery
 =>
TADQuery
    Connection = DMDataBase.OraDB
----------------------
TUpdateSQL
 =>
TADUpdateSQL
    Connection = DMDataBase.OraDB
----------------------
各コンポーエントのDatabaseNameプロパティを削除しておいてもよいが、今回はそのまま残し、削除は、IDE任せで行った。
ADOコンポーネントの時のように、イベントが消えることもないのでそのあたりのフォローは少なくて済む。
TUpdateSQLも、TADUpdateSQLとして残るので助かる。
TADQueryの項目のDisplayLavelプロパティで、"#,#" はNG(メモリ例外)。
”0,#”にするとOKなところがあった。(原因は不明)

以下は、データマッピング機能を使うと変換の必要がないのかもしれないが、今回は使用せず、また次回試すことにする。

----------------------
TFloatField
 =>
    TBCDField
    Size = 0
ただし、小数項目は Size = 2 後で変更
----------------------
これはソース側。TADStoredProcのParamsの設定
AsInteger => value
AsDate => value
AsDateTime => value
----------------------
TADStoredProcで、IDE上で、StoreProcNameを再設定しないとパラメータ設定部分でエラーが出るものがいくつか発生(すべてでない)
StoreProcNameを一度クリアして、再設定してやるとうまく行くようになった。これも原因は今のところ不明。
TADQueryで、同様に、SQLを再設定してやらないと、上記と同様、パラメータ設定部分でエラーが出るものがいくつか発生(SoredProcより少ない)
これも、SQLを一度クリアして再設定で治った。こちらは、同一名のパラメータ名が複数あるときに起きるようだ。



FireDACへの変換も一通りのテストはやはり必要なようで、ノンテストで置き換えられるコンポーネントはないものか。。。。無理かな?...more
posted by しんくそふと at 23:04| Comment(0) | TrackBack(0) | 開発TIPS

コンポーネントの切り替えでdfmファイルを直接書き換える

BDEからFireDACコンポーエントの書き換えなどを行う場合、dfmファイルを直接書き換えることで作業の短縮を図ることができる。
ただ、危険なので必ずバックアップを取ってから行うほうが良い。失敗すると開けなくなります。

一応、試しているのは、Delphi2007までです。これ以降のバージョンについても可能だとは思いますが、Unicodeで保存された場合は、どうなるかはまだ試していません。
まず、dfmファイルをテキスト形式で保存する必要がある。
テキスト形式かどうかは、フォーム上で、マウス右クリックで表示されるメニューで確認できる。
テキスト形式で保存された場合、テキストエディタで書き換え可能となるので、文字列変換機能などを使って、まとめて、クラスを変えてしまうことができます。
この時、pas側は変更しておく必要がありません。IDEで開いて、保存するときに、IDEが変換してくれます。
事前に、変更していくのもよいかもしれませんが、この方法だと変換されるコンポーネントが確認できます。
また、元のコンポーネントにあって、切り替え後のコンポーネントにない、プロパティやイベントは、削除されますがこれも、削除する旨の警告メッセージが出ます。

いきなり、実際に使っているプログラムを使うと、コンポーネントが多いので確認が難しいため、テスト用に、コンポーエントが少ない画面を作ってから行うほうが良いともいます。

dfmファイルを見ているとわかりますが、継承オブジェクトは、inherited。継承していないのは、objectで定義されています。
フォームも同様で、TFormから継承したFormを、TFormから直接継承するのではなく、間に継承Formを挟みたいときは、pasの書き換えとともに、dfmファイルの先頭行の、Formの定義の"object"を"inherited"に書き換えてあげれば可能です。
pasの TForm1 = class(TForm)の書き換えだけでは、ダメで、dfmの変更も必要です。
posted by しんくそふと at 22:26| Comment(0) | TrackBack(0) | 開発TIPS

2013年05月13日

FireDAC

"SI Oject Browser for Oracle"は、FireDAC(AnyDAC)を使っているみたい(エラーメッセージから判断)
posted by しんくそふと at 10:23| Comment(0) | TrackBack(0) | ざつだん

2013年05月01日

FireDAC Delphi2007で試す

WindowsXP + Delphi2007 ではインストールできない(未サポート??)

Windows7 + Delphi2007 ではOK
注)Delphi2007 は、"December 2007 Update"が適用済みでないといけない

インストールは、下記参照
http://support.embarcadero.com/jp/article/42975

FireDAC_7.0.1.3119 /showide
でインストールIDEバージョンが選択できる。
インストールされているIDE
バージョン以外は、Disenble状態となるので選択できない。


Windows7 + Delphi2007 で作成したプログラムが、特にDllなど必要なく、
Windows2000、WindowsXPでオラクル接続できることを確認。
当然、それぞれの環境に、オラクルクライアントが必要。

DelphiIDE(on Windows7)からはなぜか、オラクルクライアントなくてもつながった。勘違い。。。。?
...more
posted by しんくそふと at 15:48| Comment(0) | TrackBack(0) | おぼえ

2013年04月06日

QuickReportエラー


プロジェクト ******.exe は例外クラス EReadError (メッセージ 'プロパティ Continuous は存在しません')を送出しました。

開発時、QuickReport Ver5を使用。コンパイル時、QuickReport Ver4のオブジェクトをリンクしてしまった時に発生。
ライブラリパスを確認
posted by しんくそふと at 16:50| Comment(0) | TrackBack(0) | エラー対応覚え

2013年02月28日

SOAP アプリケーション ウィザードの使い方


SOAP アプリケーション ウィザードの使い方の場所です。

DelphiXE3
ms-help://embarcadero.rs_xe3/rad/SOAP_アプリケーション_ウィザードの使い方.html
posted by しんくそふと at 17:17| Comment(0) | TrackBack(0) | 3層スタイルC/Sアプリ作成術

2013年02月08日

ADOQuery 集計Query

ADOQueryで、集計Queryを使用するとき、LockTypeをltReadOnlyとする必要があるみたい。
デフォルトは、ltOptimisticとなっている。

デフォルトのままだと、
ORA-00937: not a single-group group function.
のエラーが出る。
posted by しんくそふと at 18:17| Comment(0) | TrackBack(0) | 開発TIPS

2012年11月27日

SOAPサーバーの実装


SOAPサーバーについては、スタンドアロンVCLアプリを採用するにしろ、CGIアプリを採用するにしろ、今のところDelphiで作れば、Windowsサーバーを使用することになる。
Windowsサーバーを直接インターネットに公開するのはちょっと。。という場合は以下の方法を使うとよい(高橋さん@エンバカに教えてもらった)。
Linuxサーバーのリバースプロキシ機能を使い、Linuxサーバーをインターネットのフロントに置き、Windowsサーバーをその後ろに隠す方法がある。

設定は、Httpd.confに下記のように2行書くだけ
ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar

詳細は、”Apache proxyPass”などで検索。
posted by しんくそふと at 14:24| Comment(0) | TrackBack(0) | 3層スタイルC/Sアプリ作成術

2012年11月26日

SOAP Interface の引数


SOAPサーバーから、複数のデータセットの内容を戻したいとき、下記のような引数を設定することになるが、

procedure SSGetMstSlave (
                           const AParam: string;
                           out ACdsMst: Variant;
                           out ACdsSlave: Variant ); stdcall;

Variantが複数あるとAccessViolation例外が発生することがある。
この場合、XMLに変換して戻すようにするか、戻り値として独自のクラスを定義する方法がある。

弊社では、
  TRtn2Class = class(TRemotable)
  private
    FRtnCode: Integer;
    FRtnMsg: string;
    FRtnVar1: Variant;
    FRtnVar2: Variant;
  published
    property RtnCode: Integer  read FRtnCode write FRtnCode;
    property RtnMsg:  string   read FRtnMsg write FRtnMsg;
    property RtnVar1: Variant  read FRtnVar1 write FRtnVar1;
    property RtnVar2: Variant  read FRtnVar2 write FRtnVar2;
  end;

のようなクラスを定義している。
(SOAPは独自クラスが定義できる。DelphiのSOAPサーバーインターフェイスの自動生成のサンプルコードにも例がある。)

下記の定義となる
function SSGetMstSlave (
                           const AParam: string ):TRtn2Class ; stdcall;
戻り値として
    FRtnCode  戻り値のコード
    FRtnMsg  エラー等のメッセージ
    FRtnVar1 ACdsMstのデータ
    FRtnVar2 ACdsSlaveのデータ
を設定するようにしている。
posted by しんくそふと at 16:58| Comment(0) | TrackBack(0) | 3層スタイルC/Sアプリ作成術

DelphiXE3版 "3層スタイルC/Sアプリ作成術"サンプル


DelphiXE3版の"3層スタイルC/Sアプリ作成術"サンプルです。

Sample_20121126.zip


今回は、C/Sモデルとそこから展開される、SOAPクライアント、SOAPサーバーのプロジェクトが入れてあります。
データベースアクセスについては、DBXからFireBirdアクセスのみです。
SOAPサーバーについては、DelphiXEから作成できるようになったVCLスタンドアロンアプリのプロジェクトと、CGIアプリのプロジェクトの2種類を作成しています。

VCLスタンドアロンアプリについては、C/Sアプリとソースを共有するため、共有リソースの排他などは考えていませんので、あくまでもデバック用として使用すると考えてください。サーバーモジュールとしてのデバックは非常に便利です。C/Sアプリで見つけられない、3層化のためのドライバモジュール部分の不具合の確認に使用できます。

Win32でのみ動作確認しています。(追記)
posted by しんくそふと at 14:30| Comment(0) | TrackBack(0) | 3層スタイルC/Sアプリ作成術

2012年11月06日

Oracel (Import出来ない)Exportファイル修復


Oracel Exportファイルが何らかの要因で壊れ、Importできないときの対応。

壊れている部分の確認を下記のサイトのツールを使って行なう。
http://atata.sakura.ne.jp/exde/

もし壊れているのが、テーブルデータ部分であれば、修復は可能。ただし、データによっては大変。

テーブルデータ部分のブロックは、先頭がInsert文でその後がデータとなっている。
データはレコードの羅列なので、変なデータがないかないかを探す。バイナリエディタを使用。
今回修復したのは運良く、レコード長が短く、先頭の項目が文字列だったため、レコードの識別が比較的しやすく問題部分の発見はそれほど難しくはなかった。
問題部分を、取り除くなどの編集(バイナリエディタで)を行い保存する。今回のファイルは、レコードの途中にNULLのデータの羅列箇所が、何箇所か出来ていたので、この部分を削除し、前後をレコードとして辻褄が合うように修復(削除)。
レコード数とかを管理しているようでなないので、変な部分を削除すれば、復旧は出来そう。

テーブルデータ部分が壊れていた場合の対応は、もう少しExportファイルの構造がわかれば何とかなりそう。
posted by しんくそふと at 16:51| Comment(0) | TrackBack(0) | データベース周り 雑感

2012年09月28日

Windows7 ゼロ除算

Windows7 64ビット版で、なぜか、Delphi7で作ったアプリで、Try...Exception.. で、Zero Divideが検出されない。

(追記)
32ビット版もおんなじだった。。。。。(ーー;)...more
posted by しんくそふと at 13:51| Comment(0) | TrackBack(0) | エラー対応覚え

2012年06月13日

BDE Decision Cube ComponentsをDelphi2007で使用

Delphi ver7に存在した、BDEのDecision Cube Componentsが、Delphi2007のコンポーネントパレット上から消えている。

ただ、ソースは残してあるようである。そこから、パレットに復原する方法。

ソースは、($BDS)\source\Win32\xtab にある。

上記ホルダにあるプロジェクトファイルを使って再構築するば良いのでだが、エラーが出る。
参照パッケージの追加が必要なようで、”参照の追加”で、dclbde.dcp の追加が必要なようである。
追加後、再構築すればOK。

Delphi2007のソースも値によってオーバーフローするバグ(?)は直っていないようで、下記の修正が必要。

//  procedure SetMemoryCapacity(Value: Integer);
  procedure SetMemoryCapacity(Value: Int64);
//  function GetMemoryCapacity: Integer;    adachi
  function GetMemoryCapacity: Int64;
〜〜〜〜
var
//  AvailableMemory: Integer;       { Memory available to allocate }   adachi
  AvailableMemory: Int64;       { Memory available to allocate }
//  TotalAllocatedMemory: Integer;  { Total allaocted by the array classes }adachi 2
  TotalAllocatedMemory: Int64;  { Total allaocted by the array classes }

定義部分のみ掲載なので、関連するメソッドのコード修正は必要。
posted by しんくそふと at 11:55| Comment(0) | TrackBack(0) | 開発TIPS

2009年11月10日

FireBirdツール

CharSet=UTF-8にて、漢字、テーブル名&フィールド名のデータが表示できるツール発見

http://www.sqlmanager.net/products/ibfb/manager

Freeware版あり。
日本語版でないので機能等ちょっと不明。

GUIツールを使った、テーブル作成、フィールド追加では漢字は使えないみたい(ちょっと残念)

データ表示は、タイトルも含めて文字化けしない。

若干文字化け部分やよくわからないワーニングが出るが、UTF-8のデータベースに関しては、IBExpertよりはましっぽい。
posted by しんくそふと at 18:11| Comment(0) | TrackBack(0) | データベース周り 雑感

2009年10月28日

(5)まとめ

・UNICODEでのFireBirdは、使用しずらい。
  テーブル名、フィールド名に漢字を使っているのが悪いのだと思うが、今まで使っていた
  IBExpertが使えない。

・IBXがUNICODEに対応できていない??
  select文でフィールド名の取得に問題あり?FireBirdは、正式サポートでないので、
  仕方ないのか。後日、InterBaseでも確認してみよう。
  TIBTableもおかしい。''で囲ったフィールド名定義にも対応できてなさそう。これも
  FireBirdだけなのかな?

・DBXのParamsのDataType
  ”IBXがUNICODEに対応できていない??”ため、DBXを使用することになったが
  ParamsのDataTypeの設定は、面倒。今回は、プログラムが小さいので、それほ
  ど苦にならないが、大きなプログラムの場合、ネックになりそう。