Keep a "Non Modal" window active when a modal window is being shown

Recently, I was exploring writing an ADO SQL logging tool (sorta like BDE monitor) - more details on that later - which would show SQL statements on the screen as they ran. All was well until I figured I needed to be able to see my SQL logging form even when a Modal window was being displayed. TForm.ShowModal() disables all other windows in the current thread, so my SQL logging form is there in the background - but that’s not much use because I don’t want to close my modal form to get to the SQL log.

So is there a way to have another active while a Modal form is being displayed?

The answer is yes. Going through the Delphi source code in Forms.pas, in TForm.ShowModal() a call to "DisableThreadWindows" is made to ensure that all non modal forms are inactive, and when the modal form is closed "EnableThreadWindows" is called. What these do is simply disable all other windows and then re-enable them.

What you can do is:
1) Handle the WM_ENABLE message that is sent to your form to set the enabled state.
2) Use "PostMessage" to post a custom message (say WM_REENABLE) back to your form.
3) Handle the WM_REENABLE custom message and in the handler, Enable your window.

So in your Delphi form create a form like so:

type
TForm2 = class(TForm)

procedure WMEnable(var Message: TWMEnable); message WM_ENABLE;


procedure TForm2.WMEnable(var Message: TWMEnable);
begin
if not Message.Enabled then
begin
PostMessage(Self.Handle, WM_REENABLE, 1, 0);
end;
end;
where WM_REENABLE is defined earlier as:
const
WM_REENABLE = WM_USER + $100;
Then add a WM_REENABLE handler like this:
type
TForm2 = class( TForm )

procedure WMReenable(var Message: TMessage); message WM_REENABLE;

procedure TForm2.WMReenable(var Message: TMessage);
begin
EnableWindow(Self.Handle, True);
end;

Now your form will be active even if a modal window is shown.

Note: I have tried the following and they do not work:
1) Calling EnableWindow() in the WM_ENABLE handler.
2) Posting a WM_ENABLE message in the WM_ENABLE handler.
3) Trying to change Window styles of my window to Stay on Top.

Note#2: Do not call "SendMessage" instead of PostMessage, it will not work consistently.

Posted by Deepak Shenoy on August 21st, 2006 under Uncategorized | Comment now »


Borland says goodbye to IDEs, and Delphi collects $200

Borland is selling off its IDEs. That means Delphi, C++ Builder, JBuilder and other IDE tools are being sold to another company or investor. (who hasn’t yet been identified, so will the real buyer-of-IDE please stand up.)

There’s tons of messages everywhere in the Borland Blogosphere. Marco Cantu has collated a list of Borlander messages, and Nick Hodges has some interesting viewpoints too.

The Shenoy Take
Shenoy is ambivalent. These are exciting times, not because the deal is mindblowingly fantastic. But because the options that are on the table make everything a lot more dynamic. And Shenoy’s has a nine year investment in this technology. So is it going down the toilet, or will we see the next developer tool giant?

[We will now stop referring to ourselves in the third person. Instead we will refer to us in the plural.]

Start with the facts
Let’s take some base facts:

  • Borland is still losing money. A company that’s losing money has to focus on what it needs to do to earn money. Borland has thus decided it’s the ALM route to take, not the IDE route.
  • Borland has done a lousy job for marketing IDEs. Nick has argued, and in quite a convincing manner, that the Borland Sales Force tends to focus on Enterprise sales rather than channel sales (where Delphi comes in). Plus they don’t advertise much, and their channel doesn’t either.
  • The IDE tools haven’t really gotten investment. I’m not talking about building new versions, which Borland has done, but about a larger strategy in the developer world. Giving more power and resources to Evangelism. Buying or fostering third party add ons. Venturing into tech areas that have long term potential.

So what are the Good Things about the deal?

Good Thing #1: IDE Marketing improvement

The IDE tools are out of Borland’s vice-like grip. Borland has been tying their hands behind their back all this time, and now the IDE tools will be able to strategize better. They can, for instance:
- Build SKUs at lower prices to address competition
- Advertise, Advertise, Advertise.
- Build BDN content into much much more, including online marketplaces for third party products, eBay links for Product sales, Blog aggregators, etc.
- Increase channel sales.
- Partner with web hosting companies to include Borland DLLs in their shared hosting packages.
- Training: Get more training companies affiliated, and build more certification levels.
- Revive the "Publishing" unit and promote authors for books/technology, even build online PDF sales of book content, chapter by chapter! Sell CDs of "Best of BDN" etc. or bundle it with IDE products. Stupid, you think? It was, earlier. Now is the time to start it again.
- Additional focus on the neglected Asian/European market, where a lot of development seems to be happening with Borland products.
- Put more money into Evangelism.

These are all possible only with an IDE spin off. Borland will just not allow them to do any of this without showing a multi million revenue potential in immediate quarters.

Good Thing #2: The Poor Man’s ALM
Borland gets to focus on ALM: Application Lifecycle management. And tie in with Microsoft and other offerings, rather than be stuck with its own toolkit. So they become an integrator, with products like Caliber for Requirements Management, StarTeam for Configuration Management, Segue for Quality, Legadero for Project Managment/Time Tracking/Bug Tracking etc.

Each of the above "ALM" tools cost a LOT of money. I would guess that a 10 to 20 person company will have to invest more than $10,000 for each of these tools, and in addition to buying these tools, a company has to buy Professional Services from Borland which I’m guess is going to be a significant expense.

Note also that they don’t mention cost of any of these products, or sell them online.That’s because it’s expensive. That’s because they’re difficult to sell off the shelf, because using them needs training, consulting and deployment and that can only be sold face to face. So what I’m suggesting is the New Company ("NewCo") can build or buy such tools for a lot lesser cost. I mean:
- Lower cost bug tracking tools. You get ‘em for $100 a piece.

- Simpler web based project management tools, integrating with the IDE.

- Version control: link with Subversion or CVS

- Add: build and deployment tools like BuildStudio or FinalBuilder

- Add: Sell the IDE as a prototyping tool as well (or build a CUT down designer version to prototype)

- Add: Use of "agile" programming techniques in the IDE. For instance, Pair programming using VNC technology to "repeat" actions in multiple computers. This also helps in team code reviews over an intranet (or even, over the internet!)

- Add: Chat, Voice and Video Integration WITHIN the IDE. Why? Today development can be done on the same project by people in multiple locations. Building IDE level interaction will make many things possible over long distances, such as code discussions, refactoring. etc. And perhaps as importantly, this is a great training tool.

Technology wise, all the above are simple to integrate for a company like Borland. With its presence it can easily partner with such vendors of such tools, or integrate open source tools like VNC and Subversion. The business benefit is only visible in the long term: if Borland pulls this off, they will be the most flexible IDE in the market for small to mid size companies: a market Visual Studio is slowly moving away from.

Good Thing #3: Team Retention
It’s scary for us when people at Borland leave.

Why? Because we fear their going means loss of an irreplacable resource at Borland. That these people have been been masters of their domain and the knowledge is not spread across many others, because hiring has been low.

Why has Hiring been low? Because Borland’s strategy was to focus on buying ALM companies, not augmenting current team strengths. Because they wanted to keep head counts low for idiotic-stock-market-appeasing purposes. Because they wouldn’t release budgets for building bigger high quality development teams.

The deal may change all that. With an increased focus on IDE products, the best way ahead is to
- innovate in the products, meaning a bigger better team
- increase evangelism resources meaning more people on DevRel

A bigger team means less fear of people leaving, and of course lesser fear that one person leaving will trigger other exits as well.

What about Bad Things?
Of course there are bad things. Every deal has nightmare speculators jumping in, and I’ll put a few important (to me) Bad Things.

Bad Thing #1: The IDEs will Die.
You might think a Microsoft or Oracle will gobble up this company and kill the IDE products. Small change for some of these companies, actually.

You might think the buyer won’t put in additional funding for a real strategy. That is no different from Borland, and will kill the IDE company.

Both could be true, but Borlanders don’t seem to think so, with David I, John Kaster and Anders Ohlsson repeatedly saying in the newsgroups that the "NewCo" will have a strategic investor who will take the business forward.

Bad Thing #2: They will open source Delphi.
I don’t think this is a good idea. I, for one, hate it, but there is a a feeling that if they don’t get a buyer they will try something like open sourcing Delphi.

I like open source, but frankly, open sourcing Delphi gives no revenue for Borland, and very little promotional possibility for the IDE ecosystem. So I’m saying this will be a bad thing.

Bad Thing #3: The loss of the Borland Name
This is a definite bad thing, in the sense that the Borland name will no longer be available to market. Like in the IBM Thinkpad/Lenovo scene, I believe the brand name has a lot to say in a sale.

But having said that, I believe the product names - Delphi, Interbase etc. - have a good brand standing on their own. So this may not hit NewCo too much, unless we’re talking "Enterprise" sales, which obviously will go to the Borland stable, not to NewCo.

Conclusion
This is the longest post I’ve ever made on this blog. I have to add a conclusion so that you know I’ll finally shut up sometime.

This is a great step for Delphi (and other IDE products). The team seems extremely excited in a happy sort of way, and seems to be waiting to throw away the shackles that hold them back. The message is universal, and clear: The IDE people at Borland want this, and want this now. It’s time for us, the community, to watch them weave their magic.

Who does Shenoy think it is?
Shenoy thinks it’s the big search engine giant. Shenoy may be an idiot. A fool. Shenoy’s head may be full of little wooden pieces that he doesn’t remember the technical name for, because his brain is full of little wooden pieces. You just can’t say, though.

Posted by Deepak Shenoy on February 10th, 2006 under Uncategorized | 4 Comments »


SOAP Download Progress

I had written an article about how to provide feedback during a SOAP call using a progress bar in Delphi. That article seems to be offline, temporarily. You can now also access this article at:

http://blogs.teamb.com/deepakshenoy/articles/SoapDownloadProgress.aspx

Posted by Deepak Shenoy on February 5th, 2006 under Uncategorized | Comment now »


Showing Download Progress in Delphi SOAP

Download the code for this white paper (dlprogress.zip, 12 KB)

Abstract

This paper talks about how you can show a download "progress" bar (like many download utilities do) when using SOAP to transfer data. I’ve used Delphi 7 in this article, and made some code changes to the source code, so this might not work with any other version of Delphi.

Introduction

If you’ve read the paper in http://www.agnisoft.com/white_papers/SOAP2.asp#binaryfile which tells you how you can transfer binary data using SOAP. In Delphi 7, you can also use the TSOAPAttachment class. But what if you need to use a progress bar to display data being transferred?

There’s an event in the THTTPRio.HTTPWebNode, called OnReceivingData. This event gives you a Size and a Total parameter, but they’re always the same…so you can’t use it to determine the actual download status. Or can you?

Digging into Delphi

Looking at the Delphi SOAP Source code, I realized that I could modify the way this event was being called, and sending real data - where Size would mean the amount that’s currently been downloaded, and Total would give you the expected total size of the download.

Looking into SOAPHTTPTrans.pas (located in the SourceSoap folder under your Delphi 7 install), I found that the procedure Receive was calling the OnReceivingData event. I had to make some modifications to the code as follows: (In the Receive procedure)

Note: Please backup this file before makign any changes.

1. Declare variables, TotalSize and TotalRead as DWORD:


var
TotalSize, TotalRead : DWORD;
2. In the code for the Receive procedure, after the line:




HttpQueryInfo(Pointer(Context), HTTP_QUERY_CONTENT_TYPE,
@FContentType[1], Size, Index);
SetLength(FContentType, Size);
Add:




// ADDED Deepak 2.2.2004
Index := 0;
HttpQueryInfo(Pointer(Context), HTTP_QUERY_CONTENT_Length or
HTTP_QUERY_FLAG_NUMBER,
@TotalSize, Len, Index);
TotalRead := 0;
Essentially, what we’re doing here is to find out the actual length of the response, given in the Content-Length response header.

3. Further down, within the repeat loop, you’ll see the following code:





if Assigned(FOnReceivingData) then
FOnReceivingData(Size, Downloaded)
Replace it with:




if Assigned(FOnReceivingData) then
begin // ADDED Deepak 2.2.2004
Inc(TotalRead, Downloaded);
FOnReceivingData(TotalRead, TotalSize)
end;
Here, we’re just ensuring that we keep a sum of the downloaded chunks handy (in the TotalRead variable) and we call the event with the total bytes read and the total bytes available.

4. Remember to include $(DELPHI)SourceSOAP in your client project search path, so that these changes will be compiled into your application.

Demo


I’ve created a simple WAD based server which allows you to download files in the same directory as the WAD application with an IDownloader interface. There’s a function in the interface, DownloadFile implemented as follows:





function TIDownloader.DownloadFile(FileName: String): TByteDynArray;
var
CurDir : string;
begin
CurDir := GetCurrentDirectory;
if FileExists( CurDir + FileName) then
Result := FileToByteArray(CurDir + FileName)
else
Result := nil;
end;
The FileToByteArray comes from the CompressHelper utility unit I’d created for my earlier paper, Transferring binary data using SOAP. I’ve also included it in the source code with this article.

What that piece of code does is to look in the folder (where the server application resides) for the existence of a file with the name given in the FileName parameter. If a file is found, its contents are returned in a dynamic array of bytes.

If you’re wondering what GetCurrentDirectory does:





function TIDownloader.GetCurrentDirectory: string;
var
FileName : array[0..MAX_PATH] of char;
begin
FillChar(FileName, SizeOf(FileName), #0);
GetModuleFileName(HInstance, FileName, SizeOf(FileName));
Result:= ExtractFilePath(FileName);
end;
The reason I’ve not used the more commonly known Application.ExeName is that you can use this code even in ISAPI dlls (where Application.ExeName isn’t valid)

The Client Application

I’m skipping the part where you create a new application, import this WSDL etc. I’ve created a form with an edit box for the file name, a Download button, and a progress bar indicator and panel. Here’s the code for the download button:




procedure TForm2.Button1Click(Sender: TObject);
var FileArray : TByteDynArray;
begin
// start downloading
FileArray := (rioDownload as IIDownloader).DownloadFile(edtFileName.Text);
if FileArray <> nil then
begin
ByteArrayToFile( FileArray, ExtractFilePath(Application.ExeName)
+ edtFileName.Text);
end;
end;

A file is requested from the server, and if it does arrive, we save it to a file in the same folder as the client application. (Here Application.ExeName is ok, because this is a client application that will always be an EXE) I’ve used another CompressHelper function to save the response byte array to disk.

But the code to actually populate the progress bar is in an event - THTTPRio.HTTPWebNode.OnReceivingData:





procedure TForm2.rioDownloadHTTPWebNode1ReceivingData(Read,
Total: Integer);
begin
pbDownload.Position := Trunc( Read/Total *100 );
lblProgress.Caption := Format(‘Downloaded %d of %d bytes’,[Read, Total]);
pnlProgress.Caption := Format(‘%d%%’,[pbDownload.Position]);
Application.ProcessMessages;
end;

The reason I have Application.ProcessMessages; in there is so that you can actually see the user interface change - otherwise the progress bar does not get updated. (But you probably knew that already)

What have we got?


This.


Caveats?



  1. This works only for Delphi SOAP that uses WinInet. If you use INDY, there’s probably a different approach to making it work.
  2. You can’t use this with a client built using the SOAP package. That’s because your source code changes to SOAPHTTPTrans.pas don’t change the package.
  3. I have also included a Download as Attachment to demonstrate that the changes you made work even with TSOAPAttachments. The source code reveals all.

Who’s Deepak Shenoy?

He’s part of the big pointy haired team at Agni. Update: Deepak now works at FLOvate Technologies.

Download the code for this white paper (dlprogress.zip, 12 KB)

Posted by Deepak Shenoy on February 4th, 2006 under Uncategorized | 3 Comments »


Stress testing Web Services

If you need to test your Web Service for performance, you can use the Web Application Stress Test (WAST) tool. It’s a Microsoft tool, free of cost.

You can learn more about how to use it in my paper on optimizing web applications. But that paper only talks about using WAST for web apps, i.e. browser based applications. What about web services?

Let’s see how WAST works. When you hit "record", WAST opens a new browser window, where you must access your web page, click links, enter data etc. When you’re done, you close the browser, and WAST will then allow you to simulate the same steps with lots more users, bandwidth etc. and gets the results to see how your web app responds to stress.

What WAST does is it acts like a proxy server, and records your requests. It will then "play back" the requests through multiple threads to simulate multiple users.

Web services can be stress tested the same way.

First, ensure you’re using WinInet in your Delphi SOAP and not Indy (WinInet is the default so if you don’t know what this is, don’t bother) This step is not necessary for .NET based web services of course.

Run WAST, and hit "Record". A browser window will come up. Ignore it, but do NOT close it.

Run your Web Service Client (something that accesses all functions of your web service) in the same machine as your server.

Go through a simulated use case on the client - eg. logon, get something, save something etc.

Close that (ignored) browser window when done. You’ll notice that WAST has done all the recording of XML sent etc. This can then be simulated for lots more users.

Note that WAST will only report on bad web results (Server errors returned as HTTP result codes etc.) You might need a different approach if you need to figure out SOAP Faults as well (maybe a temporary try/catch handler in the server that returns a different HTTP code if there’s an exception) Also if you want to see web requests in general, check out Fiddler.

Posted by Deepak Shenoy on November 18th, 2005 under Uncategorized | Comment now »


Yes, a Delphi Roadmap.

It’s here, finally. From Danny’s post on Borland’s Delphi Roadmap, the whole "strategy" thing is a lot clearer. So we have a future, for both the Win32 and .NET side of things.

What we have is:
Dexter in 2005

  • Language improvents: (e.g. operator overloading)
  • Speed: IDE Startup and runtime speed improvements (with stuff from the Fastcode Project)
  • C++ support (Win32) including support for the VCL
  • Command line CF compiler
Highlander in 2006
  • Another dumb project name ("Highlander"???)
  • .NET 2.0 support (if .NET 2.0 is actually out by then)
  • We’re talking generics, partial classes, and nullable types.
  • The CF "IDE" with VCL.NET support

Overall this shows that Borland has a vision for a product that’s always been good, but has lost a lot of its former shine. Now, what we need is for Borland Management to not backtrack. Let there be more such informal fixes and more informal previews of upcoming products.

Oh yes, there’s even talk of a Delphi Win64 compiler in 2007.

Posted by Deepak Shenoy on September 28th, 2005 under Uncategorized | 1 Comment »


"Beginning to Offshore"?????

Why do people write like this? Choice phrases:

  • "clichés, outlook and a realistic suggestions"
  • But, flourishing outsourced development engages more than defining a product spec.
  • "remember: the more an outsourcer comprehends the milieu, the better prepared it will be…"

Overall the entire article is as clear as mud. But there’s more! It’s a ripoff from Bharat Khatau’s original article, which is a magnitude better in content and grammar. The rip off is terrible - it’s just run through a thesaurus, methinks. Every single sentence has been rephrased…no, has been gramatically assaulted - to produce something that might pass a copyright test, but fails on the grounds that it’s utter nonsense.

The original article has this for instance:
"Success requires careful definition of how your company and the outsourcer will interact - and the right spirit governing those interactions.".

The rip-off says :
"Success necessitates fastidious description of the way your company and the outsourcer will interrelate".

Also, Good projects for successful pilots involve minimal risks to the business strategy or core product

becomes First-rate projects for triumphant pilots rivet least risks to the business strategy or core product.

("rivet least risks"???? What are they smoking?)

The rip-off has, very helpfully, placed a link to the original article. Which kinda sums it up, I think: it’s not a malicious act, they’re just stupid.

Let me not take away from the entertainment value, of course. You need such articles so you can tell people - "I may be bad at documentation, but I ain’t *this* bad".

(If you like using one-and-a-half-foot-long-words, you’ll love sesqupedal pedantry)

Posted by Deepak Shenoy on September 15th, 2005 under Uncategorized | 2 Comments »


Microsoft Research?

I just visited Dan Miser’s Blog and found a link to Microsoft Research Downloads. I knew they did some research out there, but this stuff is just awesome! They have Allegiance- a multiplayer space-combat game, source code to attach to WiFi Networks using a single WiFi card, and even a safe versoin of C.

I haven’t yet experiemented with ConferenceXP - another one of the research projects. Essentially it’s software that allows video conferences to be "multi-cast" across a network - currently it needs a good/fast link, multi cast support and a really high end dedicated server for such stuff, but I think in the near future that will not be a big issue. This is a killer app, especially for multi location offices like ours. What I like about this is the ability to "archive" sessions - so that people who couldn’t attend a session can view it at a later date.

I’ve always wanted such things for conference calls - i.e. record a call to mp3 and then run it back for a transcript. (If anyone knows such a tool…) Also, we’ve started to use Skype for office communication. It’s amazing in terms of quality and also has an answering machine. Not that I hate regular phones - but I think they’re too darn expensive when you’re calling between India and the UK.

Yeah, no code in this post either. I have not compiled anything for weeks now…but I have found time to play squash. Maybe they’re mutually exclusive.

Posted by Deepak Shenoy on September 1st, 2005 under Uncategorized | Comment now »


New Job!

It’s time for a new job! I’m now at Flovate Technologies, as Chief Executive Officer, India. That’s a fancy title all right. But wait till you hear about my computer! (This is geeky)

I get a Dual Xeon 3 Ghz monster, with a 22" main and a 15" secondary monitor. There’s 1 GB ram and SCSI RAID disks totalling 140 Gigs of Bytes. And a 128 MB ATI Card, and three mice running around in wheels. Awesome stuff. I just get lost in the incredible real estate on the screen. My 15.4" Dell latitude is like a crowded alley in comparison.

I get to manage the team in India and co-ordinate with the folks in the UK, where I must say there are some incredibly talented developers! I just went through a couple of frameworks and man, this stuff is really impressive. I can’t reveal the juicy details, but let me just say that if there’s a Workflow map in the future, we’re going to be on it.

Non geeky stuff: I’m learning the ropes on a different kind of management. It’s so tempting to get into code, but it’s simply better not to touch it until you really understand the situation. I used to think the code was king, that you could figure out anything just looking at the source code : Yes, at this point I can probably identify a ton of patterns by looking deep enough. But does that really matter? What you really need to understand, right off the top, is what the product or project is about. What kind of users use it, what the business proposition is. Imagine you’re the customer, and ask stupid questions (the former sometimes implies the latter). Only then get into the code!

I also need to understand that every developer will take short cuts, even the best of ‘em. To refactor is one thing. To identify and create an environment that will support and encourage refactoring is quite another. And then there’s the whole scheduling, project management etc. issue - I think I’m going to become a PHB.

Anyhow, what’s important is this: I can have THREE rows of icons on the status bar and still have enough on the screen to eat dinner out of. Ha!

No seriously, this is going to be one helluva challenge. I’m quite looking forward to it! My next few posts might involve lesser technology. Or more. I don’t know. Interesting times, indeed.

Posted by Deepak Shenoy on July 7th, 2005 under Uncategorized | 2 Comments »


Delphi problem with uploading compressed streams

In my Advanced Web Services article, I had demonstrated how you could do Datapacket compression by compressing the ENTIRE packet before it was sent from the server, and decompressing it at the client end. (Applies to encryption also)

Now I’d said you could do this the other way around too : compressing packets before sending on the client end, and expanding them at the server, using the BeforeRequest event of THTTPRio. This doesn’t work: Firstly there is a bug in D7 SOAP, that ignores the var parameter in the BeforeRequest handler. Look here for a fix I’ve mentioned.

A bigger problem is this: The BeforeExecute event is declared like this:


TBeforeExecuteEvent =
procedure( const MethodName: string;
var SOAPRequest: InvString) of object;

Now if you do some kind of compression or encryption, you might not like to deal with the WideString parameter. The process might introduce some NULL (0) characters in the character array, which will then be truncated by Delphi (which assumes a string ends on a NULL character).

Fortunately, the source is king. Here’s a few steps:


  1. Write a descendant component from THttpRio (call it THTTPRioEnh)
  2. Declare a type like so:

    TBeforeExecuteStreamEvent =
    procedure(const MethodName: string; Request: TStream) of object;


  3. In the THTTPRioEnh class, declare a published variable of type:

    property OnBeforeExecuteStream: TBeforeExecuteStreamEvent
    read FOnBeforeExecuteStream
    write FOnBeforeExecuteStream;

    Hit Ctrl+Shift+C. The private variable should get declared automatically.

  4. Override the DoBeforeExecute procedure and in it put:

    procedure DoBeforeExecute(const MethodName: string; Request: TStream);
    begin
    inherited DoBeforeExecute(MethodName: string; Request: TStream);

    if Assigned( FOnBeforeExecuteStream ) then
    FOnBeforeExecuteStream( MethodName, Request );
    end;


  5. Then register the component using a Register procedure, put it in a package, compile and install.
You can then drop a THTTPRioEnh component on your form, and assign a handler to OnBeforeExecuteStream of this component.

I am lazy, so I did all this in Rio.Pas and instead of creating a handler in the IDE I set this up in code instead, something like:


HTTPRio1.OnBeforeExecuteStream := BeforeExecuteStream;


Where I do the modifications to the request stream.

Posted by Deepak Shenoy on July 1st, 2005 under Uncategorized | Comment now »



Server Response from: dnrh1.codegear.com

 
© Copyright 2008 Embarcadero Technologies, Inc. All Rights Reserved. Contact Us  |   Site Map  |   Legal Notices  |   Privacy Policy  |   Report Software Piracy