|
Try it this way:
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
John
"You said a whole sentence with no words in it, and I understood you!" -- my wife as she cries about slowly becoming a geek.
|
|
|
|
|
Try calling the UpdateStyles method afterwards to force the assigned styles to be reapplied to the control.
www.troschuetz.de
|
|
|
|
|
Thanks guys tried both of those and no joy
|
|
|
|
|
I'm building a GUI that has a lot of data to display, and therefore, space is increasingly becoming an issue. I'd like to get round this by making a floatable, collapsable and dockable tab menu. But i'm not sure where to begin.
I'm guessing at the following:
* popup menus are displayed next to a single tab line, and are displayed over the rest of the GUI elements. So, it would make sense for them to be a form in this state, managed by the parent form.
* When floating, they would appear to be a form also, this makes sense going by the previous state.
* When docked, the internal panel to the form is simply returned to the parent form, and the parent form re-arranged as appropriate, using some kind of dock manager.
But these are only guesses, and as I do not have anywhere near enough money to go out and buy control packages, i was hoping to make a (very) simple version myself.
So i'm really just looking for some pointers as to where to start.
Cheers
Cata
|
|
|
|
|
|
Hey!
I need som help on the MemoryStream.
1. Is MemoryStream contaning one ore two streams?
1.2. If the MemoryStream only contains one stream, is it still posible to send data in both directions, or do i need to have two MemoryStreams to do that?
1.3. If the MemoryStream is containgn two streams, how do i know what stream i am reading and writing from?
As you can see, i have some problem to understand Streams, if you got the time to explain, i would appreciate it!
Best Regards
Jimmy
|
|
|
|
|
|
Okay understand
But will i have to use two streams to be abled to send data in both directions?
Best Regards
SnowJim
|
|
|
|
|
A memorystream does not go anywhere, except to memory, so I am unsure what you could mean by "send data in both directions". In any case, if you need to both read from a stream, and write to a stream, you would normally use 2 streams to do that.
my blog
|
|
|
|
|
Hey!
I need to write to a MemoryStream from one part of my program and in another i whant to read this data form the MemoryStream.
This is how i write byte to the MemoryStreams
<br />
public override void WriteByte(byte value)<br />
{<br />
try<br />
{<br />
s.WriteByte(value);<br />
<br />
foreach (UnitStream unit in StreamCollection)<br />
{<br />
if (unit.getUnitStream.CanWrite)<br />
unit.getUnitStream.WriteByte(value);<br />
}<br />
}<br />
catch (Exception ex)<br />
{<br />
addError("Error in PhoneConnector - MutliStream - Write : " + ex.Message);<br />
}<br />
}<br />
When i am pasing data in to this function it writes it to the MemoryStreams(collection), but when i am lookin on the MemoryStreams ther is no data written to them?
I m a doing wrong?
BestRegards
Jimmy
|
|
|
|
|
|
Like this?
<br />
public override void WriteByte(byte value)<br />
{<br />
try<br />
{<br />
s.WriteByte(value);<br />
<br />
foreach (UnitStream unit in StreamCollection)<br />
{<br />
if (unit.getUnitStream.CanWrite)<br />
unit.getUnitStream.WriteByte(value);<br />
unit.getUnitStream.Flush()<br />
}<br />
}<br />
catch (Exception ex)<br />
{<br />
addError("Error in PhoneConnector - MutliStream - Write : " + ex.Message);<br />
}<br />
}<br />
But is not Flush clearing the buffert?
I have tryed to step thow this funktion and then
unit.getUnitStream.WriteByte(value);
is done there is still no data in the the stream(unit.getUnitStream(MemoryStream)) Can Flush realy help me with this problem?
Best Regards
SnowJim
|
|
|
|
|
Calling Flush has no effect when using a MemoryStream , since any data written to a MemoryStream is written into RAM.
www.troschuetz.de
|
|
|
|
|
Calling Flush has no effect when using a MemoryStream , since any data written to a MemoryStream is written into RAM.
www.troschuetz.de
|
|
|
|
|
But why are the data not written to the memory stream? or is it not posible to see in debug what the memorystream is containing?
Maby i will have to read it to see it?
Best Regards
Jimmy
|
|
|
|
|
It's a pretty strange problem.
Where and how do you initialze your StreamCollection?
www.troschuetz.de
|
|
|
|
|
Your memorystream is probably still positioned at the end after you do your write. You can't read from it until you set the Position to an earlier point in the stream.
To see if you are successfully writing to the stream, check that the Length and Position properties are changing as you write.
|
|
|
|
|
Yes, the Length and position is not moved when writing to it!
Also, if i write to the stream, then the position will be set where the writer ends(say it writes 32 byt and stops on position 31), when i need to read it will read position 32 and forth.
I need it to read from position 0, and to manage this i will have to change the position. But if my unit that writes to this stream needs to write then the position will be pointing on the wrong element if i havent read throw all the elements with my reading unit.
How is this sopose to work?
I need the writing unit to write in a line and i need the reading unit to read any not readed data from the beginning and discarding the readed data. Is this not realy how the stream work?
Best Regards
Jimmy
|
|
|
|
|
There is definately something wrong if the Length and Position do not change after a write. I don't know what is wrong. Try looking at the data in the command window before and after a write. Use the exact same syntax in the command window as in the program for accessing the memory stream.
Maybe there is something wrong in the code where the memory streams are instanciated.
Yes, you need to manage the positions you read from separately. You could do so in a class you derive from memory stream and manage the positions so you don't have to keep track at both ends.
|
|
|
|
|
Thanks again for all the info!
I have made a class that derives from regular Stream and in this class i have addad a MemoryStream that will be the main stream.
<br />
#region Using directives<br />
<br />
using System;<br />
using System.Collections.Generic;<br />
using System.Text;<br />
using System.IO;<br />
<br />
#endregion<br />
<br />
namespace PhoneConnector<br />
{<br />
public class MemoryEventStream<br />
{<br />
Stream mainStream;<br />
int readPosition = 0;<br />
<br />
public MemoryEventStream()<br />
{<br />
mainStream = new MemoryStream();<br />
}<br />
}<br />
}<br />
I will do all the override functions with this mainStream.
There is one problem:
Say that i have added 40 bytes to the mainStream(MemoryStream).
When the reading unit have readed some bytes i need to remove this bytes. How could o do this?
I can only find flush but this will remove all the bytes.
Maby the memorstream is itself removing this bytes that have been readed? in that case the readPosition will be wary big?
Best Regards
Jimmy
|
|
|
|
|
Snowjim wrote:
Maby the memorstream is itself removing this bytes that have been readed? in that case the readPosition will be wary big?
The MemoryStream does not remove bytes when read. If you want this behavior, then you will have to code it yourself, adjusting the read and write pointers when you remove data from the stream.
|
|
|
|
|
But then the stream buffert will become very big? won´t the system memory run out?
How does regular streams handle this?
|
|
|
|
|
.Net memorystreams will increase in size if you keep writing to them (unless you use a fixed length byte array as its buffer).
If you want to write to the end and read from the front without running out of memory, you can manage your own byte arrays. There are several ways I can think of to manage array size:
1. When you read from the front of the stream, move the content: array.Copy(buf, readlength, buf, remainingLength). This technique might not perform well depending on the implementation of array.Copy.
2. Use a short list of byte arrays for the stream. When your write would go past the end of the array, create a new array (or manage a pool of existing arrays) to put the overflow in. Add the new array to a collection. When you read the past the end of an array, you can remove it from the collection.
3. Use a circular system. When your write would go past the end of the byte array, use any unused space at the front of the array (unused, since you have already read the data and moved the read position further along the array).
I don't know how .Net handles these issues in streams. I would probably try method 2 above, since it doesn't require collision testing like method 3. Method 2 is also easy to optomize to various buffer sizes and could perform quite well. Method 1 could work also, but I don't know how good the performance is of Array.Copy.
|
|
|
|
|
This is very good info!
I have tryed some more.
And right now i have built in an ArrayList in my Stream.
When adding a byte i am using
<br />
StreamCollection.Add(value);
OnReceivedData(new EventArgs());
and when a unit is reading i am using :
<br />
int tmpData = (int)((byte)StreamCollection[0]);<br />
StreamCollection.RemoveAt(0);<br />
return tmpData;<br />
Maby this is a slow way to handle it?
2. Use a short list of byte arrays for the stream. When your write would go past the end of the array, create a new array (or manage a pool of existing arrays) to put the overflow in. Add the new array to a collection. When you read the past the end of an array, you can remove it from the collection.
I started with this but then i thougt that it maby was the same speed if i just place the bytes in the ArrayList?
Or will 2# be faster?
If i have got this 2# right
Then i first need a collection(ArrayList)
int this Collection i will store smal byte arrays like byte[128] or somthing like that.
Then when i have i howl byte buffert(byte[128]) full then i will have to create a new byte array that i write to and place this on the second place in the Collection.
When the reader have readed the first byte buffert in the collection it will be removed
Collection.removeat(0); and then it will begin read on the next byte array.
Will this realy be faster then just adding the bytes to the ArrayList?
Its important that you can work against this stream as any regular stream. It is posible that it will be connected to controls that reads from streams. Will this be posible if I maintain the override funktion of Stream? like WriteByte(), ReadByte(); and so on?
Best Regards
Jimmy
|
|
|
|
|
Snowjim wrote:
If i have got this 2# right
Then i first need a collection(ArrayList)
int this Collection i will store smal byte arrays like byte[128] or somthing like that.
Then when i have i howl byte buffert(byte[128]) full then i will have to create a new byte array that i write to and place this on the second place in the Collection.
Yes this was my intention. Although, I was thinking of a default size of the byte arrays to be maybe 1024 or 2048 bytes. The performance could be optimized by changing the array sizes to best fit the expected use. My idea is that you want only a few byte arrays at any one time. I think it is much faster to access a byte in a byte array than a member of an arraylist, but I haven't checked. The only performance problem comes when you need to add a new byte array to the arraylist, but if it causes too much performance problem, it could be optomozed with a pre-existing pool of byte arrays which you add or remove from the arraylist.
If using an arraylist provides good enough performance, then use it! Some time later, the performance might not be good enough for a project that needs more speed, so then you optimize your class with a new internal implementation.
Snowjim wrote:
Its important that you can work against this stream as any regular stream. It is posible that it will be connected to controls that reads from streams. Will this be posible if I maintain the override funktion of Stream? like WriteByte(), ReadByte(); and so on?
The stream object inherits from MarshalByRefObject and implements iDisposable, so I don't know what you mean by "connected to controls". Your class should work fine if you have implemented the major stream methods.
|
|
|
|