Need C# programmers with socket / TCP interest

  • Thread starter Chad Z. Hower aka Kudzu
  • Start date
J

Jon Skeet [C# MVP]

Chad Z. Hower aka Kudzu said:
Yes that would be a problem. The protocol methods are normaly endpoints and
are not called from internally, but many middle classes have methods that are
used by users.
Right.


Indy typically uses var (by ref) arguments when its not a simple type. But
there are a few instances of TStrings as a result IIRC. We could maybe map
them to ones that use by ref calls and keep the existing ones as well?

Eek - I hadn't realised Indy used a lot of pass-by-reference. I'm
personally pretty averse to it, and again, it's not "the normal .NET
way of doing things". Again, this is no criticism of Indy and its
history, just another barrier to adoption. It needn't be a fatal one,
but it is one nonetheless.
Delphi only supports thes in Delphi.net (AFAIK), not previous versions.

If it did - how would this help our situation though? And remember - these
are not just valued classes. They are actual classes with methods that Indy
uses, so Im not sure that this is workable either.

I think you were missing my point - or I'm missing yours. The extra
classes (TIdStringArray or TStrings, for instance - to be honest, I've
somewhat lost the plot as to what is what could still appear in the
interface, but wouldn't need to be seen at all in the .NET developer's
code. They could pass a string array, and a conversion could be
performed (in exactly the way you show in your examples) to convert to
the relevant type.

Users would still need to recognise TIdStringArray or TStrings or
whatever, and realise that they can treat it as a string[], but it
would be better than the conversions occurring in their own code - in
my view, anyway.
 
C

Chad Z. Hower aka Kudzu

William Stacey said:
Thanks Chad for confirming that for me. I suspected the same. I will try
your library. Cheers!

The docs arent converted yet so you'll have to use the VCL ones, which arent
up todate for Indy 10 yet (Soon!). So really just ask away here or on the
Indy NGs and we'll be glad to help you with code and more. :)


--
Chad Z. Hower (a.k.a. Kudzu) - http://www.hower.org/Kudzu/
"Programming is an art form that fights back"


ELKNews - Get your free copy at http://www.atozedsoftware.com
 
C

Chad Z. Hower aka Kudzu

Jon Skeet said:
Eek - I hadn't realised Indy used a lot of pass-by-reference. I'm

Double eek. Im not sure why I wrote that - its completley long. Wayyyy too
many times this week I've gone to bed at 6am because of a pending deadline.

It does NOT pass by reference. What it does is accept existing object
instances to operate on, rather than create the instances itself and return
them as results. There are only a few cases it creates instances for you.

For example:

HTTP.Get(URL, <stream>);

Rather than:

stream = HTTP.Get(URL);

In the first form the user must create the stream and pass it in. This is
good because there are many kinds of streams. But for string[] Indy usually
works this way too, in which there is only one type of string[].

Plain strings are different, they are returned as results:

s = HTTP.Get(URL);
I think you were missing my point - or I'm missing yours. The extra
classes (TIdStringArray or TStrings, for instance - to be honest, I've
somewhat lost the plot as to what is what could still appear in the
interface, but wouldn't need to be seen at all in the .NET developer's
code. They could pass a string array, and a conversion could be
performed (in exactly the way you show in your examples) to convert to
the relevant type.

Thats just it - They DO pass an array. I see what you are saying, it is
possible with the strings[] vs TStrings, but not the TStream. TStrings has
a value - a TStream does not. And since streams are abstract I cannot see
any way to even try to convert a "value".

So currently for Indy you do:

MyDotNetStream = new StreamWhatever();
HTTP.Get("http://www.atozed.com", new CLSStream(MyDotNetStream));
Use MyDotNetStream here.

Your change would make it look like:

MyVCLStream = new TMemoryStream();
HTTP.Get("http://www.atozed.com", new CLSStream(MyDotNetStream));
MyDotNetStream = new StreamWhatever();
MyDotNetStream = MyVCLStream;
Use MyDotNetStream here.

To me the first (And existing one) is cleaner. And the second form would
only possible for strings[].

The ONLY impact on .net users is they have to use the adaptor when calling
- otherwise they work directly with .net types. They dont touch VCL types.
Users would still need to recognise TIdStringArray or TStrings or
whatever, and realise that they can treat it as a string[], but it

Wrong - they dont use our string array - they use the .net one.



--
Chad Z. Hower (a.k.a. Kudzu) - http://www.hower.org/Kudzu/
"Programming is an art form that fights back"


ELKNews - Get your free copy at http://www.atozedsoftware.com
 
J

Jon Skeet [C# MVP]

Chad Z. Hower aka Kudzu said:
Double eek. Im not sure why I wrote that - its completley long. Wayyyy too
many times this week I've gone to bed at 6am because of a pending deadline.

Fair enough :)
It does NOT pass by reference. What it does is accept existing object
instances to operate on, rather than create the instances itself and return
them as results. There are only a few cases it creates instances for you.

Right. I personally find that's rarely a useful pattern, but I can
adapt to it, I'm sure. It's certainly less of a problem than if pass by
reference were used all over the place :)
For example:

HTTP.Get(URL, <stream>);

Rather than:

stream = HTTP.Get(URL);

In the first form the user must create the stream and pass it in. This is
good because there are many kinds of streams. But for string[] Indy usually
works this way too, in which there is only one type of string[].

But how does the caller know how large to make the array to start with,
out of interest?
Plain strings are different, they are returned as results:

s = HTTP.Get(URL);
Good.
I think you were missing my point - or I'm missing yours. The extra
classes (TIdStringArray or TStrings, for instance - to be honest, I've
somewhat lost the plot as to what is what could still appear in the
interface, but wouldn't need to be seen at all in the .NET developer's
code. They could pass a string array, and a conversion could be
performed (in exactly the way you show in your examples) to convert to
the relevant type.

Thats just it - They DO pass an array. I see what you are saying, it is
possible with the strings[] vs TStrings, but not the TStream. TStrings has
a value - a TStream does not. And since streams are abstract I cannot see
any way to even try to convert a "value".

But your article gives an example of exactly that:

<quote>
To use a FCL stream simply use the following syntax:

LHTTP.Get(new TIdCLRStream(<FCL Stream Instance>); (C#)
So currently for Indy you do:

MyDotNetStream = new StreamWhatever();
HTTP.Get("http://www.atozed.com", new CLSStream(MyDotNetStream));
Use MyDotNetStream here.

Your change would make it look like:

MyVCLStream = new TMemoryStream();
HTTP.Get("http://www.atozed.com", new CLSStream(MyDotNetStream));
MyDotNetStream = new StreamWhatever();
MyDotNetStream = MyVCLStream;
Use MyDotNetStream here.

No - my change would make it look like:

Stream myStream = new MemoryStream();
HTTP.Get("http://www.atozed.com", myStream);
Use mystream here
To me the first (And existing one) is cleaner. And the second form would
only possible for strings[].

The ONLY impact on .net users is they have to use the adaptor when calling
- otherwise they work directly with .net types. They dont touch VCL types.

But with my version they don't even need to have *any* adaptor code in
their code. They only need to know that when they see an adaptor type
in the signature, they can just use the .NET type instead, and the
conversion will be performed automatically.
Users would still need to recognise TIdStringArray or TStrings or
whatever, and realise that they can treat it as a string[], but it

Wrong - they dont use our string array - they use the .net one.

By "use" I mean "include some code which mentions it" - won't I have to
say:

string[] myStringArray = {... whatever ...};
something.CallSomeMethod (new TIdStringArray (myStringArray));

With the implicit conversions, I could just say:

string[] myStringArray = {... whatever ...};
something.CallSomeMethod (myStringArray);
 
C

Chad Z. Hower aka Kudzu

Jon Skeet said:
Right. I personally find that's rarely a useful pattern, but I can
adapt to it, I'm sure. It's certainly less of a problem than if pass by
reference were used all over the place :)

But it is very useful - how can you create a stream if you dont know what
kind of stream the user wants, or even what parameters the stream needs to
be created? or if the user wants you to write in a stream that already has
data?

..Net Im sure has many such examples. Many constructers relating to stream
accept other stream type objects. Same thing.
But how does the caller know how large to make the array to start with,
out of interest?

They dont. They just create it, Indy sizes and fills it.

You could even do:

HTTP.Get(URL, new new StringAdaptor(new string array)))

But then of course you would have no reference to it to read it. :)

Assuming Get took strings, which it doesnt it takes streams. Most users use
the string variant which returns as a function result. The stream version
is for binary files or if you want to direct it to a stream target
directly.
But your article gives an example of exactly that:

<quote>
To use a FCL stream simply use the following syntax:

LHTTP.Get(new TIdCLRStream(<FCL Stream Instance>); (C#)
</quote>

Yes, that exactly the same as the code I posted. The FCL stream instance
was MyDotNetStream which is already created by you.

TIdCLRStream is a class of ours that remaps TStreams methods to call the
matching methods in the .net STream. So we operate directly on your stream
internally, via a translator. Same for strings[].
No - my change would make it look like:

Stream myStream = new MemoryStream();
HTTP.Get("http://www.atozed.com", myStream);
Use mystream here

Your IL based change would yes. But not your type convertor suggestion to
which I was referring in this case.



--
Chad Z. Hower (a.k.a. Kudzu) - http://www.hower.org/Kudzu/
"Programming is an art form that fights back"


ELKNews - Get your free copy at http://www.atozedsoftware.com
 
J

Jon Skeet [C# MVP]

Chad Z. Hower aka Kudzu said:
But it is very useful - how can you create a stream if you dont know what
kind of stream the user wants, or even what parameters the stream needs to
be created? or if the user wants you to write in a stream that already has
data?

You provide whichever version of a stream you want to, and clients can
read from it, treating it just as a stream.
.Net Im sure has many such examples. Many constructers relating to stream
accept other stream type objects. Same thing.

But those are for creating new objects which effectively wrap a stream
- and carry the same "direction". You're using stream as a sort of
bidirectional thing - you write to it and then the client reads from
it. That seems odd to me.

However, I don't want to get bogged down by this - I'm certainly not
asking for a change here.
They dont. They just create it, Indy sizes and fills it.

Ah. That's a different matter then, and not well explained in your
article - I think an example is really called for on the page.
You could even do:

HTTP.Get(URL, new new StringAdaptor(new string array)))

But then of course you would have no reference to it to read it. :)

But if you already *have* a string array and provide a new
StringAdaptor, it won't be able to resize that original array...
Yes, that exactly the same as the code I posted. The FCL stream instance
was MyDotNetStream which is already created by you.

Yes indeed. I think we've got our wires seriously crossed here.
TIdCLRStream is a class of ours that remaps TStreams methods to call the
matching methods in the .net STream. So we operate directly on your stream
internally, via a translator. Same for strings[].

Except it's *not* the same for strings, because you can't resize an
array in .NET, which it sounds like you need to for your string array
adaptor.
Your IL based change would yes. But not your type convertor suggestion to
which I was referring in this case.

No, my type convertor version would cover that as well. Here's a
complete sample program in C# to show what I mean. If the .NET part of
Delphi can provide implicit conversions, I don't see why exactly the
same shouldn't be accomplished for Indy. You'd need to use an IFDEF for
the implicit conversions, but only on the adaptors, which I don't
expect would be too arduous.


using System;
using System.IO;

// Analogous to TIdCLRStream, I *think*!
public class StreamAdaptor
{
Stream baseStream;

public StreamAdaptor(Stream baseStream)
{
this.baseStream = baseStream;
}

public static implicit operator Stream (StreamAdaptor adaptor)
{
return adaptor.baseStream;
}

public static implicit operator StreamAdaptor (Stream baseStream)
{
return new StreamAdaptor (baseStream);
}

public void Write (byte[] bytes)
{
// Presumably in your real adaptor, you'd be doing more
// interesting stuff, I don't know
baseStream.Write(bytes, 0, bytes.Length);
baseStream.Flush();
}
}

// Analogous to an HTTP client class or whatever
public class SampleClient
{
public void Write5Bytes(StreamAdaptor adaptor)
{
adaptor.Write (new byte[] {0, 1, 2, 3, 4});
}
}

public class Test
{
static void Main()
{
MemoryStream ms = new MemoryStream();
SampleClient sample = new SampleClient();
// Observe the miracles of implicit conversion...
sample.Write5Bytes(ms);
Console.WriteLine (ms.Length);
}
}
 
J

Jon Skeet [C# MVP]

Jon Skeet said:
No, my type convertor version would cover that as well. Here's a
complete sample program in C# to show what I mean. If the .NET part of
Delphi can provide implicit conversions, I don't see why exactly the
same shouldn't be accomplished for Indy. You'd need to use an IFDEF for
the implicit conversions, but only on the adaptors, which I don't
expect would be too arduous.

<snip>

Having just looked into this further, am I right in saying that
actually the situation is more like this:

1) There's a class TStream which is used in the client interface
2) There's a subclass of TStream, TIdCLRStream, which can be used
with .NET streams

?

If so, then that indeed wouldn't work - the conversion is only applied
when there's a conversion between the type in the method signature and
the desired type.

However, if TStream is only ever passed *in* to methods, the thing to
do is then move the conversion to TStream (with the conversion creating
an instance of TIdCLRStream):

using System;
using System.IO;

public abstract class TStream
{
public abstract void Write(byte[] bytes);

public static implicit operator TStream (Stream baseStream)
{
return new StreamAdaptor (baseStream);
}
}

// Analogous to TIdCLRStream, I *think*!
public class StreamAdaptor : TStream
{
Stream baseStream;

public StreamAdaptor(Stream baseStream)
{
this.baseStream = baseStream;
}

public override void Write (byte[] bytes)
{
// Presumably in your real adaptor, you'd be doing more
// interesting stuff, I don't know
baseStream.Write(bytes, 0, bytes.Length);
baseStream.Flush();
}
}

// Analogous to an HTTP client class or whatever
public class SampleClient
{
public void Write5Bytes(TStream stream)
{
stream.Write (new byte[] {0, 1, 2, 3, 4});
}
}

public class Test
{
static void Main()
{
MemoryStream ms = new MemoryStream();
SampleClient sample = new SampleClient();
// Observe the miracles of implicit conversion...
sample.Write5Bytes(ms);
Console.WriteLine (ms.Length);
}
}

That's fine so long as you're able to modify TStream, of course... but
it looks like TStream is part of the VCL and thus presumably can't be
changed. Shame :(
 
C

Chad Z. Hower aka Kudzu

Jon Skeet said:
You provide whichever version of a stream you want to, and clients can
read from it, treating it just as a stream.

Then you have to create a method for every kind of stream.. Unless .net
works differently which I suspect it does. But lets say it applies to some
other polymorphic type class.
But those are for creating new objects which effectively wrap a stream
- and carry the same "direction". You're using stream as a sort of
bidirectional thing - you write to it and then the client reads from
it. That seems odd to me.

No - your missing it actually. :)

The client does NOT read back from the stream. In Delphi it would look
something like this:

LStream := TFileStream.Create('c:\test.html', fmCreate); try
HTTP.Get('http://www.atozed.com/', LStream);
finally LStream.Free; end;

We dont reread from the stream, we inialize it to just go wherever it is we
want. Stream may not be the exact class that the covnertor should map to in
..net. The example I had did reread from the streamm, but that was just demo
code.

The above by allowing an existing TStream to be passed in allows writing an
existing stream too:

LStream := TFileStream.Create('c:\test.html', fmOpenWrite); try
LStream.Position := LStream.Size;
HTTP.Get('http://www.atozed.com/', LStream);
finally LStream.Free; end;

I can also pass TStringStream (Kind of like a stringbuilder, but not quite
its not its direct companion or intended to be), TMemoryStream, TDataField
Stream, and soon ....
Ah. That's a different matter then, and not well explained in your
article - I think an example is really called for on the page.

I'll make an update soon, Im working on the class name changes now. Its
what I inteded to convey.
But if you already *have* a string array and provide a new
StringAdaptor, it won't be able to resize that original array...

Why not? The string adaptor is just a polymorphic descendant of the VCL
TStrings abstract interface that maps our interface onto storage in a
strings[]. That is we operate directly on the strings[].

Again - there may be more suitable adaptors. TStrings is kind of like a C++
vector, its not really an array. Is there a better .net concept to map it
to?
TIdCLRStream is a class of ours that remaps TStreams methods to call
the matching methods in the .net STream. So we operate directly on your
stream internally, via a translator. Same for strings[].

Except it's *not* the same for strings, because you can't resize an
array in .NET, which it sounds like you need to for your string array
adaptor.

Yes we do need to resize. Hmm, I could swear we are resizing it
somehow..... Delphi arrays can be resized, and they map in Delphi.net to
strings[]... so?

There are also other options:
1) Internally we can use a TStringsList (A storage implemented descendant)
and then "commit" to a strings[].

2) Map to some other .net class.
complete sample program in C# to show what I mean. If the .NET part of
Delphi can provide implicit conversions, I don't see why exactly the
same shouldn't be accomplished for Indy. You'd need to use an IFDEF for
the implicit conversions, but only on the adaptors, which I don't
expect would be too arduous.

Yes, seeing your code below would work. Except - TStream is a defined non
modifiable abstract class.



--
Chad Z. Hower (a.k.a. Kudzu) - http://www.hower.org/Kudzu/
"Programming is an art form that fights back"


ELKNews - Get your free copy at http://www.atozedsoftware.com
 
C

Chad Z. Hower aka Kudzu

Jon Skeet said:
1) There's a class TStream which is used in the client interface
Yes.

2) There's a subclass of TStream, TIdCLRStream, which can be used
with .NET streams
Yes.

However, if TStream is only ever passed *in* to methods, the thing to

At least in most cases. Off hand I cannot think of cases its passed outward.
That's fine so long as you're able to modify TStream, of course... but

Which we cannot - or maybe we can. Let me explain a bit further...

The VCL goes back many many years. Roots are farther back than Delphi in TP,
but really the VCL as we know it became public in early 1995. And code that
worked in 1995 works today, and code that works today with a little effort
(not much in most cases) runs back on Delphi 1. Quite an achievement.

But Delphi has also gained new features. Interfaces (About 1998) and many
other things. But since things like TStream were created in 1994 (Beta, was
released in 1995) before many of the newer features, the core VCL is still
using just those parts. Unless you want to break everyones code you cannot
just go in and change certain things. Sure the VCL has taken advantage in
adding newer parts using interfaces, overloads, and other parts, but TStream
is original and well established.

BUT - In Delphi 8 there is a concept called a class helper. I can use an
"auxillary" class to add to an existing middle class. Delphi uses this to add
TComponent "on top" of the .net Component and still have all the VCL classes
see your Component as our TComponent...

I'll have to look into the class helpers, but we migth be able to add the
implicit conversion this way. Thanks for all you thought on this, this might
make it work. But I have to do the class aliasing and docs first - so this is
at least a week away. :)


--
Chad Z. Hower (a.k.a. Kudzu) - http://www.hower.org/Kudzu/
"Programming is an art form that fights back"


ELKNews - Get your free copy at http://www.atozedsoftware.com
 
J

Jon Skeet [C# MVP]

Chad Z. Hower aka Kudzu said:
Then you have to create a method for every kind of stream.. Unless .net
works differently which I suspect it does. But lets say it applies to some
other polymorphic type class.

Yes, it sounds like Delphi's idea of a stream isn't the same as .NETs.
If I have a method which returns a stream, I don't need to care which
type of stream it is - I can just read from it.
No - your missing it actually. :)

The client does NOT read back from the stream. In Delphi it would look
something like this:

LStream := TFileStream.Create('c:\test.html', fmCreate); try
HTTP.Get('http://www.atozed.com/', LStream);
finally LStream.Free; end;

We dont reread from the stream, we inialize it to just go wherever it is we
want. Stream may not be the exact class that the covnertor should map to in
.net. The example I had did reread from the streamm, but that was just demo
code.

Ah, right. Okay, it makes a bit more sense now - and the above would be
fine in .NET too. When you'd talked about it being much easier to
convert a stream to text in Delphi, the example you gave was a pretty
tortuous one where I'd rarely design an interface in that way.
The above by allowing an existing TStream to be passed in allows writing an
existing stream too:

LStream := TFileStream.Create('c:\test.html', fmOpenWrite); try
LStream.Position := LStream.Size;
HTTP.Get('http://www.atozed.com/', LStream);
finally LStream.Free; end;

I can also pass TStringStream (Kind of like a stringbuilder, but not quite
its not its direct companion or intended to be), TMemoryStream, TDataField
Stream, and soon ....
Right.


I'll make an update soon, Im working on the class name changes now. Its
what I inteded to convey.

Okay. While you're at the updating business, could you change it to not
create an instance of ASCIIEncoding? Using the static Encoding.ASCII
property is much neater, IMO :)
But if you already *have* a string array and provide a new
StringAdaptor, it won't be able to resize that original array...

Why not? The string adaptor is just a polymorphic descendant of the VCL
TStrings abstract interface that maps our interface onto storage in a
strings[]. That is we operate directly on the strings[].

In .NET, arrays are a fixed size. You can't resize them. Whereas with
the stream adaptor you can just pass in an existing stream to the
constructor, and use the same stream afterwards to read from, with a
string array you'd need to fetch the potentially new string array back
afterwards:

string[] myStringArray = ...;
TIdStringArray foo = new TIdStringArray(myStringArray);
// Do something with foo, whatever...

// then...
myStringArray = foo.GetStringArray(); // Or however you convert back
Again - there may be more suitable adaptors. TStrings is kind of like a C++
vector, its not really an array. Is there a better .net concept to map it
to?

StringCollection, probably.
TIdCLRStream is a class of ours that remaps TStreams methods to call
the matching methods in the .net STream. So we operate directly on your
stream internally, via a translator. Same for strings[].

Except it's *not* the same for strings, because you can't resize an
array in .NET, which it sounds like you need to for your string array
adaptor.

Yes we do need to resize. Hmm, I could swear we are resizing it
somehow..... Delphi arrays can be resized, and they map in Delphi.net to
strings[]... so?

That sounds very odd, basically. They can't map very well...
There are also other options:
1) Internally we can use a TStringsList (A storage implemented descendant)
and then "commit" to a strings[].

2) Map to some other .net class.

It does sound like StringCollection is the way to go here.
Yes, seeing your code below would work. Except - TStream is a defined non
modifiable abstract class.

Damn :(

I presume it would be against the Borland licence to modify the runtime
library (.NET version) to add the extra implicit conversions?
 
J

Jon Skeet [C# MVP]

Chad Z. Hower aka Kudzu said:
I'll have to look into the class helpers, but we migth be able to add the
implicit conversion this way. Thanks for all you thought on this, this might
make it work. But I have to do the class aliasing and docs first - so this is
at least a week away. :)

No problem :)

Would there be a better newsgroup to discuss this in, by the way? It's
not very closely related to C#. I see there's a dotnet Indy newsgroup
on the Atozed server (which I eventually found - I'm afraid I don't
find the website for Indy terribly easy to navigate around, given the
two different "halves") but it's empty. Are you monitoring it, and
would it be better to go there?
 
C

Chad Z. Hower aka Kudzu

Jon Skeet said:
Yes, it sounds like Delphi's idea of a stream isn't the same as .NETs.
If I have a method which returns a stream, I don't need to care which
type of stream it is - I can just read from it.

Yes. In .net a stream is more like a "handle". I know its not really a
handle - but to the end user its treated a bit the same.
Ah, right. Okay, it makes a bit more sense now - and the above would be
fine in .NET too. When you'd talked about it being much easier to
convert a stream to text in Delphi, the example you gave was a pretty
tortuous one where I'd rarely design an interface in that way.

Yes - maybe I should convert the demo to do something else - but was trying
to keep the demo simple. I can change it to write to a file instead next
round.
Okay. While you're at the updating business, could you change it to not
create an instance of ASCIIEncoding? Using the static Encoding.ASCII
property is much neater, IMO :)

Aah, didnt know about that. Looked all over for a static one. :)

Ill prob change it to go to a file though.
StringCollection, probably.

I'll look a that then. Is this a "commonly" used class in .net that users
will be familiar with?
Damn :(

I presume it would be against the Borland licence to modify the runtime
library (.NET version) to add the extra implicit conversions?

It depends. I think its allowed if we dont redistribute that class itself
for resuse. But since everything in a .net asm is "public". There isnt a
way to declare class "internal" only is there? :)

But see next message - it might be solved...


--
Chad Z. Hower (a.k.a. Kudzu) - http://www.hower.org/Kudzu/
"Programming is an art form that fights back"


ELKNews - Get your free copy at http://www.atozedsoftware.com
 
J

Jon Skeet [C# MVP]

Chad Z. Hower aka Kudzu said:
I'll look a that then. Is this a "commonly" used class in .net that users
will be familiar with?

Fairly. There's also ArrayList which is more common, but not typesafe
(i.e. it can store any object references, not just strings).
It depends. I think its allowed if we dont redistribute that class itself
for resuse. But since everything in a .net asm is "public". There isnt a
way to declare class "internal" only is there? :)

Yes there is - declare it as internal and it's only available within
that assembly.
But see next message - it might be solved...

I await it eagerly :)
 
C

Chad Z. Hower aka Kudzu

Jon Skeet said:
Fairly. There's also ArrayList which is more common, but not typesafe
(i.e. it can store any object references, not just strings).

This would be only strings.
Yes there is - declare it as internal and it's only available within
that assembly.

But I'd have to modify the Borland sources. :)



--
Chad Z. Hower (a.k.a. Kudzu) - http://www.hower.org/Kudzu/
"Programming is an art form that fights back"


ELKNews - Get your free copy at http://www.atozedsoftware.com
 
J

Jon Skeet [C# MVP]

Chad Z. Hower aka Kudzu said:
This would be only strings.

Right. StringCollection would be a good bet then.
But I'd have to modify the Borland sources. :)

Or do it post build, by disassembling the IL, adding in the conversion
and then reassembling. Much the same effect, really.
 
C

Chad Z. Hower aka Kudzu

Jon Skeet said:
Would there be a better newsgroup to discuss this in, by the way? It's

Hmm. Maybe framework? We could really get the discussion going there. :) :)
not very closely related to C#. I see there's a dotnet Indy newsgroup
on the Atozed server (which I eventually found - I'm afraid I don't
find the website for Indy terribly easy to navigate around, given the

Halves as in .net and VCL? Suggestions are always welcome - the website is
lacking time and a permanent webmaster. We just did a revamp, you should have
seen it two weeks ago. ;)

Most Delphi users are in the NGs and just come to the website for downloads.
Indy ships as part of Delphi, C++ Builder and Kylix as well and Borland uses
it in the products as well, so it has a lot of exposure. :)
two different "halves") but it's empty. Are you monitoring it, and
would it be better to go there?

Yes it would probably be better. Most of the Indy team monitors that too so
there will be very good input from them.



--
Chad Z. Hower (a.k.a. Kudzu) - http://www.hower.org/Kudzu/
"Programming is an art form that fights back"


ELKNews - Get your free copy at http://www.atozedsoftware.com
 
C

chris

Chad said:
I forgot to add:

2) If you are interested, you can use this form to contact me as I am the
chairman of Mercury Team which is the administrative team for Indy.
<http://www.hower.org/kudzu/Mail.html>


Hi Chad -

I tried to use the form to contact you but I keep getting the same error:
"Cannot send mail - check mail server settings"

I am interested in helping out with this project. What is the best way to
contact you? TIA
 
J

Jon Skeet [C# MVP]

Chad Z. Hower aka Kudzu said:
Halves as in .net and VCL? Suggestions are always welcome - the website is
lacking time and a permanent webmaster. We just did a revamp, you should have
seen it two weeks ago. ;)

Nope - halves as in the bit on http://www.indyproject.org and the bit
on http://www.atozed.com/indy
Most Delphi users are in the NGs and just come to the website for downloads.
Indy ships as part of Delphi, C++ Builder and Kylix as well and Borland uses
it in the products as well, so it has a lot of exposure. :)
Right.


Yes it would probably be better. Most of the Indy team monitors that too so
there will be very good input from them.

Okay. Do you want to post an appropriate state of where you think we
are? (I would, but I don't know how much you want to explain to the
regulars there - you know them better than I do.)
 
C

Chad Z. Hower aka Kudzu

Jon Skeet said:
Nope - halves as in the bit on http://www.indyproject.org and the bit
on http://www.atozed.com/indy

Aah. Yes the other projects did goof up our structure. Any changes suggested
to the front page?
Okay. Do you want to post an appropriate state of where you think we
are? (I would, but I don't know how much you want to explain to the
regulars there - you know them better than I do.)

Just drop a note in with a one or two paragraph sentence - The Indy team is
very friendly and you wont have any troubles.



--
Chad Z. Hower (a.k.a. Kudzu) - http://www.hower.org/Kudzu/
"Programming is an art form that fights back"


ELKNews - Get your free copy at http://www.atozedsoftware.com
 
C

Chad Z. Hower aka Kudzu

chris said:
I tried to use the form to contact you but I keep getting the same error:
"Cannot send mail - check mail server settings"

Aah sorry about that. We've been moving mail servers. I fixed it and the form
works now.
I am interested in helping out with this project. What is the best way to
Great!

contact you? TIA

You can try the form again, or you can just join in our .dotnet newsgroup at:
news.atozedsoftware.com

As you can see we are underway, but can definitely use some more "VS
natives".



--
Chad Z. Hower (a.k.a. Kudzu) - http://www.hower.org/Kudzu/
"Programming is an art form that fights back"


ELKNews - Get your free copy at http://www.atozedsoftware.com
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top