elGringo Posted June 23, 2016 Posted June 23, 2016 Ok, to demonstrate problem, I have following structure (pic №1 in Attachment) -SomeComponent.bpl -uSomeComponent_BPL.pas -uAdditional.pas -TestProgram.exe -uTestProgram.pas In uSomeComponent_BPL.pas I have special published property SomeField (Pic №2 in Attachment) ... property SomeField:string read FSomeField write FSomeField; ... What is my problem and my Task? When user will enter Some Value in SomeField I need to transfer and use it in unit uAdditional of component. I cannot do that without using GlobalVars for the moment. What did I try? After register of Component, I tried to Create Locally exemplar of TSomeComponent from uSomeComponent_BPL like this uAdditional... procedure TfAdditional.FormCreate(Sender: TObject); var SomeComponent:TSomeComponent; begin SomeComponent:=TSomeComponent.Create(Self); ShowMessage(SomeComponent.SomeField); end; In uSomeComponent_BPL.pas procedure TSomeComponent.CreateAdditionalForm; var AdditionalForm:TfAdditional; begin AdditionalForm:=TfAdditional.Create(Self); end; Added component to form in test program. Then in object inspector I entered some test value like '123'. After that in test program I tried to call that externally like this procedure TfMainform.SomeComponent1Click(Sender: TObject); begin SomeComponent1.CreateAdditionalForm; end; But message was emty - so that didn't work... If to use Global Vars - everything will work. But it is known that GlobalVars - bad practice. Conclusion If you know how to transfer data from unit to unit in that case, please help me. Regards, Stanislav. 324_GlobalVarTest.zip Quote
gatosoft Posted June 24, 2016 Posted June 24, 2016 Hi ElGringo,Firts to all, sorry for my english, i'll try to explain me.1) You have a component into your Test Program... this INSTANCE is named SomeComponent1 and his SomeValue property its set to "123"2) When you call the CreateAdditionalForm Method, you delcare a new variable of TSomecomponent class, and you INSTANCES A NEW OBJECT3) When you call ShowMessage, you pass the New INSTANCE recently created, which SomeValue property is empty.I suggest:1) Delete the OnCreate Method from your TAdditional Form2) Create a New Private variable FSomeComponent3) Create a overload constructor for this form,like this: TfAdditional = class(TForm) private { Private declarations } FSomeComponent: TSomeComponent; public { Public declarations } Constructor Create(aSomeComponent: TSomeComponent); end; 4) Implement it, like this: constructor TfAdditional.Create(aSomeComponent: TSomeComponent); begin inherited Create(Application); FSomeComponent:= aSomeComponent; ShowMessage(FSomeComponent.SomeField); end; In this way, when you creates this Form, pass the Component "parent"5) Finally, into the CreateAdditionalForm method write this: procedure TSomeComponent.CreateAdditionalForm; var AdditionalForm:TfAdditional; begin AdditionalForm:=TfAdditional.Create(Self); end; I hope I have understood and solved your problem, (again, sorry for my english)ByeGatosoft 1 Quote
elGringo Posted June 24, 2016 Author Posted June 24, 2016 Hi, gatosoft! Yes! your answer is 100 % of what I need for the moment !!! Yesterday i found a little bit different decision, but yours is more elegant. My decision was lite that uSomeComponent_BPL procedure TSomeComponent.MyClick(Sender: TObject); begin fAdditionalLocal:=TfAdditional.Create(Self); fAdditionalLocal.somefieldInternal:=Self.SomeField; ShowMessage(fAdditionalLocal.somefieldInternal); end; but it is not so convenient as yours one!!! Thank you again. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.