2017-05-24 2 views
1

私は現在の作業システムの中に小さな入れ子関数を作成しようとしています。私が問題を抱えているのは、コレクションに3番目のシェイプを追加し、コレクションに追加された以前のシェイプに基づいて3番目のシェイプを配置しようとすると、それは最初のシェイプに基づいて配置されます。私が最後にしているのは、元の位置にあるオリジナルと、コピーが互いの上に積み重ねられていることです。コレクション内の特定の図形を選択するCorelDraw

Function ArrangeImages(ByRef scol1 As Collection, ByRef sA, sB As Shape) 
Dim i, ii As Long 

i = scol1.Count 
ii = i - 1 

If i = 1 Then 

Set sB = scol1.Item(i) 

End If 

If scol1.Count > 1 Then 

Set sA = scol1.Item(ii) 
Set sB = scol1.Item(i) 

sB.SetPosition sA.PositionX, sA.PositionY + (sA.SizeHeight/2) + 
(sB.SizeHeight/2) + 0.15 
End If 

End Function 

答えて

1

オブジェクトを互いに同じに設定してお互いをメモリ内で参照しています。実際には、オブジェクトを2倍にして2倍のメモリを消費しています。

Setは、オブジェクトの参照先と同じオブジェクトを設定します。ここに例があります。

Public Sub test() 

    Dim s As Worksheet 
    Dim s2 As Worksheet 

    Set s = Application.Workbooks.Add().Worksheets.Add 
    s.Name = "one" 
    Set s2 = s  's and s2 Name = "one" 
    s.Name = "two" 's and s2 Name = "two" 

End Sub 

Letは、オブジェクトを希望のオブジェクトの値に設定します。

は問題が解決しない場合、あなたはで動作するように欠けている形状のそれぞれについて、プロパティや変数を作成する必要があります代わりに

Set sA = sB 

Set sA = new Shape 
Let sA = sB 

を試してみてください。

Similar Question

+0

私は、SAが異なり、私はこれをテストしたが、それはまだ正常に動作しませんでした設定しているために、コードを編集しました。私はLetメソッドをまだ探っていない。私にそれをさせて、あなたと一緒に戻ってください。 –

+0

@ JamesCunninghamあなたが 'Set'している限り、それはまだ参照オブジェクトになります。 'Set sC = sB'でも' Set sA = sC'なら 'sA'は' sB'の参照となります。私はあなたが試したことを知らず、それを前提として提供しています。 – GibralterTop

+0

オブジェクトを再配置する前にオブジェクトの位置を保持するために二重を作成する必要がありました。また、CorelのオブジェクトのStaticIDを使用して正しいものにアクセスし、どこに行かせるべきかを指定する必要がありました。最終的に私のコードは元のコードとはかなり違って見えますが、@ GibralterTopは非常に便利なポストを持っていました。ありがとう。 –

関連する問題