The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • My Flickr Stream

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 1,854 other subscribers

Archive for the ‘Delphi’ Category

Delphi + ADO + dBase – Stack Overflow

Posted by jpluimers on 2013/04/10

For my research queue:

I should look at the below ConnectionStrings to access dBase with ADO from Delphi, If I ever need to do that.

Thanks Cromulent for asking, Nelson for editing and Pieter for answering:

Microsoft dBase ODBC driver

Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;OLE DB Services = -1;Extended Properties=dBase IV;Dbq=c:\mypath

doing operations like ADOTable1.Open are very fast (good) but GetIndexNames returns nothing (bad).

Microsoft Jet OLEDB 4.0 driver

Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;OLE DB Services=-1;Data Source=c:\mypath

doing operations like ADOTable1.Open are exceedingly slow (bad) while GetIndexNames does return index names the way it should (good).

How do I get both speed and the index info via ADO for the dBase tables?

Microsoft Paradox Driver 7.x

“We use the following connection string which works really well.”

Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="Driver={Microsoft Visual FoxPro Driver};UID=;SourceDB=c:\mypath;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;"

–jeroen

via Delphi + ADO + dBase – Stack Overflow.

Posted in Delphi, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 5, Delphi 6, Delphi 7, Delphi XE, Delphi XE2, Delphi XE3, Development, Software Development | 8 Comments »

Pascal/Delphi parsers and grammars

Posted by jpluimers on 2013/04/09

A few interesting links for my archive:

–jeroen

Posted in Delphi, Development, FreePascal, Pascal, Software Development | 3 Comments »

More Old Micro Cornucopia issues on BitSavers from 1987 and 1988

Posted by jpluimers on 2013/04/08

Last quarter, 11 issues of Micro Cornucopia appeared on BitSavers including the final May 1990 issue.

This month, another 7 issues appeared, most of which cover a form of Pascal in one or more of the articles and advertisements:

A fun thing to notice are the advertisements for Modula-2. Logitech Modula-2. Yes though the Logitech Wikipedia page does not mention it at all, Logitech didn’t only sell mice, keyboards and web-cams. They had more products. Being Swiss, they were big in Modula-2. And Bitsavers has a PDF of that too: Logitech_Modula-2_86_1.0_Feb84.pdf

The only issues still to be scanned are #28 till #32.

–jeroen

via: New Micro Cornucopia issues on BitSavers including the Final May 1990 issue « The Wiert Corner – irregular stream of stuff.

Posted in Assembly Language, BitSavers.org, C, C++, Delphi, Development, History, Pascal, Software Development, Turbo Assembler, Turbo Pascal, x86 | Tagged: , , , , | 2 Comments »

autoscrolling memo in delphi – Stack Overflow

Posted by jpluimers on 2013/04/03

Just found this great answer by vcldeveloper to autoscroll a readonly logging memo in Delphi which works from Delphi 1 and up (:

For such a simple task, you don’t need to buy a commercial component! All you need to do is to send an EM_LINESCROLL message to that memo control, to make it scroll to the last line:

procedure ScrollToLastLine(Memo: TMemo);
begin
  SendMessage(Memo.Handle, EM_LINESCROLL, 0,Memo.Lines.Count);
end;

If your memo is read-only to users and is updated automatically by the application, you can put a call to the above procedure in its OnChange event-handler, so that whenever the text inside the memo is changed, it is automatically scrolled down to the last line.

–jeroen

via: autoscrolling memo in delphi – Stack Overflow.

Posted in Delphi, Delphi 1, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 3, Delphi 4, Delphi 5, Delphi 6, Delphi 7, Delphi x64, Delphi XE, Delphi XE2, Delphi XE3, Development, Software Development | 9 Comments »

Some Delphi libraries and ideas you should take a look at (link clearance)

Posted by jpluimers on 2013/03/28

There are a couple of very interesting libraries and ideas every Delphi developer should take a look at.

The list is far from complete, but should give you a good overview on what more recent Delphi language additions like attributes, generics, helpers, overloading, are capable of.

–jeroen

Posted in Delphi, Delphi 2009, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Development, Software Development | 3 Comments »

Delphi XE3 inside a Windows 7 VMware Fusion VM at 2560×1600 on a 15 inch Retina MacBook Pro at 2880×1800

Posted by jpluimers on 2013/03/27

I was amazed that this is still usable:

You can even run VMware Fusion 4 full screen at 2880×1800, but I prefer to have the Mac Desktop and Dock to be visible. I didn’t have any of the VMware Fusion 4 issues mentioned here.

So the only thing you need VMware Fusion 5 for is Windows 8 support.

You need SwitchResX to get the Retina MacBook to use 2880×1800 at all (otherwise you get 1920×1200 at 1.5 scale factor, which is also a 16:10 display ratio).

It really runs 5+ hours on one battery charge, which is much longer than my ThinkPad W701.

All in all, I’m very happy with this setup.

--jeroen

PS:

via: Screen Shot 2013-03-27 at 19.55.39 | Flickr – Photo Sharing!.

Click on the image or here for full size image.

Delphi XE3 inside a Windows 7 VMware Fusion VM at 2560x1600 on a 15 inch Retina MacBook Pro at 2880x1800

Posted in Apple, Delphi, Delphi XE3, Development, Mac, Mac OS X / OS X / MacOS, MacBook, MacBook Retina, OS X 10.8 Mountain Lion, Power User, Software Development | 7 Comments »

Delphi: you should avoid the `with` statement as it makes your code less future proof

Posted by jpluimers on 2013/03/27

As I wrote before, I’m with the [WayBack] Delphi with haters camp, and this is why:

Using the [WayBackwith statement in Delphi makes your code less future proof.

Originally, the with statement in Pascal was argumented in part of allowing compiler optimisations:

PASCAL User Manual and Report – Kathleen Jensen, Niklaus Wirth – Google Books

The with clause effectively opens the scope containing field identifiers of the specified record variable, so that the field identifiers may occur as variable identifiers. (Thereby providing an opportunity for the compiler to optimize the qualified statement.)

Screenshots of this 1975 book are below the fold.

The Delphi (actually even before that Turbo Pascal compiler) has no measurable difference between with and non-with code.

The debugger however, still does not support with, and there are other drawbacks of which one is below.

The below code example is just one of many. I show it because I recently bumped into doing some long overdue code porting to Delphi XE3.

Since I’ve been bitten by using with a couple of times before, it didn’t take me long to find the cause.

Example code where FIConData is of type NOTIFYICONDATAW that used to compile fine:

    with FIconData do
    begin
      cbSize := SizeOf(FIconData);
      Wnd := Self.Handle;
      uID := $DEDB;
      uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
      hIcon := Application.Icon.Handle;
      uCallbackMessage := WM_CAS400NTIcon;
      StrCopy(szTip, PChar(Caption));
    end;

Well, as of Compiler Version 20, it doesn’t compile any more. Read the rest of this entry »

Posted in Borland Pascal, Conference Topics, Conferences, Delphi, Delphi 1, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 3, Delphi 4, Delphi 5, Delphi 6, Delphi 7, Delphi XE, Delphi XE2, Delphi XE3, Development, Event, Pascal, Software Development, Turbo Pascal, With statement | 32 Comments »

WebSphere MQ errors I encountered.

Posted by jpluimers on 2013/03/26

While porting a library from Delphi 2006 to Delphi XE2.

The really cool thing is that the Windows Event Log contains details of what I did wrong (:

  • 2277 (08E5) (RC2277): MQRC_CD_ERROR
    Oops, typo on the header file.The MQCD structure supplied was not valid.The value of the ‘CLWLChannelWeight’ field has the value ‘0’. This value is invalid for the operation requested.Change the parameter and retry the operation.
  • 2538 (09EA) (RC2538): MQRC_HOST_NOT_AVAILABLE
    Oops, typo in the host name (:Remote host ‘Host.Domain’ not available, retry later.The attempt to allocate a conversation using TCP/IP to host ‘Host.Domain’ for channel WebSphereMQChannelName was not successful. However the error may be a transitory one and it may be possible to successfully allocate a TCP/IP conversation later. &P In some cases the remote host cannot be determined and so is shown as ‘????’.Try the connection again later. If the failure persists, record the error values and contact your systems administrator. The return code from TCP/IP is 11001 (X’0′). The reason for the failure may be that this host cannot reach the destination host. It may also be possible that the listening program at host ‘Host.Domain’ was not running. If this is the case, perform the relevant operations to start the TCP/IP listening program, and try again.
  • 2009 (07D9) (RC2009): MQRC_CONNECTION_BROKENTwo causes:- The service job on the AS/400 restarted; need to make the client more robust so it gracefully handles this.
    – WebSphere MQ 7.x needs different initialization than WebSphere MQ 5.x, I didn’t get some of the extra fields initialized correctly.
    Connection to host ‘Host (dot.ted.ip.addr)(TCPPort)’ for channel ‘WebSphereMQChannelName’ closed.An error occurred receiving data from ‘Host (dot.ted.ip.addr)(TCPPort)’ over TCP/IP. The connection to the remote host has unexpectedly terminated. &P The channel name is ‘WebSphereMQChannelName’; in some cases it cannot be determined and so is shown as ‘????’.

    Tell the systems administrator.

–jeroen

Posted in Delphi, Delphi XE2, Development, MQ Message Queueing/Queuing, Software Development, WebSphere MQ | Leave a Comment »

Porting to Delphi XE2: Delphi XE2 Unit scope names not always right

Posted by jpluimers on 2013/03/21

Sometimes, Delphi XE2 gets confused after converting an old Delphi project because the Unit scope names are not correct. When creating a new Delphi XE2 application, the Unit scope names are as follows:

  • System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell

This means that if you don’t prepend a unit with a Unit scope prefix, Delphi will automatically try the list above. The thing is: when importing a Delphi project from an old Delphi version, the Unit scope names are somehow “guessed”, and not always complete:

  • System;Xml;Data;Datasnap;Web;Soap;Winapi

This means it cannot resolve the right name for the VCL units like Controls or Forms, and you get a nice compiler error: But with the default, it cannot resolve the Windows and other units in the Winapi scope. So the list I normally use is one of these:

  • System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;Winapi;System.Win
  • System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;Winapi;System.Win;Bde

(Yes, some apps still store Paradox data locally and use the BDE)

–jeroen

Posted in Delphi, Delphi XE2, Delphi XE3, Development, Software Development | 2 Comments »

Confusing Delphi message: [DCC Error] E2201 Need imported data reference ($G) to access ‘VarCopyProc’ from unit ‘XXX’

Posted by jpluimers on 2013/03/20

I recently had an error like this when building with packages:

[DCC Error] E2201 Need imported data reference ($G) to access 'VarCopyProc' from unit 'SynCommons'

It was a bit hard to find good information about this error, mainly because of two reasons:

  1. the documentation on E2201 Need imported data reference ($G) to access ‘%s’ from unit ‘%s’ isn’t very well written
  2. [dcc error] e2201 need imported data reference ($g) to access ‘varcopyproc’ from unit – Google Search doesn’t yield very good answers

Finally, it was the FastMM and D2007 – Delphi Language BASM – BorlandTalk.com thread pointing me to Hallvard’s Blog: Hack#13: Access globals faster ($ImportedData).

That explained the error was caused by:

  • VarCopyProc being a variable in one package
  • VarCopyProc access being needed from the package that failed to compile
  • Not having {$G+} or {$IMPORTEDDATA ON} in the failing package would prevent that access

Somehow that does not work for all cases. Apparently, the VarCopyProc isn’t exported from the Delphi RTL as that package is compiled in the $G- state.

So I had to add the USEPACKAGES define to the conditional defines list, which forces the SynCommons to use the standard version of the RecordCopy method in stead of a highly optimized one that calls VarCopyProc.

–jeroen

Posted in Delphi, Delphi XE2, Delphi XE3, Development, Software Development | 2 Comments »