問題タブ [bold-delphi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - DELPHI win32用ORM
Delphi Win32のORMまたは同様のものについて知っている人はいますか。
delphi - Delphi で VMT またはヒープの破損を検出するための適切なツールは何ですか?
私は、大規模なアプリケーションに Delphi 2007 を使用しているチームのメンバーです。他に説明のつかない奇妙なバグが時々あるため、ヒープの破損が疑われます。コンパイラの Rangechecking オプションは配列専用だと思います。アプリケーションによって割り当てられていないメモリ アドレスに書き込みがあった場合に、例外またはログを記録するツールが必要です。
よろしく
EDIT : エラーのタイプは次のとおりです。
エラー: モジュール 'BoatLogisticsAMCAattracsServer.exe' のアドレス 00404E78 でアクセス違反が発生しました。アドレス FFFFFFDD の読み出し
EDIT2:すべての提案をありがとう。残念ながら、解決策はそれよりも深いと思います。ソースを所有しているため、パッチを適用したバージョンの Bold for Delphi を使用しています。おそらく、Bold フレームワークで導入されたいくつかのエラーがあります。はい、JCL によって処理され、メッセージをトレースするコールスタックを含むログがあります。したがって、例外のあるコールスタックは次のようにロックできます。
内部例外部分は、例外が再発生した瞬間のコールスタックです。
EDIT3:現在の理論は、仮想メモリテーブル(VMT)が何らかの形で壊れているというものです。これが発生した場合、その兆候はありません。メソッドが呼び出されたときにのみ例外が発生します (アドレス FFFFFFDD でALWAYS、10 進数で -35) が、それでは遅すぎます。エラーの本当の原因がわからない。このようなバグをキャッチする方法のヒントは本当にありがたいです!!! SafeMM で試してみましたが、3 GB フラグを使用してもメモリ消費量が多すぎることが問題です。だから今、私はSOコミュニティに報奨金を与えようとしています:)
EDIT4: 1つのヒントは、ログによると、この前に別の例外がしばしば(または常に)あるということです。たとえば、データベースの楽観的ロックなどです。強制的に例外を発生させようとしましたが、テスト環境では問題なく動作します。
EDIT5:話は続きます... 過去 30 日間のログを検索しました。結果:
- 「アドレス FFFFFFDB の読み出し」 0
- 「アドレス FFFFFFDC の読み出し」 24
- 「アドレス FFFFFFDD の読み取り」 270
- 「アドレス FFFFFFDE の読み出し」 22
- 「アドレス FFFFFFDF の読み出し」 7
- 「アドレス FFFFFFE0 の読み出し」 20
- 「アドレス FFFFFFE1 の読み出し」 0
したがって、現在の理論では、列挙型 (ボールド体にたくさんあります) がポインターを上書きします。上記の異なるアドレスで 5 件ヒットしました。列挙型が 5 つの値を保持し、2 番目の値が最も使用されていることを意味する可能性があります。例外が発生した場合、データベースのロールバックが発生し、Boldobjects が破棄される必要があります。おそらく、すべてが破棄されるわけではなく、列挙型がまだアドレスの場所に書き込むことができる可能性があります。これが本当なら、5 つの値を持つ列挙型の正規表現でコードを検索することは可能でしょうか?
EDIT6:要約すると、問題の解決策はまだありません。コールスタックで少し誤解を招く可能性があることは承知しています。はい、タイマーがありますが、タイマーのない他のコールスタックがあります。そのために残念。しかし、2つの共通点があります。
- アドレス FFFFFFxx の読み取りによる例外。
- コールスタックのトップは System.TObject.InheritsFrom (sys\system.pas:9237) です。
これは、 VilleKが問題を最もよく説明していることを確信させてくれます。また、問題は Bold フレームワークのどこかにあると確信しています。しかし、大きな問題は、このような問題をどのように解決できるかということです。VilleKのような Assert を提案するだけでは十分ではありません。損傷は既に発生しており、その時点でコールスタックはなくなっているからです。したがって、エラーの原因についての私の見解を説明するには、次のようにします。
- どこかでポインターに不適切な値 1 が割り当てられていますが、0、2、3 などになることもあります。
- オブジェクトがそのポインターに割り当てられます。
- オブジェクトの基底クラスにメソッド呼び出しがあります。これにより、メソッド TObject.InheritsForm が呼び出され、アドレス FFFFFFDD に例外が発生します。
これら 3 つのイベントはコード内で一緒に使用できますが、後で使用することもできます。これは最後のメソッド呼び出しにも当てはまると思います。
EDIT7:私たちは Bold Jan Norden の作者と緊密に協力しており、彼は最近、Bold フレームワークの OCL エバリュエーターにバグを発見しました。これが修正されたとき、これらの種類の例外は大幅に減少しましたが、それでも時々発生します。しかし、これがほぼ解決されたことは大きな安堵です。
sql - SQL を OCL に変換しますか?
OCL に変換したい SQL があります。SQLが苦手なのでこれでメンテナンス性を上げたい。Interbase 2009、Delphi 2007 を Bold およびモデル駆動型開発で使用しています。ここで誰かが SQL と OCL の両方を上手に話せることを願っています :-) 元の SQL:
少し単純化した後:
注: MessageType には、'IFTMBP' と 'IFTMBF' の 2 つのケースがあります。
したがって、リストされるテーブルは ScaniaEdiSolMessage です。次のような属性があります。
- MessageType: 文字列
- ChassiNumber: 文字列
- ShipFromFinland: ブール値
- 無効: ブール値
また、BoldId をキーとして RecomingOwner という名前のテーブル Parcel へのリンクもあります。
そのため、ScaniaEdiSolMessage のすべての行を一覧表示し、さらに ScaniaEdiSolMessage のすべての行を一覧表示して EdiSolMsg という名前のサブクエリを持っているようです。次に、ほぼすべての行を除外します。実際、上記のクエリは 28000 レコードから 1 つのヒットを返します。
OCL では、すべてのインスタンスを簡単にリストできます。
たとえば、選択して行を簡単にフィルタリングすることもできます。
しかし、上記の SQL に一致する OCL を作成する方法がわかりません。
delphi - Bold/Eco が提供する機能に近い Delphi 用のフレームワーク/ライブラリはありますか?
Borland/Codegear/Embarcadero の移行中に Bold/Eco に何が起こったのかはわかりませんが、Delphi の新しいバージョンでは確実に見逃しています。近いフレームワークを知っている人はいますか?
そうでない場合は、近いライブラリとコンポーネントの組み合わせを提案できるかもしれません。
unit-testing - Bold for Delphi フレームワークでコーディングする場合のテスト容易性の向上
背景 私は、物流システムに取り組む 7 人の開発者と 2 人のテスターのチームで働いています。Delphi 2007 と、Bold for Delphiをフレームワークとして使用したモデル駆動型開発を使用しています。このシステムは現在約 7 年間運用されており、約 170 万行のコードがあります。4 ~ 5 週間後に本番環境にリリースし、ほぼすべてのリリース後に、見つかっていないバグに対していくつかのパッチを適用する必要があります。もちろん、これは私たちと顧客の両方にとって苛立たしいことです。
現在のテスト もちろん、ソリューションはより自動化されたテストです。現在、手動テストを行っています。空のデータベースで開始し、モデル化されたメソッドからデータを追加する Testdbgenerator。また、GUI をテストするための非常に基本的なスクリプトを実行するTestcompleteもあります。時間がないため、これ以上テストを追加することはできませんが、スクリプトはアプリケーションの変更にも敏感です。数年前、私は DUnit で単体テストを実際に試みましたが、数日後にあきらめました。ユニット同士のつながりが強すぎる。
単体テストの前提条件 単体テストの前提条件 をいくつか知っていると思います。
- 1 つのことを行う小さなメソッドを作成しますが、それをうまく実行します。
- 繰り返さないでください。
- 最初に失敗するテストを書き、次にテストがパスするようにコードを書きます。
- ユニット間の接続は緩んでいる必要があります。彼らはお互いについてあまり知らないはずです。
- 依存性注入を使用します。
使用するフレームワーク 主に 64 ビット コンパイラのため、Delphi XE2 にアップグレードする可能性があります。私はSpringを少し見てきましたが、これにはD2007からの更新が必要であり、今は起こりません. 多分来年。
質問 ほとんどのコードはまだ自動的にテストされていません。では、古いコードのテスト容易性を高めるための最善の道は何でしょうか? それとも、新しいメソッドのみのテストを書き始めるのが最善でしょうか? 自動テストを増やす最善の方法が何であるかはわかりませんが、それについてのコメントは大歓迎です。現在 D2007 + DUnit を使用して、後で Delphi XE2 + Spring に簡単に変更できますか?
編集:手動テストの現在のテスト方法論については、クリスが言うように、「それを叩いて壊そうとする」だけです。
delphi - Delphi VCL ドラッグ アンド ドロップのバグ?
Delphi 2007 でコンパイルされた私のアプリケーションには、グリッド間でのドラッグ アンド ドロップがあり、ほとんどの場合正常に動作します。しかし、ランダムにアクセス違反が発生することがあります。VCL の Controls.pas メソッド DragTo にデバッグしました。
次のように始まります。
DragControl が nil であるため、最後の行で例外が発生します。DragControl は、TControl 型のグローバル変数です。このメソッドに assigncheck をパッチして、DragControl = nil の場合は CancelDrag を呼び出そうとしましたが、DragObject も nil であるため、これも失敗します。
DragControl が nil である理由を調べるために、DragInitControl を調査しました。DragControl が nil の場合に終了する 2 行があります。
理由かもしれません...それで私の質問です。
- ドラッグアンドドロップで同様の問題が発生した人はいますか?
- DragControl = nil を検出した場合、現在のドラッグ アンド ドロップをキャンセルするにはどうすればよいですか?
編集: 現在、これに対する解決策はありませんが、それについてさらに情報を追加できます。グリッドはスーパーグリッドと呼ばれます。これは、当社のニーズに合わせて開発した内部コンポーネントです。Devexpress から TcxGrid を継承します。グリッドがデータをリロードすると同時に、ユーザーがグリッド行をドラッグすると、この問題が発生すると思います (確かではありません)。どういうわけか、現在の行への参照が nil になります。長期的には、このスーパーグリッドを TcxGrid から継承する Bold 対応グリッド (Delphi では Bold を使用しているため) に置き換える計画があります。次に、データが変更されるとすぐにグリッドが更新され (ユーザーまたはコードで更新されません)、これで問題が解決されることを願っています。
unit-testing - 依存関係を壊して単体テストを有効にする方法
単体テストについて考えるのに多くの時間を費やしました。少なくとも、以前のコードを使った効率的な作業を電子ブックとして購入しました。古いコードの単体テストに関する素晴らしい本のようです。しかし、それでも私たちのプロジェクト Attracs は大きいので、これには出発点が必要だと思います。ユニットテストに関する私の一般的な質問も参照してください。
このアプリケーションには、クラス、属性、および関係を定義し、Bold for Delphi を使用するための UML モデルがあります。モデルを変更するたびに、ラウンドトリップを行います。これにより、ファイル businessclasses.pas および BusinessClasses_Interface.inc 内のメソッドの宣言が自動的に生成されます。変更にデータベースの変更が必要な場合は、SQL スクリプトも生成されます。これは何年もうまく機能していますが、単体テストを使用したことはありません。
そのため、新しいテストプロジェクトを追加すると、依存関係が問題を引き起こします。私は得た
[DCC エラー] Attracs_Interface_Uses.inc(10): F1026 ファイルが見つかりません: 'MsxSupport.dcu'
エラーを要約すると
AttracsTest.dpr は、Attracs_Interface_Uses.inc を使用する
BusinessClasses_Interface.inc
を使用する
BusinessClasses.pa を使用します。
では、どうすれば依存関係の連鎖を断ち切ることができますか?
実際には、ファイルははるかに大きいことに注意してください。モデルには 300 以上のクラスがあり、businessClasses.pas には 53000 行以上のコードがあります... テストケースとして、メソッド AddResponsibility を持つクラス TPerson しかありません。しかし、あなたは原則を理解する必要があります。
ここに私のファイルがあります:
AttracsTest.dpr
TestBusinessClasses.pas
Attracs_Interface_Uses
BusinessClasses_Interface.inc
Businessclasses.pas
株式会社パーソン
delphi - BOLD_CLOCKLOGテーブルのトリミング
BoldforDelphiオブジェクト永続化フレームワークを使用するアプリケーションのデータベースでメンテナンスを行っています。このデータベースは数年前から運用されており、いくつかのテーブルは非常に大きくなっています。それらの1つはBOLD_CLOCKLOG
、Boldのトランザクション管理と関係があるものです。
このテーブルをトリミングしたい(2006年1月からのエントリで最大1.2GB)。
システムがこの古い情報を必要としないことを誰かが確認できますか?
ocl - OCL でリンクされたリストをたどる
OCLの実装を持つ Delphi には Bold を使用します。OCL は、リストのフィルタリングなどに適しています。しかし、リンクされたリストをトラバースするための適切で一般的な方法は見つかりませんでした。
class があるとしPlanMission
ます。PlanMission.previous
それ自体を指す単一のリンクが含まれています。ブール属性もありますisDummy
。
PlanMissions
のインスタンスができるまでのリストをトラバースしたいisDummy
。
できます
私が本当に欲しいのは次のようなものです:
traverseList
は存在しませんが、2 つのパラメーターが必要です。
previous
: たどるリンクisDummy
: ブール条件なので、いつ停止するかがわかります
これはどのように達成できますか?
明確化を編集 Delphi コードは必要ありません。OCLのコードが必要です。Boldを使用している人は、私が何を意味するかを知っています。OCL はクエリ オブジェクト、属性などを備えたクエリ言語です。副作用がないため、読み取り専用です。OCL の概要については、こちらを参照してください。