問題タブ [delphi-5]
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のTFrameでOnDestroyイベントをシミュレートするにはどうすればよいですか?
DelphiでのOnDestroy
イベントをシミュレートするにはどうすればよいですか?TFrame
constructor
私はうまくフレームにとを追加しましたdestructor
、それが何をするのか考えてTForm
います:
これに伴う問題は、デストラクタが実行されるまでに、フレームのコントロールが破棄され、無効になっていることです。
この理由は、OnDestroy
イベントを発生させるために使用する包含フォームのデストラクタにあります。
フォームのデストラクタが実行されると、フレームオブジェクトのデストラクタが呼び出されます。これの問題は手遅れだということです。フォームはを呼び出しますDestroyWindowHandle
。これは、フォームのウィンドウハンドルを破棄するようにWindowsに要求します。これにより、フレーム上のウィンドウを含むすべての子ウィンドウが再帰的に破棄されます。
そのため、フレームがdestructor
実行されると、有効な状態ではなくなったコントロールにアクセスしようとします。
DelphiでのOnDestroy
イベントをシミュレートするにはどうすればよいですか?TFrame
も参照してください
delphi - DelphiでMainFormを使用しない方法は?
私は、アプリケーションでいくつかのモードレスフォームをタスクバーに表示しようとしています-Windows7の新しい便利なタスクバーを利用しています。
VCLには多くの問題があり、タスクバーにフォームが存在する前に元に戻す必要があります。
ただし、最後の問題は、VCLがメインフォームに指定したフォームを最小化すると、アプリケーション内のすべてのウィンドウが消えることです。
10年前、PeterBelow(TeamB)はこれらの問題を文書化し、それらを回避しようと試みました。しかし、解決できない問題がいくつかあります。問題はVCL自体の奥深くで発生するため、Delphiアプリケーションを適切に動作させることは事実上不可能です。
これはすべて、ツールバーに表示されるボタンがアプリケーションのウィンドウを表していないという事実に起因しています。TApplications
それは隠されていて決して見られない窓を表しています。そして、アプリケーションのがあります。これには、最小化された場合にアプリケーションに非表示にするように指示する特別MainForm
な機能が組み込まれています。
できれば
そうすれば、これらのバグはすべてなくなります。アプリケーションは非表示のウィンドウを持つことができ、その間、メインフォームを含むアプリケーション内の他のすべてのフォームを次のようにオーバーライドします。
ただし、Delphiでは、Application.MainForm
プロパティは読み取り専用です。
MainForm
Delphiでを使用できないのはどうしてですか?
も参照してください
delphi - モック: 子供が親と話さないようにするには?
モック所有者を渡してオブジェクトをテストしようとしています。元々は所有者としてPartD
a が渡されます:PartB1
PartD
今、モックを渡して機能をテストしたいと思いますowner
:
PartD
これは、所有者の所有者のいくつかのステータスを知っていることに依存するものがあることを除いて、問題なく動作します。
これにより、モックオブジェクトの問題PartD
が発生PartB1
する.PartA
Transactions
Count
で 1 つのメソッドの一部をテストすることにのみ関心があるPartD
ため、ソフトウェア全体を再設計することにはあまり関心がなく、確実に回帰が導入されるため、2 分間の修正をテストできます。私は修正に2分を費やし、テスト方法を見つけようとして6時間を失いました:
全体を再設計したいと思っていたとしても。をすべての子オブジェクトに渡すのは、
TransactionCount
変更されるたびに恐ろしい設計のように思えます。他のValidate
トランザクションがあるかどうかを知る必要がある 3 人の子供がダウンしている方法は、子供がその親に関する情報を必要とするシステムの唯一のケースではありません。親オブジェクトがこのすべての情報をすべての子に伝えた場合、必要がないかどうかにかかわらず、無駄であり、どこかで更新が失われる傾向があります。
また、子 - 子 - 子オブジェクトが新しい内部チェックを持つたびに、その周りのすべてのオブジェクトを再設計する必要があります。これにより、それらはすべて、必要な場合と不要な場合がある情報を渡すことができます。
親が望まない子オブジェクトを与えないようにしながら、必要に応じて子供が親と話すのを避けるにはどうすればよいですか?
編集:私がテストするのを待っている変更は次のとおりです。
に
delphi - Delphi:クラスをユニットから移動する方法;循環参照を避ける
質問:循環参照を避けながら、2つのクラスを独自のファイルに分割したいと思います。
私はいくつかのクラス(およびいくつかの列挙と定数)を持つユニットを持っています。誰もがタペット兄弟のクリックアンドクラックを認識します:
今は明らかに私の2つのクラスTClick
でありTClick
、非常に複雑です。管理しやすくするために、既存の外部コードを壊さずに、独自のユニットに分割TClick
して分割したいと思います。TClack
それで私の最初の亀裂は次のようになります:
完璧です、私はで利用可能なすべての同じクラスを持っていますCartalk.pas
、今私はただ書く必要がCartalk_Click.pas
ありCartalk_Clack.pas
ます:
もちろん、問題はそれでTTappetBrother
ありTSolution
、このユニットでは宣言されていません。そこで、彼らが住んでいる場所への参照を追加し、uses
それが失敗するのを見て、私の質問の中心に到達します:
との間に循環参照がCartalk
ありCartalk_Click
ます。
注:もちろん、私はCartalkユニットを持っていません。クリックして、タッパー兄弟をクラックします。これは単なる例です。実際には、ユニットに3つのクラス、20の列挙、および293の定数があります。
database - Delphi 5.0 コードによる Interbase/FireBird 接続を開く
これは古いものです!Delphi 5.0 および interbase 1.6 に関連しています。
コードで DB 接続を開こうとしています。ただし、このコードは接続の有効化に関連しています。すべてのコンポーネントは、Delphi のドラッグ アンド ドロップ ユーザー インターフェイスを使用して追加されました: DataSource1、TForm1、DBGrid、DBNavigator など。
DBGrid と DBNavigator コンポーネントを備えた TForm があります。SQLStrings に次のコードを含む TIBQuery (DataSource1 が関連付けられている) もあります。
フォームには、DBNavigator と DBGrid が DB 値を表示できるようにするこのコードがあります。DB は非常にシンプルで、単なるテーブルです: VARCHAR タイプの NEW_VALUE を持つ NEW_TABLE
次のメッセージが表示されます: 「データベースが割り当てられていません」というメッセージを含む IBClientError
OBS1: Delphi ユーザー インターフェイスでコンポーネントを手動で接続すると、DB との接続が確立されます。
delphi - ThemedDBGrid のような StringGrid をテーマにするコンポーネント
Delphi 5 と互換性のあるThemedDBGridコンポーネントのように、stringrid をテーマ化する同様のコンポーネントが存在します。
delphi - Delphi:サブクラスを逆の順序で削除する方法は?
Mike LischkeのTThemeServices
サブクラス。これにより、テーマが変更されたときにApplication.Handle
Windows(つまり)からブロードキャスト通知を受信できるようWM_THEMECHANGED
になります。
Application
オブジェクトのウィンドウをサブクラス化します。
次に、サブクラス化されたウィンドウプロシージャは、想定どおりにWM_DESTROY
メッセージを送信し、そのサブクラスを削除してから、次のメッセージを渡しWM_DESTROY
ます。
TThemeServices
オブジェクトはシングルトンであり、ユニットのファイナライズ中に破棄されます。
そして、それはすべてうまく機能します-TThemeServicesがアプリケーションのハンドルをサブクラス化した唯一の人である限り。
Application.Handle
私は同様のシングルトンライブラリを持っていますが、これもフックしてブロードキャストを受信できるようにしたいと考えています。
そして、ユニットがファイナライズすると、私のシングルトンも同様に削除されます。
今、私たちは問題に行き着きます。誰かがThemeServices
またはにアクセスすることを選択する可能性のある順序を保証することはできませんDWM
。それぞれがサブクラスを適用します。また、Delphiがユニットをファイナライズする順序もわかりません。
サブクラスが間違った順序で削除されており、アプリケーションを閉じるとクラッシュします。
直し方?私が終わった後に他の人が完了するまで、サブクラス化メソッドを十分長く保つにはどうすればよいですか?(結局、メモリをリークしたくない)
も参照してください
更新: Delphi7はを書き直すことでバグを解決しているようですTApplication
。><
Grrrr
言い換えると、TApplicationをサブクラス化しようとするのはバグであり、BorlandはMikeのを採用したときに修正しましたTThemeManager
。
TApplication
これは、サブクラスを逆の順序で削除する方法がないことを意味している可能性があります。誰かがそれを答えの形で入れて、私はそれを受け入れます。
delphi - Delphiコンポーネント:親フォントの使用方法は?
を使用するカスタムコンポーネントがありますParentFont
。
コンポーネントの構築中に、最初はコンポーネントのフォントがデフォルトに設定されていることがわかりますMS Sans Serif
。
ショーの検査Self.Font.Name: 'MS Sans Serif'
しばらくして、コンポーネントのフォントが更新され、親のフォントが反映されます。
その後、すべてが素晴らしいものになり、コンポーネントのフォントが親のフォントに変更されました(例: `MS Shell Dlg 2')。
問題は、私の子コントロールが親のフォント(つまり私のコンポーネント)と同期していないことです。
コンポーネントコンストラクター中に、子コントロールを作成します。
そして、最初FpnlBottom
はデフォルトのフォントもありMS Sans Serif
ます。
後で、コンポーネントのフォントが親のフォントに更新された場合(たとえばMS Shell Dlg 2
)、子コントロールのフォントは更新されず、残りMS Sans Serif
ます。
- 子供のコントロールの
ParentFont
所有物が尊重されないのはなぜですか? ParentFont
子コントロールのプロパティを機能させるにはどうすればよいですか?
サンプルコード
2時間ツールを使用して、管理可能で再現可能なコードに切り詰めます。
sql-server-2005 - Delphi 5 で SQL Server テーブルから longint フィールドを取得する正しい方法
SQL Server 2005 に値が -7590730850027557904 のフィールドがあり、Delphi 5 の ADO を介して取得していますが、取得したのは 7590730850027557904 でした - 負号は省略されました。SQL Server から Delphi 5 に longint 値を取得する正しい方法は何ですか?
これが私のコードです
delphi - DelphiXE環境でDelphi5を使用する
移行せずに新しいXEIDEでDelphi5プロジェクトをコンパイルすることは可能ですか?
Delphi5 IDEをかなり長い間使用していて、正直なところ、古く、使い勝手が悪く、柔軟性がありません。XEを試してみて感動しましたが、プロジェクトを新しいバージョンのDelphiに移行することに興味はありません。
それで、それは可能ですか?そうでない場合は、その点でDelphi5をサポートする他のIDEはありますか?