問題タブ [tform]
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 アプリケーションは「遅延読み込み」を使用しており、実際に参照されるまでフォーム コンポーネントの読み込みを遅らせると聞いています。これは別の投稿で言及されていました。
これは Delphi で作成されたアプリケーションにも当てはまると思いますが、VCL ソースに遅延読み込みに関する記述が見当たらず、存在する場合は別の名前で呼ばれている可能性があります。
通常の使用では、アプリケーションが頻繁に起動されず、長時間実行される場合、実際に初めて使用するときに、起動時間を短縮して VCL コンポーネントの描画を高速化することが望ましい場合があります。
Delphi プログラマーはこれを制御できますか? (LazyLoad := false ;
うまくいきませんでした;-)
delphi - TForm.Handle がフィールドではなくゲッターであるのはなぜですか?
最近、複雑なバグをデバッグしていました。Form.Handle
存在しない(ガベージ ポインター)にアクセスしたことが原因でした。このバグは、私にとってかなり予想外の方法で明らかになりました。フォームにアクセスするHandle
と、サイズ変更と再描画が発生しました。
ガベージ ポインターによるアクセスForm.Handle
は、ガベージ THandle を返すだけだと思います。Handle
がフォームの作成時に一度作成され、フォームが破棄されるまで同じままであることを期待しています。
質問
なぜそうなのか、それTForm.Handle
はフォームの作成時に初期化され、経由でアクセスされるフィールドではありません
、しかしゲッターです
CreateWnd
最初のアクセス時にハンドルとウィンドウ()さえ作成しますか?
delphi - Delphi からフォームのタイトルバーの色を取得する
私の質問は簡単ですが、それに関する情報が見つかりません。Delphi から、TitleBar に関する情報を検出する必要があります。たとえば、どれが高さで、特にどれがその色ですか? いくつかの Windows API があると思いますが、Web 上には何も見つかりませんでした。誰かがこれらのタスクに到達する方法を教えてもらえますか?
delphi - 設計時に TForm.Position が poDefault に設定されている場合にのみ TForm.SetBounds が正しく機能するのはなぜですか
私は非常に奇妙なことに気づきました。フォームを閉じるときに上、左、幅、高さのプロパティを保持し、この情報を使用して、以前に保存された情報を使用して SetBounds を呼び出すことにより、フォームが再び開かれたときにフォームの最後の位置を復元します。これはうまく機能しますが、フォームの Position プロパティが設計時に poDefault に設定されている場合に限られます。poDesigned、poScreenCenter、poMainFormCenter などの別の値に設定した場合、SetBounds はフォームの以前の位置とサイズを復元しません。
ここが奇妙な部分です。問題のように見えるのは、設計時に Position プロパティが何に設定されているかです。実行時にこのプロパティの値を poDefault に変更できますが、SetBounds の呼び出しはまだ正しく機能しません。私は次のようなものを試しました
フォームの OnCreate イベント ハンドラーとオーバーライドされたコンストラクターの両方で (コンストラクターで Position を poDefault に設定し、OnCreate イベント ハンドラーで SetBounds を呼び出しました)。いずれの場合も、実行時にフォームの Position プロパティを poDefault に変更しても、SetBounds で確認した問題は修正されません。私が見つけた唯一の一貫したパターンは、フォームの Position プロパティが設計時に poDefault であった場合にのみ SetBounds が機能することです。
設計時にフォームの Position プロパティが poDefault に設定されていない場合に SetBounds がどのように機能するかに関して、私が気付いたことが他にもあります。たとえば、設計時に Position プロパティが poScreenCenter に設定されているフォームは、SetBounds を呼び出した場合、画面の中央に表示されるとは限りません。ただし、SetBounds で定義された左上の位置には表示されず、SetBounds の呼び出しで指定された幅と高さも考慮されません。ただし、SetBounds を呼び出す前に、フォームの Position プロパティを poDefault に設定していることを繰り返しましょう。2 つの操作の間に Application.ProcessMessages への呼び出しをスタックしましたが、それでも問題は解決しません。
Windows 10 で実行されている Delphi 10.1 Berlin でこれを広範囲にテストしました。また、Windows 7 で Delphi XE6 を使用してテストしました。同じ結果です。
疑問がある場合は、4 つのフォームを含む VCL アプリケーションを作成してください。最初のフォームに 3 つのボタンを配置し、各ボタンに次の OnClick のようなものを追加します。
ここで、コンストラクターは TForm2 を作成し、次に TForm3 と TForm4 を作成します。
フォーム 2 ~ 4 の OnCreate で、次のコードを追加します。
form2 では Position を poDefault に設定し、form3 では Position を poScreenCenter に設定し、form4 では Position をデフォルトの poDefaultPosOnly に設定したままにします。form2 のみが 500, 500 に表示され、幅は 500、高さは 500 です。
誰かがこの結果の論理的な説明を持っていますか?
delphi - TForm の子孫のクラス名が重要なのはなぜですか?
以下の VCL フォーム アプリケーションでは、Application.MainForm が非表示になり、代わりに別の TForm の子孫が表示されます。奇妙なことに、この TForm の子孫の名前が「TForm」で始まる場合にのみ、Alt+Tab を押したときに表示されます。その名前が「TForm」で始まらない場合、Alt+Tab を押しても表示されません。上記は、Windows 10 Ann Edition x64 上の Delphi XE-Berlin でテストされています。
ここでクラス名が重要な理由についてコメントしていただけませんか? O_O
さらに、TForm の子孫のクラス名は別の場所で重要ですか?
プログラム
メイン フォームのユニット (つまり、Application.MainForm)
実際の「メイン」フォームの単位
この問題If its name does not start with "TForm", it can not be seen when Alt+Tab.
は、次のコードで明らかになります。唯一の違いは、クラス名が TFormActualMainForm から TXFormActualMainForm に変更されたことです。
プログラム
実際の「メイン」フォームの単位
delphi-xe - 同じマシン上の 2 つのアプリで Delphi の画面サイズが異なります...解決方法は?
同じフォームのいくつかを使用する 2 つのアプリケーションがあります。アプリケーションを実行すると、これらのフォームの表示が異なることに気付きました。このコードをプロジェクト ソースの先頭に配置します。
aDAM2-screen.txt が示した: aDAM2.Desktop TLHW: 0, 0, 720, 1280
aDAM3-screen.txt が示した: aDAM3.Desktop TLHW: 0, 0, 1080, 1920
これがどのように発生するのか理解できず、特に TScreen プロパティが読み取り専用であることを考えると、これを解決するのに途方に暮れています。