2010-11-26 5 views
0

この質問の最初のバージョンは具体的なものになっている可能性がありますので、より一般的な方法で質問してみます:子コンポーネントのプロパティに基づいてフレームのプロパティを設定するにはどうすればよいですか?

私はコンポーネントがあるフレームを持っています。

constructor TMyFrame.Create(AOwner: TComponent); 
begin 
    inherited; 

    if Button1.Tag = 100 
    then DoSomething 
    else DoSomethingElse; 
end; 
:私はコンポーネントのプロパティを変更し、フォームにフレームを配置した後、私はこのような何かをしたいのは、私がフレームコンストラクタで100

にボタン上のタグを設定しましょう

この時点(作成中)にボタンのタグがまだ0であることがわかりました。誰かがこれを行う別の方法をお勧めしますか?

このアプリケーションでは、ユーザーがSQL文を入力できる場所がいくつかあります。これを容易にするために、SynEditコンポーネントを使用します。この目的のために、いくつかの拡張機能を備えたフレームを作成しました。

時にはデータ認識バージョン(TDBSYnEdit)が必要な場合もあり、それ以外の場合は通常のバージョン(TSynEdit)が必要になることがあります。これを解決するためにフレーム上にページコントロールを配置し、デザイン時に正しいページに切り替えます。タブは隠れているので、ユーザーはこれが起こるかどうかわかりません。

問題は、開発者がページコントロールに正しいページを設定することを忘れたり、誤って間違ったページを選択することがあることです。私は、フレーム

if DBSQLMemo.DataField > '' 
    then pcMemos.ActivePage := tsDataAware 
    else pcMemos.ActivePage := tsNonDataAware; 

でイベントを作成して私の理論に次のコードを追加することで、この問題を解決したかった

により、開発者は、エディタのデータソース/データフィールドのプロパティを設定した場合、フレームはで使用されるべきであるということでした"データ認識モード"、およびデータ認識エディタが表示されている必要があります。判明したように、作成の瞬間にこれらの特性は設定されません。

この問題をどのように解決すればよいですか?

答えて

3

「ロード済み」プロシージャをオーバーライドするのはどうですか?次に、すべての子コンポーネントがロードされたら、必要なコンポーネントをスキャンします。

フレームの

interface 

... 
protected 
    procedure Loaded; override; 
... 

implementation 

procedure Loaded; 
var 
    i: Integer; 
begin 
    inherited; 

    for i := 0 to pred(Self.ComponentCount) do 
    if Self.Components[i] is TSynEdit then 
    begin 
     // do something 
    end; 
end; 

必要なコンポーネントは、フレームの直接の子孫ではない場合、あなたは子供たちの子供たちをスキャンする必要がありますがなど

+0

私は、フレームにロードされたプロシージャがないと言うことができます。私はあなたが誤解しているかもしれないと思うか、あるいは私はあまり明確ではなかったかもしれません。コードはフォーム単位ではなく、フレーム単位で指定する必要があります。 –

+0

@Svein:それを試してみてください。あなたのフォームとフレーム内で 'Loaded'プロシージャをオーバーライドしてください(はい、それもあります)。そして、両方にブレークポイントを設定し、あなたのアプリケーションを実行してください。 – mghie

+0

さて、私はおとなしいでしょう。出来た。私の以前のコメントを無視し、私の無知を許してください。どうもありがとうございました :-) –

0

Iフレームから埋め込みSynEditを削除し、代わりにフレームをSynEditインスタンスにを参照プロパティを与えるだろう。そのようにして、あなたは必ずしも無駄なSynEditインスタンスを持っているとは限らず、ユーザはあなたが考えていないSynEdit派生物を使うことさえ決定するかもしれません。

+0

全体のポイントは、組み込みのエディタを持つことです。ユーザーが何らかのSQL文を入力できるようにする新しいフォームを作成するときに、フレームと(必要に応じて)データソース/フィールドを追加したいと思います。それでおしまい。 –

+0

"frame-edtor"に多大な機能が残っていなければ、私の答えはそれほど役に立ちません。 :-) –

0

別の考え方:視覚的にではなくコードでSynEditを作成する方法はありますか? (フォームデザイナーでどのくらい変更したいかによって変わります。)次に、PageControlを削除して、フレームごとにエディターインスタンスを1つだけ作成します。

+0

これは、フレームを使用することの単純さを否定します。また、問題は、作成時に必要なものがわからないことです。私は元の質問に少しだけ具体的に尋ねたかもしれないと思います。より一般的には、フレームが作成された時点でフレームに存在するコンポーネントの特定のプロパティを知ることです。 PS:あなたの答えに感謝しますが、残念ながら彼らは私をあまり助けませんでした。 –

関連する問題