Archive for the ‘Delphi’ Category
Posted by jpluimers on 2017/12/13
A nice article [Archive.is] What is thread safety anyway? with a kind reference to the Deadlock Empire translation from C# to Delphi that I made.
In any language, multi-threading is hard, so I really love the quote below:
[WayBack] Multithreading can be hard to do right. The most common point of failure is assuming some code is thread safe when it actually is not... – Dalija Prasnikar – Google+
It reminded me of an old one:
A programmer had a problem. He thought to himself, “I know, I’ll solve it with threads!”. has Now problems. two he
–jeroen
Posted in .NET, C#, Delphi, Development, Fun, Multi-Threading / Concurrency, Quotes, Software Development, T-Shirt quotes | Leave a Comment »
Posted by jpluimers on 2017/12/07
Ah, C. The best lingua franca we have… because we have no other lingua francas. Linguae franca. Surgeons general? C is fairly old — 44 years, now! — and comes from a time when there were possibly more architectures than programming languages. It works well for what it is, and what it is is a relatively simple layer of indirection atop assembly. Alas, the popularity of C has led to a number of programming languages’ taking significant cues from its design, and parts of its design are… slightly questionable. I’ve gone through some common features that probably should’ve stayed in C and my justification for saying so. The features are listed in rough order from (I hope) least to most controversial. The idea is that C fans will give up when I call it “weakly typed” and not even get to the part where I rag on braces. Wait, crap, I gave it away.
Great re-read towards the end of the year: [WayBack] Let’s stop copying C / fuzzy notepad
Via: [WayBack] Old and busted: emacs vs vi. New and hot: Language war, everybody against everybody else. – Kristian Köhntopp – Google+
–jeroen
Posted in .NET, APL, Awk, bash, BASIC, C, C#, C++, COBOL, CoffeeScript, CommandLine, D, Delphi, Development, F#, Fortran, Go (golang), Java, Java Platform, JavaScript/ECMAScript, Pascal, Perl, PHP, PowerShell, PowerShell, Python, Ruby, Scala, Scripting, Software Development, TypeScript, VB.NET, VBScript | 3 Comments »
Posted by jpluimers on 2017/12/06
Oh nice. Feel free to QP. Fails at least in Delphi XE8.
program E2003WithConstsInDescendingClassesConsoleProject;
{$APPTYPE CONSOLE}
uses
ParentUnit in 'ParentUnit.pas',
ChildUnit in 'ChildUnit.pas';
begin
end.
unit ParentUnit;
interface
type
TParent = class
// section can be strict protected, protected, public, published or nothing
const
InitialBooleanValue = False;
InitialIntegerValue = -1;
end;
implementation
end.
unit ChildUnit;
interface
uses
ParentUnit;
type
TChild = class(TParent)
// section can be strict protected, protected, public, published or nothing
const
// Initial and final values need to be different to test the behaviour
FinalBooleanValue = not InitialBooleanValue;
FinalIntegerValue = InitialIntegerValue + 1;
//[dcc32 Error] ChildUnit.pas(13): E2003 Undeclared identifier: 'InitialBooleanValue'
//[dcc32 Error] ChildUnit.pas(14): E2003 Undeclared identifier: 'InitialIntegerValue'
//[dcc32 Error] ChildUnit.pas(14): E2026 Constant expression expected
end;
implementation
end.
[WayBack] Oh nice. Feel free to QP. unit ParentUnit; interface type TParent = class …
Posted in Delphi, Delphi XE8, Development, Software Development | 3 Comments »
Posted by jpluimers on 2017/12/04
Delphi tip of the day:
{$WARN UNSUPPORTED_CONSTRUCT ERROR}
It will throw a compiler error when you use an attribute that isn’t defined as the above [WayBack] turns a warning into an error as normally [WayBack] UNSUPPORTED_CONSTRUCT is only a warning.
Which means that this code now fails:
type
TmyClass = class
[djhgfskdhgks]
procedure One;
end;
Thanks [WayBack] +Agustin Ortu for posting this tip!
I wish I had known this when I found the G+ post leading to On turning “W1025 Unsupported language feature: ‘customattribute’” into a compiler error.
–jeroen
via:
related:
Posted in Delphi, Development, Software Development | 2 Comments »
Posted by jpluimers on 2017/11/30
Note that the below solution works for any project raising the W1029 warning (not just from projects using Delphi Mocks) like
[dcc32 Warning] W1029 Duplicate constructor 'ClassName.ConstructorName' with identical parameters will be inacessible from C++
From my original text at [WayBack] Get rid of W1029 warning in Delphi compile mode · Issue #106 · VSoftTechnologies/Delphi-Mocks · GitHub:
By default the compiler will emit warnings like these for projects when using either of the Delphi.Mocks.Behavior or Delphi.Mocks.Expectation directly or indirectly:
[dcc32 Warning] W1029 Duplicate constructor 'TExpectation.CreateOnceWhen' with identical parameters will be inacessible from C++
They’re harmless as DUnitX doesn’t support C++. This particular warning type cannot be disabled on the unit or source line level which means you have to disable it on the project level by either:
- adding
{$WARN DUPLICATE_CTOR_DTOR OFF} anywhere to your .dpr project file
- modifying the the Project Options for your project (easiest is in the
All configurations - All platforms target):
- follow the path
Delphi Compiler, Hints and Warnings in the treeview on the left
- expand the
Output warnings node in the listview on the right
- set
Duplicate constructor/destructor with identical parameters will be inacessible from C++ to Error
A screenshot of the second option is below.
Note that the spelling mistake in Duplicate constructor/destructor with identical parameters will be inacessible from C++ is how it is in the IDE, but that as Google search string it will give limited results, so here are some back-ground references:

Read the rest of this entry »
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 »
Posted by jpluimers on 2017/11/29
Though I try to refrain from using the singleton pattern when possible (I prefer dependency injection over accessing “globals” that usually tend up to be not so global after all), sometimes I need to.
In C# there has been a canonical singleton pattern implementation by John Skeet for a very long time at [WayBack] C# in Depth: Implementing the Singleton Pattern.
I just found out there has been similar implementations in Delphi both in this question (which like many useful questions is marked “closed”, oh the joy of StackOverflow): [WayBack] “Delphi Singleton Pattern – Stack Overflow:
I like both implmentation, but usually take the first as mostly locking has little overhead and sometimes two instances cannot co-exist (though that’s lessened when part of the singleton uses lazy initialisation, for instance from Spring4D).
–jeroen
via: [WayBack] May I please ask for your opinion on the following code:..singleton… – John Kouraklis – Google+
Posted in Delphi, Development, Software Development | Leave a Comment »
Posted by jpluimers on 2017/11/29
Sometimes the title of a G+ entry looks not so interesting, but then you read the comments. In this cast it’s about the mediator pattern support in the tiOPF object persistence framework, how it works very well from Free Pascal and both classic and modern Delphi compilers and why developers dislike ARC. It’s cool as it allows you to decouple UI from business logic and separate out business logic from your application into a back-end. Recommended reading: [WayBack] Hello i have a program that use MS SQL SERVER 2000i want to make a mobile application that connect to this database to make some consultationclient fi… – Mohammed Bouhlal – Google+
–jeroen
Posted in Delphi, Development, FreePascal, Pascal, Software Development | Leave a Comment »
Posted by jpluimers on 2017/11/28
I think it was Stefan Glienke who pointed me at the Memoisation pattern: [WayBack] Implementing Memoize in Delphi 2009 – Community Blogs – Embarcadero Community
Or in laymans terms: caching with generic functions and dictionaries.
Note the Archive.is link is way better readable than the WayBack link, so below I’ve saved parts only in Archive.is.
It points to two other interesting reads:
Later I found it was indeed Stefan who pointed me to the above links and also came up with this very small Memoisation example which is based on Spring4D:
and guess what? because we have interfaced based dictionary this is super easy, let me just hack an example, 5mins6:52 PM
function BuildCache: Tfunc<string,string>;
var
cache: IDictionary<string,string>;
begin
cache := TCollections.CreateDictionary<string,string>;
Result :=
function(s: string): string
begin
if not cache.TryGetValue(s, Result) then
begin
Sleep(1000); // hard work! ;)
Result := ReverseString(s);
cache.Add(s, Result);
end;
end;
end;
Since the returned anonymous method captures the dictionary its kept inside and once the anonymous method goes out of scope the dictionary is also cleaned, want to reset the cache? Just create a new one and throw the old one away.
Need thread safety? just add
System.TMonitoy.Enter/Leave(cache.AsObject);
–jeroen
Posted in Delphi, Development, Software Development | Leave a Comment »
Posted by jpluimers on 2017/11/23
[WayBack] Use operator overloading for classes with non-ARC compiler · GitHub
The trick: do not use class operator but use class function &&op_ with the special operator name in the table referenced below. Just follow the bulleted example links to get an idea.
Bonus: it works on class helper constructs as well.
Officially this unsupported and with the non-ARC compiler you will have a risk of memory leaks.
But it’s so much fun as these links prove:
The usual operator gotchas apply here as well: Delphi operator overloading: table of operators, names, and some notes on usage and ‘glitches’.
The operators you could try: [WayBack] Operator Overloading (Delphi) – RAD Studio
Oh, this thread needs some change now: [WayBack] List of Delphi language features and version in which they were introduced/deprecated – Stack Overflow
–jeroen
Posted in Delphi, Development, Software Development | 1 Comment »