|
MicroVirus wrote: that external sources do NOT have access to that function I didn't realize that different branches of an inheritance tree are treated that way. Thanks a lot for pointing this out.
Ciao,
luker
|
|
|
|
|
Actually, I tried that (*) prior to posting my question. It didn't work.
Ciao,
luker
|
|
|
|
|
Ahh okay. I'm glad to hear it didn't work
I wasn't sure about how strict C++ and C# would be about it, but you are right: they both (rightly) don't allow it.
|
|
|
|
|
The DoSomething() method is protected and cannot be accessed from outside the class and its subclasses. Make it internal , protected internal or public .
modified on Saturday, August 27, 2011 6:08 AM
|
|
|
|
|
Hi, Luker;
The related MSDN help topic for the similar compiler error I receive for the example at http://msdn.microsoft.com/en-us/library/s9zta243.aspxm, is:
"A derived class cannot access protected members of its base class through an instance of the base class. An instance of the base class declared in the derived class might, at run time, be an instance of another type that is derived from the same base but is not otherwise related to the derived class. Because protected members can be accessed only by derived types, any attempts to access protected members that might not be valid at run time are marked by the compiler as not valid."
If I'm following this explanation correctly, methods or member functions declared as protected can only be accessed by an immediate descendant of the base class. In the example above, since SecondDerived does not inherit its structure and behavior from FirstDerived, FirstDerived.DoSomething() cannot be called as the language is enforcing the scope and access of the protected method DoSomething(). Even if AbstracstBase.DoSomething() wasn't declared as abstract, the restricted access of the protected qualifier takes precedence.
Moreover, I don't think using the internal qualifier would help, as the compiler treats this as an error, in which the derived class, FirstDerived, was trying to change the access on a method that was inherited and declared as protected in the AbstractBase class. The internal keyword, in conjunction with a correctly defined assembly attribute, can only allow the runtime to access internal methods between friend assemblies. This approach for the friend qualifier seems specific to .NET, and unfortunately, is not the same as a friend function in C++.
Is it possible to provide an additional method in FirstDerived that would correctly expose and allow a call to FirstDerived.DoSomething() on behalf of the FirstDerived's consumer, or, could having the common polymorphic behavior of DoSomething() be expressed and implemented using an Interface instead?
I hope this was of help. If I missed something in your question, or incorrectly stated anything with regards to the use and application of the protected and internal keywords, please let me know.
Best Regards...
Bill
|
|
|
|
|
My apologies for any redundancies or oversights for the previous posts on my part....
Bill
|
|
|
|
|
Hi there,
I want to add "CorelDraw" file or "Flash" file into My C# Application,but I don't know
How do I Add these files into My App?
It is very importance for me,
Please Guide me!
Thank very much.
|
|
|
|
|
Coreldraw has a .Net API called the CorelDRAW 15.0 Type Library or the Vector Graphics Core 15.0 Type Library. These can be referenced in the COM tab when you try add a reference in Visual Studio. Good Luck!
Live for today. Plan for tomorrow. Party tonight!
|
|
|
|
|
Hi
Thanks very much!
May you tell me about adding "Flash" file into C# Application?
I need more Information about relation Graphic softwares(for example:Corel Draw or Flash) and
Applicatio(C#).
I want that my application recognizes clickes of user on an area of "CorelDraw",
for example :I draw map of world by Corel and while the user clickes on area(for example:Asia),
the color of this area changes.
my idea is possible or impossible by C#?
I work by C# 2005.
|
|
|
|
|
Hi,
I need your guide,
Please guide me about this subject,
How do I open a "CorelDraw" file into C# Application and access to Layers,Pages,.....
and change color of Layers,Pages,...?
I want to understand point start.
Thank.
|
|
|
|
|
Hi again!
This is my scenario:
I have an API that opens several forms (instances of the class frmPpal.cs)
I save a FormList such as:
FormsList = new List<frmPpal>();
Once all forms are opened, user can push in a Connect button and also in a Receive Data button.
When Receive Data is clicked, there is also an Output Window (in each form) which shows sequentially all the received data (each 5 seconds, aprox)
My doubt is how can I set the proper Output Window (chosing from all the Forms that are opened) for showing the received data. For example, if I have 3 Forms, each one must show in its Output window the Data that it requested.
All the Forms are opened and can be closed by user, and user can also click on Connect and Receive Data whenever he wants.
Any ideas?
Ty in advance.
Regards,
D.
|
|
|
|
|
You want the same data to be displayed in each Form?
Live for today. Plan for tomorrow. Party tonight!
|
|
|
|
|
No,
I will try to be more clear now.
If I have, for example, 3 forms opened, the user can connect and receive data independently. The data tha is going to receive is different in time and size.
Form1: Opened and Connected. Receiving Data = data1 from t=0;
Form2: Opened and Connected. Receiving Data = data2 from t=1;
Form3: Opened and Connected. Receiving Data = data3 from t=2;
Once the three of them are receiving data, the 3 forms´ output windows must show the data that they are receiving, not syncronized between them and not the same data.
I hope it´s better to understand now.
Thanks,
D.
|
|
|
|
|
How does each form receive the data? Is it from the same source ? Is it the same class that processes the requests for data and then sends to the form or how does it happen? I think you should explain your application some more.
Live for today. Plan for tomorrow. Party tonight!
|
|
|
|
|
Hello Wayne,
I´ve just post some code in Bill´s answer,
I hope it´s enough information; otherwise please tell me and I´ll post more code and explanations.
Ty in advance,
regards,
D.
|
|
|
|
|
It is not clear from your explanation what the problem is. Can you elaborate?
V.
|
|
|
|
|
The main problem is that the API was not prepared for being used as multi-thread, and now if I connect and receive data in different forms, it shows all the data in the Output Window of the last Form that the user clicks on Receive Data
Thanks,
D.
|
|
|
|
|
I saw the post of Wayne and I agree.
You need to explain how data is received. Don't post ALL your code, just the bits that are necessary for explaining how this works.
V.
|
|
|
|
|
Hello V.
I´ve post a bit of code in the replay to Bill.
Hope this helps,
Regards,
D.
|
|
|
|
|
I'll join with the questions posed by Wayne and V: really need to know what 'entity' now receives the incoming data, and processes it.
Why isn't the incoming data 'separated out' in some way where it is clear what query it is a result of ?
This certainly sounds like a scenario where you would want multiple threads running.
best, Bill
"In the River of Delights, Panic has not failed me." Jorge Luis Borges
|
|
|
|
|
Well, sorry for the missed out information, I´ll try to post a bit of code now:
Here is the code for opening several forms (3 in this case). By now its just using a "for" loop, but it will be managed with an UI control for opening as many forms as the user needs:
static void Main()
{
FormsList = new List<frmPpal>();
Conn_control = new ConnectionController();
for (int i = 0; i < 3; i++)
{
frmPpal form = new frmPpal(new DayTradeFacade());
FormsList.Add(form);
form.Show();
}
Application.Run();
Now the code of the frmPPal.cs relative to Connect button and Subscribe button (Receive Data):
private void buttonReconnect_Click(object sender, EventArgs e)
{
if (!Connected)
{
ThreadPool.QueueUserWorkItem(delegate
{
DayTradeFacade.SetMessagesTextBox(textBoxMessages);
DayTradeFacade.SetTesting1TextBox(textBoxOutput1);
DayTradeFacade.SetTesting2TextBox(textBoxOutput2);
Facade.Account.AccountValueUpdated += UpdateListViewAccountValues;
Facade.Portfolio.PortfolioChanged += UpdateListViewPortfolio;
Facade.ConnectToTws();
}, null);
}
else
{
textBoxMessages.WriteLine("Already connected.");
}
}
And now Receive Data:
private void buttonSubscribeToPresetFutures_Click(object sender, EventArgs e)
{
if (!Connected)
{
textBoxMessages.WriteLine(NotConnectedErrorMessage);
return;
}
if (!FuturesTradingHours.NowIsInsideTradingHours())
{
textBoxMessages.WriteLine(
"Can only subscribe to futures between " + FuturesTradingHours.MarketOpenTime
+ " and " + FuturesTradingHours.FiveSecondPriceBarSubscriptionUnsubscribeTime + ".");
return;
}
textBoxOutput1.Clear();
Facade.SubscriptionManager.SubscribeToFiveSecondPriceBars(_presetFutures, TradingStrategyTypeToUse);
}
When a subscription is done, it receive data each 5 seconds, and it must be output in the proper textbox control.
what is done for a single form is:
...
DayTradeFacade.WriteLineToTesting1("Normal: " + openTime);
...
, and what I want is this called using the Form from where subscription was made
Hope this helps for helping me
Thank you,
D.
|
|
|
|
|
At first sight I would think that the Facade object is the same for all three forms.
V.
|
|
|
|
|
Yes, you are right.
But, I think it´s not relevant for setting the proper output window.
I mean, facade is just the class for events, but each event is triggered to the proper form.
I just need to focus in the proper form.
I´ve got a FormList, so for example what I´ve done is:
TTS_RealTime.FormsList[0].textBoxOutput1.WriteLine("Normal: " + openTime);
Just need to set FormList[index] to the form from where the subcription was made.
Any idea?
Ty,
D.
|
|
|
|
|
Maybe I misunderstood your code, but if the Facade object (the instance, not the class) is the same for each form it will receive the data of all three forms. If that's the case you need to :
- or initate a different instance for each form
- or find a way to find out who requested the information (maybe it is in the response) and dispatch the information to the correct form.
V.
|
|
|
|
|
V. wrote: - or find a way to find out who requested the information (maybe it is in the
response) and dispatch the information to the correct form.
That´s why I´ve post here, looking for some ideas to do this
But, each form has it´s facade, as I wrote in the Main() call:
frmPpal form = new frmPpal(new DayTradeFacade());
|
|
|
|