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

Chr equivalent for Unicode in Delphi 7 – Stack Overflow

Posted by jpluimers on 2020/06/17

From a long time ago: [WayBackchr equivalent for Unicode in Delphi 7 – Stack Overflow answered by David Heffernan:

Q

I need to initialize a Widestring in Delphi 7 but I can’t use chrfunction which is ANSI

var
  ws : Widestring;
begin

 ws := chr($FFFF) + chr($FFFF) + chr($FFFF);

end;

What can I use, then ?

A

I’m not sure there’s a simply way to do what you wish. You can convert a Word into a WideChar with a simple cast:

WideChar($FFFF)

but you cannot concatenate WideChar. So this is a compiler error:

WideChar($FFFF) + WideChar($FFFF)

You could use a helper function to get the job done:

function InitialiseWideString(const chars: array of Word): WideString;
var
  i: Integer;
begin
  SetLength(Result, Length(chars));
  for i := 0 to high(chars) do
    Result[i+1] := WideChar(chars[i]);
end;

Then you can call it like this:

ws := InitialiseWideString([$0054, $0069, $006D, $0065, $0020, $0074, $006F, 
  $0020, $0075, $0070, $0067, $0072, $0061, $0064, $0065]);

–jeroen

Posted in Delphi, Delphi 7, Development, History, Software Development | 3 Comments »

Dynamically instantiating instances in Delphi without knowing their full type is hard

Posted by jpluimers on 2020/06/17

For my reading list: [WayBack] So am working on a particular .NET project and came across NewtonSoft JSON.NET Serializer, it allows you serialize Collections such as a generic list an… – Ugochukwu Mmaduekwe – Google+:

Stefan Glienke:
Serializing and mostly deserializing generics in Delphi is a major PITA because we don’t have such capabilities to dynamically work with them like in C# where you can easily create new generic lists at runtime where you don’t know the precise type T at compile time.

–jeroen

 

Posted in .NET, C#, Delphi, Development, Software Development | Leave a Comment »

Delphi AMQP links

Posted by jpluimers on 2020/06/11

Some links I found about Delphi and AMQP.

AMQP

Delphi and AMQP

Threads:

Tests

Other environments

–jeroen

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

Don’t mix objects and interfaces

Posted by jpluimers on 2020/06/11

Worth repeating Dalija Prasnikar, because I bumped into sources of people not getting this concept: [WayBack]: Don’t mix objects and interfaces.

You should not, but sometimes it is hard not to.

The rules in his article are very important as they indicate what’s safe and what’s not:

  1. object references are weak, interface references are strong
  2. reference counted object instances need at least one strong reference to keep them alive therefore you can’t use object reference as primary owning reference
  3. reference counted object instances can be safely accessed through temporary, short-lived (weak) object references, as long as there are strong reference(s) keeping the object alive

So basically:

  • ensure a reference counted instance has at least one strong reference to manage the lifetime
  • temporary (short-lived) weak references are OK as long as you are sure the strong reference lives longer

Note that unsafe will make interfaces references weak instead of strong; the same holds for pointer lists [WayBack] Using the [unsafe] attribute, it is possible to store the interface without reference counting. Is there any way for this behavior to be “transferred” … – Jacek Laskowski – Google+

–jeroen

via: [WayBack] Dalija Prasnikar – Google+

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

Thread.Destroy deadlocks in finalization of COM+ dll’s…

Posted by jpluimers on 2020/06/04

Reminder to self that this is still broken:

[WayBack] Thread.Destroy deadlocks in finalization of COM+ dll’s This serious bug still exists in Delphi 10.2 after 12 years being reported! http://qc.embarcade… – 丽丽乌克 – Google+

Original report:

It was posted by Bart van der Werf, who also posted a workaround that is inside those WayBack links.

–jeroen

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

Some links on hooking anonymous methods to Delphi events

Posted by jpluimers on 2020/06/03

On my reading list are these:

–jeroen

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

Are there any static code analysis tools for Delphi/Pascal? – Stack Overflow

Posted by jpluimers on 2020/06/02

Still interesting question: [WayBack] Are there any static code analysis tools for Delphi/Pascal? – Stack Overflow

The basic problem here is that there is no formal language definition for the Delphi or Object Pascal language.

[WayBack] GitHub – RomanYankovsky/DelphiAST: Abstract syntax tree builder for Delphi (which also supports FreePascal and Lazarus) comes closest, and is used by FixInsight.

All other tools have more or less problems parsing various language constructs.

This starts with the built-in tooling that is based on [WayBack] Modeling Applications with Together which basically has not been maintained since the Delphi 2007 era.

Then there is for instance [WayBack] Code Healer Group CodeHealer for Delphi, but their [WayBack] Code Healer Group Forums – Index page have no messages since 2016.

Another wrapper around DelphiAST, is [WayBack] GitHub – MikhailIzvekov/DelphiSCA: Static code analysis tools for Delphi, which has a visual way to walk that AST. But it has not been maintained for years. The cool thing however, is that the AST is in sync with the code editor.

Finally, TestInsight uses DelphiAST to go to the right source code location.

--jeroen

Read the rest of this entry »

Posted in Delphi, Development, Software Development | 1 Comment »

SysUtils.pas Why parameters of these anonymous not const? TProc = …

Posted by jpluimers on 2020/06/02

At [WayBack] SysUtils.pas Why parameters of these anonymous not const? TProc = reference to procedure (Arg1: T1; Arg2: T2); TProc = reference … – Jacek Laskowski – Google+, Hallvard Vasbotn made this nail on the head comment:

It could have been solved if the const’ness had been seen as a implementation detail by the compiler (which it really is) and made const and non-const signatures assignment compatible.

It was changes like the above that I had hoped for when writing Source: 15 months later: what happened to Delphi Language Enhancements? « The Wiert Corner – irregular stream of stuff.

Now we are another 27 months later, so this again is a reminder to check what the compiler team (man?) has improved on the language side.

–jeroen

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

Need to look at monospaced programmers fonts again

Posted by jpluimers on 2020/05/27

At the time of looking, FiraCode would not work in Delphi but would in Visual Studio. Reminder for me to look at it again: [WayBack] GitHub – tonsky/FiraCode: Monospaced font with programming ligatures.

A cool feature of the font is that it has ligatures for common multi-character combinations like := or ...

Back when scheduling this, I was still at Lucida Console because of its large x-height and small line spacing.

It is time to revisit my font choice, so lets include at least these candidates:

–jeroen

related:

Edit 20200527: observations by Uwe Schuster

Posted in .NET, Delphi, Development, Font, Power User, Programmers Font, Software Development, Visual Studio 2015, Visual Studio and tools, vscode Visual Studio Code | Leave a Comment »

Why the compiler generates a `”E2018 Record, object or class type required”` on typed types…

Posted by jpluimers on 2020/05/21

From [WayBack] Why would the compiler generate a "E2018 Record, object or class type required" helper when I use a ToUpperInvariant (or any TStringsHelper call) on t… – Jeroen Wiert Pluimers – Google+:

Why would the compiler generate a "E2018 Record, object or class type required" when I use a ToUpperInvariant (or any TStringsHelper call) on the Text property of a TEdit?

Full failing code is at [WayBack] https://gist.github.com/jpluimers/b5e3684f725216622bdcb80bf5f10698

Failing line is this:

Edit1.Text := Edit1.Text.ToUpperInvariant;
// the above line generates this error:
// [dcc32 Error] MainFormUnit.pas(29): E2018 Record, object or class type required

This fails as well:

Edit1.Text := TStringHelper.ToUpperInvariant(Edit1.Text);

Why would the compiler (in this case XE8) throw this error?

Note the workaround is simple:

var
  lText: string;
begin
  lText := Edit1.Text;
  Edit1.Text := lText.ToUpperInvariant;

My suspicion is that the Edit property is of type TCaption which is type string.

Could it be that simple?

To which David Heffernan responded:

Yup, the issue is TCaption has no helper. Pretty distressing.

Typed types are indeed different types. They have been there for a long time (to facilitate generating different type information so you can for instance hook up different property editors to TCaption (a typed string) or TColor (a typed integer).

It is explained at [WayBack] Declaring Types. but has existed since Delphi 1 or Delphi 2.

More on the implications is at [WayBack] pascal – Delphi Type equivalence and Type equality syntax – Stack Overflow.

–jeroen

Read the rest of this entry »

Posted in Conference Topics, Conferences, Delphi, Development, Event, Software Development | Leave a Comment »