問題タブ [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.

0 投票する
7 に答える
6982 参照

delphi - Delphi:すべての定数は一定ですが、一部の定数は他の定数よりも一定ですか?

検討:

そして、機能する別の言い回し:

説明。


次に、次のことを検討してください。

そして修正します。

編集:const宣言の前にキーワードを追加しました。誰かが彼らがconstであると信じていませんでした。

0 投票する
4 に答える
2539 参照

delphi - Delphiプロファイルをコピーする

最近、コンピューターがクラッシュしました。実行するには多くの作業が必要なDelphiアプリがあります。

私の同僚の1人は、すべてをまだインストールしています。パレットに保存されているものをコピーする方法はありますか?そして、ライブラリパス?

私はDelphi5を使用しています(非常に古いことを知っています)

0 投票する
3 に答える
2873 参照

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ですか?

0 投票する
3 に答える
1971 参照

delphi - コンソール アプリケーションの Unicode 出力を読み取る

私はコンソールアプリを持っています。Delphi 2010 で書かれています。出力は Unicode をサポートしています。(これには UTF8Encode と SetConsoleOutputCP(CP_UTF8) を使用しました)。コマンドプロンプトからプログラムを実行すると、正常に動作します。Delphi 5
で作成された別のプログラムからの出力を読みたいと思います。私はこの方法を使用します。しかし、ユニコード文字に問題があります。 コンソールアプリのユニコード出力を読むための推奨事項はありますか? Delphi 5から?

0 投票する
5 に答える
3529 参照

delphi - Delphi:高速(er)ワイドストリング連結

私はADORecordsetをhtmlに変換することを仕事としている関数を持っています:

そして、関数の内臓には、多くの広い文字列の連結が含まれます。

数千の結果が得られたため、ユーザーが感じると思われる関数の実行には時間がかかりすぎます。Delphi Sampling Profilerは、時間の99.3%@WStrCatNがワイドストリング連結(および)に費やされていることを示してい@WstrCatます。

誰もがワイドストリング連結を改善する方法を考えることができますか?Delphi5には文字列ビルダーはないと思います。また、FormatUnicodeをサポートしていません。


そして、だれもだまそうとしないことを確実にするために:あなたがインターフェースを実装しているふりをします:


アップデートワン

IXMLDOMDocumentHTMLをxmlとして構築するために、を使用することを考えました。しかし、それから私は、最終的なHTMLがそうxhtmlではなくhtml、微妙ではあるが重要な違いであることに気づきました。

アップデート2

Microsoftナレッジベースの記事:文字列連結のパフォーマンスを向上させる方法

0 投票する
5 に答える
2990 参照

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 つの住所です。

0 投票する
4 に答える
4413 参照

sql-server-2005 - Delphi-BOFまたはEOFのいずれかがTrueであるか、現在のレコードが削除されています

このエラーは、MS SQL Server 2005で空のテーブルを選択しようとしたときに表示されました:「BOFまたはEOFのいずれかがTrueであるか、現在のレコードが削除されています」。Delphi 5でTADOConnectionとTADODataSetを使用して、データベースに接続してデータを取得しました。

そのようなエラーを発生させずにデータベーステーブルが空であるかどうかを確認する方法はありますか?

0 投票する
2 に答える
8083 参照

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つの可能な方法が残っています. どれが有効ですか?

  1. Result := TRobotStream.Create(Self);
  2. Result := TRobotStream.Create(Self as IUnknown);
  3. Result := TRobotStream.Create(Self) as IStream;
  4. Result := TRobotStream.Create(Self as IUnknown) as IStream;

本当の質問

かなりの数の微妙なバグに遭遇し、コンパイラの複雑さを理解するのが困難です。これにより、私はすべてが完全に間違っていると信じるようになります。必要に応じて、私が言ったことをすべて無視して、質問に答えるのを手伝ってください。

インターフェイスの実装を子オブジェクトに委任する適切な方法は何ですか?

TContainedObjectの代わりに使用する必要があるかもしれませんTAggregatedObjectTAggregatedObjectおそらく、親が存在する必要があり、子が存在する場所で、2 つが連携して機能しTContainedObjectます。多分それは逆です。この場合はどちらにも当てはまらないかもしれません。

注:私の投稿の主要部分はすべて無視できます。それは私がそれについて考えたことを示すためでした。私が試したことを含めることで、可能な答えを毒殺したと主張する人がいます。人々は私の質問に答えるのではなく、私の失敗した質問に集中するかもしれません。

本当の目標は、インターフェイスの実装を子オブジェクトに委譲することです。この質問には、問題を解決するための私の詳細な試みが含まれてい TAggregatedObjectます。私の他の 2 つのソリューション パターンも表示されません。そのうちの 1 つは循環参照カウントに悩まされており、 は IUnknown等価規則を破っています。

ロブ・ケネディは覚えているかもしれません。そして、私の解決策の問題の解決策ではなく、問題の解決策を求める質問をするように頼まれました。

編集:文法化

編集 2:ロボット コントローラーのようなものはありません。そうですね - 私はいつも Funuc RJ2 コントローラーを使っていました。しかし、この例では違います!

編集 3*

ここでの問題は、次の呼び出し中に「親」TRobotオブジェクトが破棄されることです。

0 投票する
4 に答える
1790 参照

delphi - .png ファイルを処理できる Delphi 5 コンポーネントはありますか

.png ファイルを処理できる Delphi 5 コンポーネントはありますか?

0 投票する
4 に答える
2442 参照

delphi - カスタム値を使用した Delphi の列挙

次のように、Delphi 5 でカスタム値を使用して列挙型を宣言することは可能ですか?:

ありがとう!