問題タブ [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:すべての定数は一定ですが、一部の定数は他の定数よりも一定ですか?
検討:
そして、機能する別の言い回し:
説明。
次に、次のことを検討してください。
そして修正します。
編集:const
宣言の前にキーワードを追加しました。誰かが彼らがconstであると信じていませんでした。
delphi - Delphiプロファイルをコピーする
最近、コンピューターがクラッシュしました。実行するには多くの作業が必要なDelphiアプリがあります。
私の同僚の1人は、すべてをまだインストールしています。パレットに保存されているものをコピーする方法はありますか?そして、ライブラリパス?
私はDelphi5を使用しています(非常に古いことを知っています)
windows - Delphi: WM_SettingChange/WM_WinIniChange に応答するには?
アプリケーションがいつWM_SETTINGCHANGE
メッセージを受信したかを知る必要があります (以前は と呼ばれていましたWM_WININICHANGE
)。
問題は、TApplicationのメッセージ ポンプがメッセージをブラック ホール (デフォルト ハンドラ) に送信してから、それを確認できるようになることです。
プロシージャCheckIniChange()
は、処理できるイベントをスローしませんMouse.SettingChanged()
。
そして、コード パスが に達するDefault
と、排水口に送られDefWindowProc
、二度と見られることはありません (WndProc が最初に行うことは、Message.Result
をゼロに設定するためです。
私はハンドラーを TApplicationEvents.OnMessage イベントに割り当てたいと思っていました:
ただし、OnMessage イベントは、メッセージ ポンプを介して受信したメッセージに対してのみスローされます。WM_SETTINGCHANGE
メッセージは「処理」されるため、
システム。
Windowsブロードキャストに応答するにはどうすればよいWM_SETTINGCHANGE
ですか?
delphi - コンソール アプリケーションの Unicode 出力を読み取る
私はコンソールアプリを持っています。Delphi 2010 で書かれています。出力は Unicode をサポートしています。(これには UTF8Encode と SetConsoleOutputCP(CP_UTF8) を使用しました)。コマンドプロンプトからプログラムを実行すると、正常に動作します。Delphi 5
で作成された別のプログラムからの出力を読みたいと思います。私はこの方法を使用します。しかし、ユニコード文字に問題があります。
コンソールアプリのユニコード出力を読むための推奨事項はありますか? Delphi 5から?
delphi - Delphi:高速(er)ワイドストリング連結
私はADORecordset
をhtmlに変換することを仕事としている関数を持っています:
そして、関数の内臓には、多くの広い文字列の連結が含まれます。
数千の結果が得られたため、ユーザーが感じると思われる関数の実行には時間がかかりすぎます。Delphi Sampling Profilerは、時間の99.3%@WStrCatN
がワイドストリング連結(および)に費やされていることを示してい@WstrCat
ます。
誰もがワイドストリング連結を改善する方法を考えることができますか?Delphi5には文字列ビルダーはないと思います。また、Format
Unicodeをサポートしていません。
そして、だれもだまそうとしないことを確実にするために:あなたがインターフェースを実装しているふりをします:
アップデートワン
IXMLDOMDocument
HTMLをxmlとして構築するために、を使用することを考えました。しかし、それから私は、最終的なHTMLがそうxhtml
ではなくhtml
、微妙ではあるが重要な違いであることに気づきました。
アップデート2
Microsoftナレッジベースの記事:文字列連結のパフォーマンスを向上させる方法
delphi - Delphi:イベント変数のアドレスを取得するには?
イベント ハンドラーを保持する変数のアドレスを取得するにはどうすればよいですか?
例えば
プライベート メンバ、イベント ハンドラ、変数のアドレスが必要です。FOnChange
なんで?
誰が私のFOnChange
ハンドラ変数をジャンクで上書きしているのかを突き止めようとしています。
私はコードをステップ実行しています:
イベント ハンドラーが割り当てられることはなく、しばらくの間、FOnChange
変数はnil
ウォッチ ウィンドウに表示されます。
しかし、後でFOnChange
変数はがらくたに変わっています:
FOnChange
だから私はCPUウィンドウのデータペインで変数を監視したいので、次のように監視できます:
に
のアドレスがわからないことを除いてFOnChange
; 私はちょうど作った$410018
。
イベント変数のアドレスを見つけるにはどうすればよいですか?
私が試したこと
ウォッチリスト
Alt+F5
- 変更時:
OnChange: TNotifyEvent $253B588
- FOnChange: 'FOnChange' の検査中にエラーが発生しました: 式エラー
- Self.FOnChange: 'Self.FOnChange' の検査中にエラーが発生しました: 式エラー
- @オンチェンジ:
@OnChange: Pointer $253B588
- @@OnChange : '@@OnChange' の検査中にエラーが発生しました: 式エラー
- @FOnChange :
@FOnChange: Pointer $253B588
- @@FOnChange :
@@FOnChange: ^Untyped (no address)
データ: @@FOnChange $253B588`
コンセンサスは住所にあるよう0x253B588
です。
しかし、サンプルコードを実行すると:
それは次のようになります。
の住所が見つからないのも不思議ではありませんFOnChange
。2 つの住所です。
sql-server-2005 - Delphi-BOFまたはEOFのいずれかがTrueであるか、現在のレコードが削除されています
このエラーは、MS SQL Server 2005で空のテーブルを選択しようとしたときに表示されました:「BOFまたはEOFのいずれかがTrueであるか、現在のレコードが削除されています」。Delphi 5でTADOConnectionとTADODataSetを使用して、データベースに接続してデータを取得しました。
そのようなエラーを発生させずにデータベーステーブルが空であるかどうかを確認する方法はありますか?
delphi - Delphi:インターフェイスの実装を子オブジェクトに委譲する方法は?
私は、特に複雑なインターフェースの実装を子オブジェクトに委譲するオブジェクトを持っています。これこそまさにの仕事だと思いますTAggregatedObject
。「子」オブジェクトは「コントローラ」への弱い参照を維持し、すべてのQueryInterface
リクエストは親に戻されます。IUnknown
これにより、常に同じオブジェクトであるルールが維持されます。
したがって、私の親 (つまり"Controller"IStream
) オブジェクトは、インターフェイスを実装することを宣言します。
注:これは架空の例です。私がこの単語を選んだのは、
Robot
複雑に聞こえるからです。また、単語の長さはわずか 5 文字で、短いためです。私もIStream
短いので選びました。IPersistFile
またはを使用するつもりでしIPersistFileInit
たが、それらは長くなり、サンプルコードを実現するのが難しくなります。言い換えれば、これは架空の例です。
これで、実装する子オブジェクトができましたIStream
:
残っているのはこれだけです。これが私の問題の始まりです。RobotStream
要求されたときに作成することです。
このコードはコンパイルに失敗し、エラーが発生しますOperator not applicable to this operand type.
。
これは、Delphi が をas IStream
実装していないオブジェクトに対してを実行しようとしているためIUnknown
です。
IUnknownメソッドが存在する可能性がありますが、オブジェクトはサポートしていることを通知しませんIUnknown
。インターフェイスがなければIUnknown
、DelphiQueryInterface
はキャストを実行するために呼び出すことができません。
だから私は自分のTRobotStream
クラスを変更して、欠落しているインターフェースを実装していることを宣伝します(それはそうです;それはその祖先から継承しています):
そして今、それはコンパイルされますが、次の行で実行時にクラッシュします:
何が起こっているかはわかりますが、その理由を説明することはできません。Delphi はIntfClear
、親Robot
オブジェクトで、子オブジェクトのコンストラクタの途中で を呼び出しています。
これを防ぐ適切な方法がわかりません。私はキャストを強制しようとすることができます:
参照を維持することを願っています。参照を保持していることがわかりました-コンストラクターの途中でクラッシュしません。
注:これは私にとって混乱を招きます。インターフェイスが必要な場所にオブジェクトを渡しているためです。私は、コンパイラが暗黙的に型キャストを実行していると仮定します。
Result := TRobotStream.Create(Self
IUnknownとして);
呼び出しを満たすために。構文チェッカーがエラーを出さなかったという事実から、すべてが正しいと思いました。
しかし、クラッシュは終わっていません。私は行を次のように変更しました:
そして、コードは確かにTRobotStream
私の親オブジェクトを破壊することなくのコンストラクターから戻りますが、スタックオーバーフローが発生します。
その理由は、TAggregatedObject
すべてQueryInterface
(つまり、型キャスト) を親オブジェクトに戻すことです。私の場合、 aTRobotStream
を anにキャストしていIStream
ます。
TRobotStream
の最後にそのことを尋ねるIStream
と:
向きを変え、コントローラーにIStream
インターフェイスを要求します。これにより、次の呼び出しがトリガーされます。
向きを変えて呼び出します:
ブーム! スタックオーバーフロー。
やみくもに、最終的な へのキャストを削除してIStream
、Delphi に暗黙的にオブジェクトをインターフェイスにキャストさせます (上記で見たものは正しく動作しません)。
そして今、クラッシュはありません。私はこれをあまり理解していません。複数のインターフェイスをサポートするオブジェクトを作成しました。Delphi がインターフェースをキャストすることを知っているのはどうしてでしょうか? 適切な参照カウントを実行していますか? 私はそうではないことを上で見ました。顧客のためにクラッシュを待っている微妙なバグはありますか?
だから私は私の1行を呼び出すために4つの可能な方法が残っています. どれが有効ですか?
Result := TRobotStream.Create(Self);
Result := TRobotStream.Create(Self as IUnknown);
Result := TRobotStream.Create(Self) as IStream;
Result := TRobotStream.Create(Self as IUnknown) as IStream;
本当の質問
かなりの数の微妙なバグに遭遇し、コンパイラの複雑さを理解するのが困難です。これにより、私はすべてが完全に間違っていると信じるようになります。必要に応じて、私が言ったことをすべて無視して、質問に答えるのを手伝ってください。
インターフェイスの実装を子オブジェクトに委任する適切な方法は何ですか?
TContainedObject
の代わりに使用する必要があるかもしれませんTAggregatedObject
。TAggregatedObject
おそらく、親が存在する必要があり、子が存在する場所で、2 つが連携して機能しTContainedObject
ます。多分それは逆です。この場合はどちらにも当てはまらないかもしれません。
注:私の投稿の主要部分はすべて無視できます。それは私がそれについて考えたことを示すためでした。私が試したことを含めることで、可能な答えを毒殺したと主張する人がいます。人々は私の質問に答えるのではなく、私の失敗した質問に集中するかもしれません。
本当の目標は、インターフェイスの実装を子オブジェクトに委譲することです。この質問には、問題を解決するための私の詳細な試みが含まれてい
TAggregatedObject
ます。私の他の 2 つのソリューション パターンも表示されません。そのうちの 1 つは循環参照カウントに悩まされており、 はIUnknown
等価規則を破っています。ロブ・ケネディは覚えているかもしれません。そして、私の解決策の問題の解決策ではなく、問題の解決策を求める質問をするように頼まれました。
編集:文法化
編集 2:ロボット コントローラーのようなものはありません。そうですね - 私はいつも Funuc RJ2 コントローラーを使っていました。しかし、この例では違います!
編集 3*
ここでの問題は、次の呼び出し中に「親」TRobot
オブジェクトが破棄されることです。
delphi - .png ファイルを処理できる Delphi 5 コンポーネントはありますか
.png ファイルを処理できる Delphi 5 コンポーネントはありますか?
delphi - カスタム値を使用した Delphi の列挙
次のように、Delphi 5 でカスタム値を使用して列挙型を宣言することは可能ですか?:
ありがとう!