2012-01-19 11 views
3

私はこのことを認識できません。私はDELPHIの中に2つの他のコンポーネントを含んでいます:Firemonkey Layoutとその内部に、TRectangleを含むTLayoutの動的配列があります。 これは、プロパティBarNumberによって実現されます。ランタイムとデスティネーションで作成されたサブコンポーネントとプロパティを処理する方法は?

私はDesign Time vs. Runtimeの動作に関して多くの問題があります。これは、サブコンポーネントをオブジェクトの一部として格納するDFM(FiremonkeyのFMX)によるものです。 これはOn Createパートのコードです。

constructor TFluffyTable.Create(Owner: TComponent); 
var 
i: integer; 
begin 
    inherited Create(Owner); 

    Width:=300; 
    Height:= 160; 
    BarNumber:=100; 
    SetLength(Column, FBarNumber); 
    for i := 0 to (FBarNumber-1) do 
    begin 
    Column[i]:= TColumn.Create(Self); 
    Column[i].Name:= 'Column_' + IntToStr(i); 
    Column[i].Parent:= Self; 
    Column[i].Height:=Height; 
    Column[i].Width:=Width/FBarNumber; 
    Column[i].Align:= TAlignLayout.alMostLeft; 
    end; 
    end; 

コンポーネントを登録してデザインタイムに使用すると、正しいバーの数が表示されます。しかし、コンポーネントを使ってプログラムを実行すると、EXEが値をロードするので、2倍のバーが得られます。私はこれを、ループの直前で

​​

の直前で解決しました。 しかし、明らかに、バーはデザインモードでは見えません。これが唯一の解決策であれば、私はそれを立証することができます。 これ以上はない! 奇妙な理由から、Width、Height、およびBarNumberの値を設定できる唯一の場所は、そのコードの一部です。オブジェクトインスペクタでそれらを設定すると、プログラムを実行するときに考慮されず、デフォルトにリセットされます。 (BarNumberの読み取りとFBarNumberに書き込み変数である)要するに

:私はBarNumberおよびその他のプロパティは設計時に設定されるようにするために、私のコンポーネントを処理し、管理する方法がわからない、と正しいを確認しますランタイム中のバーの数。 ありがとうございます。

+0

あなたが答えを受け入れる必要があります、もしあなたが決して受け入れないあなたのすべての質問を参照してください.. –

+0

私は –

答えて

0

実行時に0列から開始していることを確認する必要があります。 列を作成する前に、

for [i] = pred(length(column)) downto 0 do 
begin 
    column[i].free 
end; 

のようなものを追加するだけです。

+0

mmmを作った単純なコンポーネントによって設計時に作成されたオブジェクトで同じ問題を抱えましたが、動作しません。実行時にColumn配列の値がリセットされるため、解放すると効果はありません。私はcsDesigningチェックと一緒にロードメソッドを使用して、バーが実行時にのみ追加されることを確認しました。それは動作しますが、理想からまだ遠いです。とにかく、ありがとうございました..! –

3

私は同様の問題がありました。私はこの問題を避けるためにストアドプロパティを使いました。 例:

constructor TMachine.Create(AOwner: TComponent); 
begin 
    inherited; 
    self.Width := 50; 
    self.Height := 90; 

    // create machine rectangle and set default properties 
    FMachine := TRectangle.Create(self); 
    FMachine.Parent := self; 
    FMachine.Height := 50; 
    FMachine.Align := TAlignLayout.alBottom; 
    FMachine.Fill.Color := TAlphaColorRec.red; 
    FMachine.Stroke.Color := TAlphaColorRec.Black; 
    FMachine.Stroke.Thickness := 3; 
    FMachine.Stored := false; 
end; 
0

問題は設計時に作成したコンポーネントがFMXファイルに格納されるということです。アプリケーションを2回実行するとコントロールが2回発生し、問題を解決するには、storedプロパティをfalseに設定してコンポーネントのサブオブジェクトに設定する必要があります。

Column [i] .Stored:= False;

関連する問題