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,839 other subscribers

Archive for the ‘Software Development’ Category

Actual source for DisableAlignPropertyEditor

Posted by jpluimers on 2016/11/30

Since Uwe Schuster only published a screenshot, I NewOCR-ed it and created the accompanying .dproj file (only because it’s an easy way for the DLL to require the designide package so you can use the DesignIntf and ToolsAPI units.

Uwe only posted these:

Anyway, the sources are at gist.github.com/881d4eacbcec2a9e1e6b0181f900fd7a, but the main source is this:

library DisableAlignPropertyEditor;

{
  Originally only as jpg image by Uwe Schuster.

  https://web.archive.org/web/20161117154454/https://pbs.twimg.com/media/Cxaoi-DXEAAMF03.jpg:large
  https://web.archive.org/web/20161117154450/https:/twitter.com/UScLE/status/799011392703647744
  https://web.archive.org/web/20161117154501/https://plus.google.com/107811538224738992137/posts/hTXUwkCe1TV
}

uses
  System.SysUtils,
  System.TypInfo,
  DesignIntf,
  ToolsAPI;

var
  LastRegisterPropertyEditorProc: TRegisterPropertyEditorProc = nil;

procedure NewRegisterPropertyEditor(PropertyType: PTypeInfo; ComponentClass: TClass; const PropertyName: string; EditorClass: TPropertyEditorClass);
begin
  if Assigned(EditorClass) then
  begin
    if SameText('TAlignProperty', EditorClass.ClassName) then
      Exit;
  end;
  LastRegisterPropertyEditorProc(PropertyType, ComponentClass, PropertyName, EditorClass);
end;

procedure wizardTerminate;
begin
  RegisterPropertyEditorProc := LastRegisterPropertyEditorProc;
end;

function wizardInit(const BorlandIDEServices: IBorlandIDEServices; RegisterProc: TWizardRegisterProc; var Terminate: TWizardTerminateProc): Boolean; stdcall;
begin
  LastRegisterPropertyEditorProc := RegisterPropertyEditorProc;
  RegisterPropertyEditorProc := NewRegisterPropertyEditor;
  Terminate := wizardTerminate;
  Result := True;
end;

exports
  wizardInit name WizardEntryPoint;

begin
end.

–jeroen

Read the rest of this entry »

Posted in Delphi, Delphi 10.1 Berlin (BigBen), Development, Software Development | 2 Comments »

Unbundling Pokémon Go — Applidium

Posted by jpluimers on 2016/11/30

On the reverse engineering of an early Pokemon Go apk, the protocol it uses and some more interesting findings: Unbundling Pokémon Go — Applidium

–jeroen

Posted in Android, Development, Java, Java Platform, Mobile Development, Software Development | Leave a Comment »

Can some recommend a good tool to build MSI package? I use Inno Setup…

Posted by jpluimers on 2016/11/30

For my G+ Link archive:

Can some recommend a good tool to build MSI package?I use Inno Setup but only to build EXE file.Thanks,  – Chris Z. – Google+

Source: Can some recommend a good tool to build MSI package? I use Inno Setup but only…

Related:

Posted in Delphi, Development, Installer-Development, Software Development | Leave a Comment »

When AQTime thinks it’s running during install and aborts installation

Posted by jpluimers on 2016/11/29

I had this warning (which is actually an error: you cannot continue as pressing OK would get you the same warning over and over again) during AQTime installation a while ago:

---------------------------
WARNING !
---------------------------
Setup has detected AQtime running on your computer. You must close the application and press OK to continue.

Press Cancel to abort installation.
---------------------------
OK   Cancel
---------------------------

Back then:

  1. I was Administrator
  2. The Installer download was from http://downloads.smartbear.com/AQtime.exe
  3. The embedded version was 8.50.1720
  4. It did successfully extract the AQtime.msi before bailing out

The fix (from SmartBear support) was remarkably simple, so I was surprised I could not find it online:

If your downloaded, saved AQtime installation package is named AQtime.exe, rename it: (ex: AQtime850.exe and you should then be able to complete the installation process.

So basically renaming AQTime.exe into AQTime850.exe allowed it to install.

–jeroen

Posted in Debugging, Development, Software Development | Leave a Comment »

james-atkinson/speedcomplainer: A python app that will test your internet connection and then complain to your service provider (and log to a data store if you’d like)

Posted by jpluimers on 2016/11/29

Cool: james-atkinson/speedcomplainer: A python app that will test your internet connection and then complain to your service provider (and log to a data store if you’d like)

It can auto-tweet your status to an ISP.

via:

–jeroej

Posted in Development, Internet, Power User, Python, Scripting, Software Development | Leave a Comment »

The curse of the Project.res file.

Posted by jpluimers on 2016/11/29

A long time ago, Lars Fosdal wrote this on the Delphi G+ group:

It really is beyond me why there is no Project.rc file which includes

  • Project.version.rc
  • Project.icon.rc
  • Project.themes.rc
  • Project.manifest.xml
  • and so forth.

That way, the .res file would be a compile-time thing (or even a thing of the past) – and the resource linker would assemble the various bits from their individual sources.

It has been an issue forever. Vincent Parrett correctly commented that if you clean out too much out of the Project.res file, the IDE gets confused:

The only thing it is used for is version info and the mainicon (the IDE gets confused if don’t do that).

In my own experience, this isn’t the case for all Delphi versions, but I forgot which versions suffer and which don’t. I think the IDE theming issue omitting the Application word in the .dpr is related.

Like many of the G+ commenters, I’ve switched to script based resources for my own projects a long time ago. That’s also the reason why I forgot: this approach just works for any Delphi version.

This post is a reminder to self to see if the IDE has finally refrained from doing Project.res handling itself.

–jeroen

Source: The curse of the Project.res file…

Some related posts:

Posted in Delphi, Delphi 1, Delphi 10 Seattle, Delphi 2, 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, Delphi XE4, Delphi XE5, Delphi XE6, Delphi XE7, Delphi XE8, Development, Software Development | 5 Comments »

Delphi F12 Debug Hotkey for Windows 8.1 and 10 | Andy’s Blog and Tools

Posted by jpluimers on 2016/11/28

Yes. Yes. Yeesssss!

It solves [WayBackdebugging – F12 not working in Delphi debugger on Windows 7/8 – Stack Overflow

Due to robots.txt the site cannot be archived in the WayBack machine, so I’m keeping a local copy of any http://andy.jgknet.de/blog/wp-content/plugins/download-monitor/download.php?id=* files.

This is how I installed the extracted DelphiF12HotKeySupport.dll:

Read the rest of this entry »

Posted in Delphi, Development, Software Development | Leave a Comment »

The Delphi Vcl.Forms.TApplication.ActionUpdateDelay unit is … milliseconds

Posted by jpluimers on 2016/11/24

Don’t you love relevant documentation…

There is no unit defined for the Vcl.Forms.TApplication.ActionUpdateDelay – RAD Studio API Documentation.

It is used inside the TAppliation.Idle to fire the (undocumented) TApplication.DoActionIdle method. When the value is zero or less, then each Idle call will result in an DoActionIdle call in turn calling TCustomForm.UpdateActions for any visible form.

UpdateActions in turn will call (for the form itself, all the form’s menu items and all the form’s controls) the TControl.InitiateAction which – if there is an associated ActionLink – will call the TBasicActionLink.Update which in turn will call the TBasicAction.Suspended and TBasicAction.Update methods of which the latter will call the TBasicAction.OnUpdate event if it is assigned.

In theory, the OnUpdate method for each action can even be called multiple times (because multiple controls on visible forms can point to it), but the real culprit is that TApplication.Idle as it can be called from these places:

  • TApplication.DoApplicationIdle
  • TApplication.HandleMessage (in a loop from TApplication.Run)
  • TCustomActionMenuBar.ProcessMenuLoop (in a loop)
  • TCustomRibbon.DisplayKeyTips (in a loop)

The last three (especially HandleMessage) can be disastrous as they can be called a lot (for instance when moving the mouse), and more often than not, the OnUpdate event handlers aren’t exactly CPU friendly.

A while ago I bumped into an application where the OnUpdate event handler for one action was called half a million time in under 5 minutes.

This clearly indicated a huge problem (besides using a full CPU core slowing down the application) as apparently something was broadcasting Windows Messages like crazy.

Investigating and Solving the message flood is on the back-log with a reasonably high priority, but the highest priority issue was fixing the high CPU usage in the first place.

Apparently more users suffer from this, as there is a Vcl.Forms.TApplication.ActionUpdateDelay property which TApplication.Idle uses to call the Windows API function SetTimer to rate-limit the TApplication.DoActionIdle call tree. Luckily SetTimer does have documentation on the unit of ActionUpdateDelay: it’s milliseconds.

I’ve set it to 10 as that updating the actions ~100 times a second is fast enough for this application.

–jeroen

via:

Posted in Delphi, Delphi 10 Seattle, Delphi 10.1 Berlin (BigBen), Delphi 2007, Delphi 2009, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Delphi XE6, Delphi XE7, Delphi XE8, Development, Software Development | Leave a Comment »

Delphi: function IsRunningFromNetwork – via Lars Fosdal. I will need this one day

Posted by jpluimers on 2016/11/24

If I ever need it: function IsRunningFromNetwork that is based on WNetGetConnection.


function IsRunningFromNetwork(const ServerName:String = 'BetYouCantFindThisServer'): Boolean;
const
pMax = 2047;
var
dt: UINT;
volpath: Array[0..pMax] of Char;
sVol: String;
sz: Cardinal;
begin
Result := False;
dt := GetDriveType(PChar(ExtractFilePath(ParamStr(0))));
if dt = 4
then begin
GetVolumePathNameW(PChar(LowerCase(ParamStr(0))), volpath, pMax);
sVol := StrPas(volpath);
if not ((pos(LowerCase(ServerName), sVol) <> 0) or (pos('\\', sVol) = 1))
then begin
if pos(':', sVol) <> 0
then begin
sz := pMax;
if WNetGetConnection(pChar(Copy(sVol, 1, 2)), volPath, sz) = NO_ERROR
then Result := (pos(LowerCase(ServerName), LowerCase(StrPas(volPath))) <> 0) or (pos('\\', StrPas(volPath)) = 1);
end;
end
else Result := True;
end;
end;

Thanks Lars; I copied it to a gist for easier WordPress handling.

–jeroen

via:

Posted in Delphi, Development, Software Development | Leave a Comment »

Recursion

Posted by jpluimers on 2016/11/23

Apple fanboys all know about 1 Infinite Loop. Turbo Pascal adepts about the index entries “infinite loop See loop, infinite” and “loop, infinite See infinite loop”.

Google as a more direct approach: www.google.com/search?q=recursion

Read the rest of this entry »

Posted in Algorithms, Apple, Borland Pascal, Design Patterns, Development, Google, Pascal, Power User, Software Development, Turbo Pascal | Leave a Comment »