問題タブ [delphi-units]
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 のユニットは他の言語のクラスと同じですか?
Delphi コードを書く必要がありますが、Delphi の経験はありません。unit1
orとして知られるコードを書いてunit2
、その中のコードを使ってそれをインポートする人を見てきました。では、ユニットを Java または C# のクラスとして見ることはできますか?
delphi - モジュールの登録に初期化セクションを使用するのは良い考えですか?
分散型モジュール登録の良い解決策を探しています。
プロジェクトのすべてのモジュール ユニットを使用する単一のユニットは必要ありませんが、モジュール ユニット自体を登録できるようにしたいと考えています。
initialization
私が考えることができる唯一の解決策は、Delphi ユニットに依存することです。
私はテストプロジェクトを書きました:
ユニット2
ユニット3
4号機
ただし、これには 1 つの欠点があります。登録単位 (この場合はUnit2
s)initialization
セクションが常に最初に実行されることが保証されていますか?
セクションに関する警告をよく読んでいますが、initialization
セクションで例外を発生させないようにする必要があることを知っています。
delphi - 同じ名前のインターフェイスを実装する複数のユニットへのアクセス
バージョンに変更がある場合、サードパーティからダウンロードする必要があるユニットが 2 つ以上あります。
xml データバインドを使用してユニットを生成します。それらは次のようなものです:
ユニットtissV02
私のアプリでは、使用するユニットを選択する必要があります。
IXMLMensagemTISS は両方のユニットに共通であるため、論理的には機能しません。
インターフェイス名(IXMLMensagemTISS)の名前を変更せずにそれを行うための回避策はありますか?
コードを簡素化したいのですが、将来このタイプの多くのユニットを維持する必要があります。問題は、すべてが IXMLMensagemTISS を実装していて、それを変更するために何もできないことです。
msgV01:=tissv01.GetmensagemTISS、msgV01:=tissv02.GetmensagemTISS など、多くの msg 変数を作成したくありません。
delphi - 自分のパッケージを使用するプロジェクトで使用されているユニットを IDE に認識させるにはどうすればよいですか?
カスタム コンポーネントのパッケージを作成しています。このパッケージにより、ユーザー/開発者は、このカスタム コントロールで動作するように明示的に設計された多数の事前に作成されたユニットをプロジェクトに含めるか、独自のユニットを作成して既存のものの 1 つと同じことを行うことができます。コードが独自のユニットに実装され、特定のオブジェクトを継承し、その共通オブジェクトのカスタム実装を行う「プラグイン」のようなものと考えてください。
各「プラグイン」ユニットの最後にはinitialization
、このクラスをグローバル リストに登録する句があります。そのユニットがプロジェクト内のどこかで「使用」されている限り、グローバル リストに登録されます。このカスタム コントロールは、このカスタム コントロールを使用して、可能なすべての「プラグイン」ユニットのリストを作成します。
たとえば、次のカスタム コントロールには次のプロパティがあります。
initialization
内部的には、このインデックスは、対応するユニットのセクション内から登録された「プラグイン」の 1 つに対応しています。
これらの「プラグイン」は、最初の使用時に次のようにインスタンス化されるグローバル オブジェクトを介して登録されます。
問題は、コントロールがパッケージ内に実装されている (そして IDE にインストールされている) ため、「プラグイン」ユニットが別のプロジェクト内から「使用」されているため、パッケージがこれらのユニットの存在を検出しないことです。したがって、このカスタム コントロールも、まったく異なるコンテキストにあるため、グローバル リストにアクセスできません。
設計時にフォーム上でこのコントロールを操作するときに、これPluginIndex
を設計時に設定すると、グローバル リストに「プラグイン」が登録されていないため、失敗します。ただし、実行時に同じプロパティを割り当てると問題なく機能します。
このカスタム コントロール (各「プラグイン」ユニットのクライアント使用に依存する) を使用するアプリケーションが、使用されているこれらのユニットを実際に検出できるようにするにはどうすればよいですか?
編集
私がやっていることの最終目標は、この単一のカスタム コントロールをフォームに単純にドロップし、同じフォームで特定のユニットを「使用」させ、最後にこの単一のカスタム コントロール インスタンスで、そのインデックスを選択できるようにすることです。いつでも実際に使用する「プラグイン」の。開発者がこのカスタム コントロールを簡単に削除できるように、できるだけ多くのプロセスをカプセル化して自動化しようとしています。これを機能させるために他の多くのコードを記述する必要はありません。
編集
これは、これらの「プラグイン」ユニットがパッケージの一部であると解釈される可能性があることを認識しています。そうではありません。現在、設計時に正しく機能させるために、これらの「プラグイン」ユニットをパッケージに追加する以外に選択肢はありませんが、パッケージの一部にしたくはなく、このカスタムを使用する開発者次第です。コントロール。アプリケーションで「使用」するだけで、事前に作成された「プラグイン」ユニットとカスタムメイドのユニットの組み合わせを追加できます。
delphi - F2051 ユニットが別のバージョンでコンパイルされました (再度)
(警告: 長文を読んでください。この質問は、F2051 に関する他の多くの質問を参照しています)
ソース ツリーに PatchLibs という名前のフォルダーがあり、そこにサード パーティ ソースの変更されたファイルを置きます。
これはプロジェクトの検索パスにあります。..\Skin;..\PatchLibs
私はファイル dxBar.pas を DevExpress コントロールから Patchlibs にコピーし、実装セクションの一部のコードのみを変更しました。
さて、ビルドすると(すべてのローカル.dcu
ファイルが削除され、「クリーンアップ」されます)、悪名高いものになります:
コード行を参照しません。コンパイルを開始すると、メッセージが表示されます。
構成:
新しい VM にインストールされた新しい Delphi および DevExpress バージョン。プログラムソースツリーをコピーしました。
C:\DelphiLibs\DevExpress\VCL\Library\RS27
32ビットライブラリパスにありますそのフォルダーには、すべての DevExpress dcu が含まれています。特に
cxBarEditItem.dcu
、dxBar.dcu
($(DXVCL)\Library\RS27\Win64
ライブラリ パスもそうですが、これは Win32 アプリです)cxBarEditItem.dcu
どこにも他に出現するものはありません。dcBar.pas
そしてcxBarEditItem.pas
入っていますc:\DelphiLibs\DevExpress\VCL\ExpressBars\Sources\
(すべての cx*.* および dx*.* ファイルのディスクをスキャンしました)。そのソース フォルダは、ブラウジング パスにも存在します (
$(DXVCL)\ExpressBars\Sources
)これらは単なるユニットです(対応する
.dfm
ファイルはありません)Patchlibs には、問題のない他の変更された DevExpress ファイルがあります。そして、私が同じ問題を抱えているものがいくつかあります(だけではありません
dxBar
)。.dcu
プロジェクトは、ソースの横にファイルを配置するように設定されてい.pas
ます (ユニットの出力ディレクトリは空白です)DevExpress ファイルはプロジェクトの一部ではありません
プロジェクト内の他のソース ファイルが変更されました
のコピーをcxBarEditItem.pas
Patchlibs にプルすると、エラーは別のユニットに (繰り返し) 伝播するだけです。
多くの回答を読んだにもかかわらず (注目すべき SO の質問:なぜ私のユニットは自分のファイルの「別のバージョンでコンパイルされているのですか?」 )
、エラーが発生する理由と今回はそれを修正する方法がわかりません。インターフェイスの Uses セクションにあり
cxBarEditItem.pas
、Uses 句にありますが、なぜ再コンパイルする必要があるのでしょうか?dxBar
cxBarEditItem
もちろん、DevExpress のソース コード ディレクトリを検索パスに追加することもできますが、多くのディレクトリがあり、それらのディレクトリにも.dcu
ファイルが作成されます。実際の問題を覆い隠しており、以前の Delphi/DevExpress セットアップではこれは必要なかっ
たので、私はそれをしないことを好みます:
以前の Delphi 10.3 の 32 ビット ライブラリ パス:
Delphi 10.4 の 32 ビット ライブラリ パス:
最後の1つを上下に移動したり、変更したりして$(DXVCL)\Library\RS27
も役に立ちませんでした
これらの 5 つの Embarcadero 行は奇妙に見えます (この SO の質問を参照してください。古い対応する行に置き換えました (そして、Embarcadero に報告しました)。問題に変化はありません。
追加の調査/失敗した試み
Ian Boydは、2014 年に非常によく似た問題を抱えていました
。そこでのDavidの答え
に
基づいて、試してみることにしました。私の状況は少し異なりました.DevExコードをビルドするときに使用されたコンパイラ設定を見つけて、変更した.dxBar.pas
DevExpress インストールのサブフォルダーに2 つの.dproj
ファイルがあることに気付きました:および(要ところで)
テスト プロジェクトのすべてのコンパイラ オプションをデフォルト以外に設定し、それをすべてのデフォルトと比較することで(ほとんど) 理解できました。 UI オプションの設定とコンテンツの関係。
次に、それらの設定をプロジェクトの設定と比較したところ、次の違いが見つかりました (無関係な行は削除されています)。Packages
cxLibraryRS27.dproj
dxBarRS27.dproj
cxLibraryRS27
.dproj
.dproj
cxLibraryRS27.dproj
彼らはこれを余分に持っていました:
この余分なものがありました:
と
そして彼らはこのPropertyGroupを持っていませんでした
これらを調べてみると、これらは設定が異なり、生成された.dcu
ファイルに影響を与える可能性があると思います。
範囲チェックオフ {$R-}
オーバーフロー チェックオフ {$Q-}
{$D-} オフのローカル デバッグ シンボル
ランタイム アサーション オフ {$C-}
シンボル参照情報オフ {$L-}
{$J-} オフの書き込み可能な定数
exe off {$Y-} のデバッグ情報
だから私はこれをの一番上に置きますdxBar.pas
:
{$C-,D-,J-,L-,Q-,R-,Y-}
いいえ、成功しません...
ide - 中央ペインに表示されるユニット数を制御するには?
最近 Delphi 10.4 に移行しましたが、IDE の中央ペインに表示されるユニットが多すぎます。(XEでは発生しませんでした。)
私のメイン プロジェクト グループには、最大 15 個のプログラムがあります。
中央ペインのビューから各ユニットを手動で削除できますが、プロジェクト グループを閉じると、すべてが再び表示されます。
(Delphi XE の場合のように) 選択したプロジェクトの 1 つの Mainform が最初に表示された状態で大きなプロジェクト グループのみが開くように使用できる設定はありますか?
(複数のプロジェクトがある理由は、それらが多くの共通機能を共有し、ツールボックス スイートを形成するためです。)
アドバイスありがとうございます。