タグ付けされた質問 「delphi」

Delphiは、Object Pascalを使用してネイティブのWindows、macOS、Linux、iOS、およびAndroidアプリケーションを迅速に開発するための言語です。名前は、Delphi言語のほか、Delphiプロジェクトの編集とデバッグに役立つライブラリ、コンパイラ、およびIDEを指します。

1
Android / ARMターゲットのDelphi XExコード生成に影響を与える方法は?
2017-05-17を更新。私はこの質問の元となった会社で働いていないため、Delphi XExにアクセスできません。私がそこにいる間、問題はFPC + GCC(Pascal + C)の混合に移行することで解決されました。NEON組み込み関数は、それが違いを生むいくつかのルーチンに使用します。(FPC + GCCは、標準ツール、特にValgrindの使用を可能にするため、強く推奨されます。)信頼できる例を使用して、Delphi XExから最適化されたARMコードを実際に生成できる方法を誰かが示すことができる場合、私は答えを受け入れます。 EmbarcaderoのDelphiコンパイラはLLVMバックエンドを使用して、Androidデバイス用のネイティブARMコードを生成します。Androidアプリケーションにコンパイルする必要があるPascalコードが大量にあり、Delphiでより効率的なコードを生成する方法を知りたいです。現在、私は自動SIMD最適化のような高度な機能についてさえ話していません。合理的なコードを生成することについてだけです。確かに、パラメーターをLLVM側に渡す方法、または何らかの方法で結果に影響を与える方法が必要ですか?通常、どのコンパイラにもコードのコンパイルと最適化に影響を与える多くのオプションがありますが、DelphiのARMターゲットは単に「最適化のオン/オフ」であり、それだけです。 LLVMは適度にタイトで実用的なコードを生成できるはずですが、Delphiはその機能を奇妙な方法で使用しているようです。Delphiはスタックを非常に多用したいと考えており、通常、プロセッサのレジスタr0〜r3を一時変数としてのみ使用します。おそらく最もクレイジーなのは、通常の32ビット整数を4つの1バイトのロード操作としてロードすることです。Delphiがより優れたARMコードを生成するようにするにはどうすればよいですか? 最初は、バイトごとの読み込みはビッグエンディアンからバイト順を交換するためのものだと思っていましたが、そうではありません。実際には、32ビットの数値を4つのシングルバイトの読み込みで読み込むだけです。*アライメントされていないワードサイズのメモリロードを行わずに、32ビット全体。(それを避けるべきかどうかは別のことであり、コンパイラのバグであることを示唆しています)* この簡単な関数を見てみましょう: function ReadInteger(APInteger : PInteger) : Integer; begin Result := APInteger^; end; 最適化がオンになっていても、アップデートパック1を適用したDelphi XE7とXE6は、その関数に対して次のARMアセンブリコードを生成します。 Disassembly of section .text._ZN16Uarmcodetestform11ReadIntegerEPi: 00000000 <_ZN16Uarmcodetestform11ReadIntegerEPi>: 0: b580 push {r7, lr} 2: 466f mov r7, sp 4: b083 sub sp, #12 6: 9002 str …

2
Delphi XEカスタムビルドターゲットは常に無効になっています
.targetsIDEを介してDelphi XEプロジェクトに含めたカスタムMSBuild ファイルを作成し、プロジェクトマネージャーのコンテキストメニューから有効にしました。ファイルは検証されますが、プロジェクトファイルを再保存した後は常に無効になります。 これは、という名前のターゲットファイルの簡易バージョンですCustom.targets。 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="Hello"> <Message Text="Hello from custom target"/> </Target> </Project> スタンドアロンファイルとして、これは期待どおりに機能します。 MSBuild Custom.target /t:Hello ...コマンドラインで期待されるメッセージを表示します。 Custom.targetsIDEを介してDelphiプロジェクトに追加すると、.dprojファイルが期待どおりにプロジェクトマネージャに表示され、ファイルに次の行が含まれます... <TargetsFile Include="Custom.targets"/> IDEのプロジェクトマネージャでファイルを右クリックし、を選択しましたEnable。しかし、プロジェクトがビルドされると、Buildメッセージウィンドウが表示されます。 [MSBuild警告] Custom.targets(1):無効なインポートを無視: PathToProjectSource\\Custom.targets Project Managerでもう一度右クリックしてもEnable、期待されるの代わりにオプションが表示されDisableます。 コマンドラインでMSBuild ProjectName.dproj /t:Helloも失敗します。 .dprojファイルをハッキングして行を追加しようとしました... <Import Project="Custom.targets"/> タイピングがMSBuild ProjectName.dproj /t:Hello機能するようになりました。しかし、次回IDEからプロジェクトファイルを保存すると、<Import>ステートメントが削除されます。 誰が何が悪いのか分かりませんか?


17
アプリケーションを正しく開始できませんでした(0xc000007b)
1台のPCで開発しているクライアント/サーバーアプリがあります。今では、2つのシリアルポートが必要なので、友人からPCを借りました。 アプリをビルドしてそれを実行またはデバッグしようとすると(Delphi IDEまたはWindowsファイルマネージャーから)、「アプリケーションを正しく起動できませんでした(0xc000007b)」というエラーが表示されます。 Googlingはあまり機能しませんが、これはDelphi固有のものではなく、他のアプリで発生することを示しているようです。これは、64ビットアプリから32ビットDLLを呼び出すこと、またはその逆によって引き起こされたようです。 両方のPCがWindows 7、64ビット どちらにも32ビットしか処理できないDelphi Xe2スターターエディションがあります。 このアプリは私のPCでは問題なく動作しますが、私の友人では動作しません 他のDelphiアプリは両方のPCで正常に動作します これを追跡する方法について誰かにヒントを教えてもらえますか?
159 windows  delphi  64-bit 

1
Delphi XEのSOAPサーバーとクライアントアプリケーションのVCL + indyデモ?
Delphiには、Webサービス用のデモフォルダが含まれていましたが、これは含まれていないようです。 Delphi 7のデモプロジェクト(SOAPDMServerWAD、UIがほとんどないサーバー、)を試してみたところ、Delphi 7 SOAPDMClientでも機能させることができませんでした。 Delphi XEまたはDelphi 2010で、以前のSOAPDMServerWAD+SoapDMClientデモと同じように、Delphi XEで機能し、少なくともDelphi SOAP Serverアプリケーションウィザードからの最小限のUIを使用して同様のデモを行ったことがあれば、それは完璧です。 更新:デモはDelphi 2010まで表示されますが、廃止されたWAD(web-app-debugger)を使用しています。新しいIndyに移植しようとしruntime/web-app-development-harnessing-codeましたが、動作しないようです。デモは実行されますが、サーバーにはユーザーインターフェイスがなく、HTTPサーバーを実行していないようです(通常のWebブラウザーを使用して、http://localhost:port/URL を介してテストされています。ところで、デモをグーグルで試すと、このURLが表示されます。 1時間もたたないうちに尋ねた。それは恐ろしいことだ、グーグル。 Update2下記の私自身の回答を参照してください。リンクはすぐに機能するコードで提供されます。

2
Firemonkeyで「アクティベートなし」フォームを作成する方法
XCodeでは、これらのメソッドをNSViewサブクラスに追加することにより、ウィンドウをクリックしたときにウィンドウがアクティブになるのを防ぐことができます。 - (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent )theEvent { return YES; } - (BOOL)acceptsFirstMouse:(NSEvent )theEvent { return YES; } - (void)mouseDown:(NSEvent )theEvent { [[[NSApp]] preventWindowOrdering]; } Windowsプラットフォームでは、次の単純なコードによって実行されます。 HWND hWnd = FindWindowW((String("FM") + fmxForm->ClassName()).c_str(), fmxForm->Caption.c_str()); SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE); NSViewをサブクラス化して、FMX TFormをクリックしたときにアクティブにならないようにするにはどうすればよいですか? FireMonkeyで「アクティブ化しない」フォームを作成するにはどうすればよいですか?

8
DelphiでのEProgrammerNotFound例外?
Delphi 2009では、SysUtils.pasの425行目にこれが含まれています。 EProgrammerNotFound = class(Exception); これは単にイースターエッグですか、それとも深刻なものですか? この例外はいつ発生しますか? Delphi PrismやFree Pascalにも存在しますか? Q:この例外クラスはまだDelphi(現在はXE7)で宣言されていますか?A:はい、それも文書化されています! ソフトウェア障害を示す非標準的な方法。 代わりにEProgrammerNotFoundを使用して、実行時に検出されたソフトウェア障害を示すことができます。

8
グローバルホットキーを登録したプロセスを確認してください。(Windows API)
私が知る限り、Windowsには、どのアプリケーションがグローバルホットキーを(RegisterHotkeyを介して)登録したかを通知するAPI関数がありません。RegisterHotkeyがfalseを返した場合にのみホットキーが登録されていることを確認できますが、誰がホットキーを「所有」しているかはわかりません。 直接APIがない場合、回り道はありますか?Windowsは、登録された各ホットキーに関連付けられたハンドルを維持します。この情報を取得する方法がないことは少し厄介です。 機能しない可能性のあるものの例:登録されたホットキーを送信(シミュレーション)し、Windowsがそれを登録したプロセスに送信するホットキーメッセージをインターセプトします。まず、メッセージを傍受しても宛先ウィンドウハンドルが明らかになるとは思わない。第2に、たとえ可能であったとしても、ホットキーを送信するとさまざまなプログラムからあらゆる種類の潜在的に望ましくないアクティビティがトリガーされるため、それを行うことは悪いことです。 それは重要なことではありませんが、私はそのような機能に対する頻繁な要求を見てきました。私自身は、UIまたはドキュメントのどこにもそれを開示することなくホットキーを登録するアプリケーションの犠牲者になっています。 (Delphiで働いており、WinAPIの見習いにすぎません。親切にしてください。)

3
Delphi言語の機能と、それらが導入または廃止されたバージョンのリスト
始める前に、私はそのようなことをGoogleを介して正直かつ真剣に繰り返し徹底的に検索し、見つけられなかったことを指摘しておきます。 すべてのDelphi(2007から最新のリリースバージョンまで、2007より前のバージョンはサポートされなくなりました)のすべてのDelphi(開発中のプロジェクト)のリストが必要です。「言語機能」、およびそれらが導入されたバージョンと(該当する場合)非推奨、改善、または削除。 Stack Overflowでこれと同様の質問を以前に書きましたが、それらのほとんどは「どの機能が最適」の形で表現されており、不適切と見なされて閉じられました。 誰かがそのようなリストを知っている(またはリストをコンパイルするのに十分な時間がある)場合は、私は非常に感謝します。 受け入れられた回答には、そのようなリストへのリンク、またはリスト自体が含まれます。

4
Windowsフォントのスケーリングが100%を超える場合にGUIを適切に動作させるには
Windowsコントロールパネルで大きなフォントサイズ(125%、150%など)を選択すると、何かがピクセル単位で設定されるたびに、VCLアプリケーションに問題が発生します。 を取るTStatusBar.Panel。ちょうど1つのラベルが含まれるように幅を設定しましたが、大きなフォントではラベルが「オーバーフロー」します。他のコンポーネントと同じ問題。 デルの一部の新しいラップトップは、デフォルト設定として125%ですでに出荷されているため、以前はこの問題は非常にまれでしたが、現在は非常に重要です。 この問題を克服するために何ができますか?

2
Delphiプログラムまたはコンパイラが生成したデバッグ情報からローカル変数情報(アドレスとタイプ)をどのように抽出しますか?
私の目標は: Delphiでコンパイルされた32ビットまたは64ビットのWindowsプログラムで中断されたスレッドを指定して、スタックをウォークする(実行可能) スタックエントリを指定して、各メソッドのローカル変数とその値を列挙します。つまり、少なくとも、それらのアドレスとタイプ(integer32 / 64 / signed / unsigned、string、float、record、class ...)を見つけ、それらの組み合わせを使用して値を見つけることができます。 1つ目は問題ありませんが、この質問に関する2つ目です。高レベルで、Delphiのスタックエントリを指定してローカル変数をどのように列挙しますか? 低レベルでは、これは私が調査してきたものです: RTTI:メソッドに関するこの種の情報はリストしません。これは、私が実際に現実的な選択肢であると思ったものではありませんでしたが、とにかくここにリストします。 デバッグ情報:デバッグビルド用に生成されたデバッグ情報をロードします。 マップファイル:詳細なマップファイル(テキスト形式のファイルです。ファイルを開いて確認してください)にも、ローカル変数情報は含まれていません。基本的には、アドレスとソースファイルの行番号のリストです。アドレスとファイルの行の関連付けに最適です。たとえば、樋の青いドットです。より詳細な情報には不向き リモートデバッグ情報(RSMファイル)- その内容や形式に関する既知の情報はありません。 TD32 / TDSファイル:現在の研究内容。それらは他の多くの情報の中でグローバルとローカルのシンボルを含んでいます。 ここで遭遇する問題は次のとおりです。 TD32ファイル形式のドキュメントはありません(見つけられます)。 それらに関する私の知識のほとんどは、それらを使用するJedi JCLコード(JclTD32.pas)からのものであり、そのコードの使用方法や、ローカル変数を表示するのに十分な構造があるかどうかはわかりません。私はそれがグローバルシンボルを処理することを確信していますが、ローカルについては非常に不確かです。多種多様な定数が定義されており、形式に関するドキュメントはありません。それらが何を意味するかを読むために、私は推測しておきます。ただし、これらの定数とその名前はどこかに由来している必要があります。 TDS情報を使用して見つけることができるソースは、ローカルシンボルをロードまたは処理しません。 これが正しいアプローチである場合、この質問は「TDS / TD32ファイル形式のドキュメントはありますか?ローカル変数をロードするコードサンプルはありますか?」 コードサンプルは必須ではありませんが、最小限の場合でも非常に便利です。

10
Delphi変数はデフォルトで値で初期化されますか?
私はDelphiを初めて使用し、デフォルトで初期化されているオブジェクト変数とスタック変数を確認するためにいくつかのテストを実行してきました。 TInstanceVariables = class fBoolean: boolean; // always starts off as false fInteger: integer; // always starts off as zero fObject: TObject; // always starts off as nil end; これは私が他の言語で慣れている動作ですが、Delphiでそれを信頼しても安全かどうか疑問に思っていますか?たとえば、コンパイラの設定に依存しているのか、それともマシンによって動作が異なるのかと思います。オブジェクトのデフォルトの初期化値に依存するのは普通ですか、それともコンストラクタですべてのインスタンス変数を明示的に設定していますか? スタック(プロシージャレベル)変数については、私のテストでは、単一化されたブール値がtrue、単一化された整数が2129993264、未初期化オブジェクトが無効なポインター(つまりnilではない)であることを示しています。それらにアクセスする前に、常にプロシージャレベルの変数を設定するのが標準であると思いますか?

1
FastMMによって特定のメモリブロックが解放されなかったかどうかをプログラムで確認する方法はありますか?
メモリブロックが解放されなかったかどうかを検出しようとしています。もちろん、マネージャーはダイアログボックスまたはログファイルでそれを通知しますが、データベースに結果を保存したい場合はどうなりますか?たとえば、データベーステーブルに、特定のブロックを割り当てたルーチンの名前を付けたいと思います。 FastMMのドキュメントを読んだ後、バージョン4.98以降、メモリの割り当て、解放、再割り当てが発生すると、マネージャから通知を受ける可能性があることがわかりました。たとえば、OnDebugFreeMemFinishイベントはPFullDebugBlockHeader有用な情報を含むaに渡されます。PFullDebugBlockHeader不足していることが1つあります。指定されたブロックがアプリケーションによって解放された場合の情報です。 OnDebugFreeMemFinish解放されていないブロックに対してのみ呼び出されない限り?これは私にはわからないので知りたいです。 問題は、OnDebugFreeMemFinishイベントにフックしてもブロックが解放されたかどうかを確認できなかったことです。 次に例を示します。 program MemLeakTest; {$APPTYPE CONSOLE} uses FastMM4, ExceptionLog, SysUtils; procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer); begin //This is executed at the end, but how should I know that this block should be freed //by application? Unless this is executed ONLY for not freed blocks. end; procedure Leak; …

1
Delphi XMLデータバインディングウィザードの使用時に必要なタグが存在しない
で使用しXML Data Binding WizardていDelphi XE2ます。スキーマには、このタイプの必須タグがあります。 <xs:element name="MyReport" type="MyReportType" /> <xs:complexType name="MyReportType"> <xs:all> <xs:element name="Header" type="HeaderType" /> <xs:element name="Values" type="ValuesType" /> <xs:element name="Events" type="EventsType" /> </xs:all> </xs:complexType> 問題は、たとえばValues-groupに要素を追加しない場合、-tagがなく<Values>、XMLファイルがに対する検証に失敗することXSDです。インターフェースがValues-タグを「追加」するためのメソッドを提供している場合、これはおそらく問題にはなりません。 これを処理する標準的な方法はありますか、または生成されたコードを誤って使用していますか? 簡単に言えば存在する、任意のコードを使用して、ワークアラウンド又はそうでなければ、方法は、Data Binding Wizard以下を生成するために、XML所与の(子ノードが存在しない場合に上記のスキーマを使用して検証するために必要とされるものである)HeaderType、ValuesTypeおよびEventsType複合型のものです: <MyReport> <Header /> <Values /> <Events /> </MyReport> (<xs:sequence>最終的なXMLファイルで正しい順序を強制しないことによって生成されたコードなど、他にも同様の問題があることは知っていますが、少なくともその問題については、単純に子を正しい順序で挿入することによる回避策があります。Embarcaderoこれらの機能の多くを考慮に入れている完全なインターフェースを提供するのは良いことです。
99 xml  delphi  xsd  delphi-xe2 


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.