Jump to content
Willicious

Beginner to Delphi. Have no idea what I'm doing wrong here

Recommended Posts

There is no "unicode" set in Delphi. Using CharInSet will only work on Ansi. For example on my Windows this will not show true on my laptop:

 

procedure TForm1.FormCreate(Sender: TObject);
var
  a: char;
  s: string;
begin
  a:='њ';

  if CharInSet(a, ['њ', 'а', 'м']) then
    ShowMessage('true');
end;

Here is the reason:

 

[dcc32 Warning] Unit1.pas(32): W1061 Narrowing given WideChar constant (#$045A) to AnsiChar lost information

[dcc32 Warning] Unit1.pas(32): W1061 Narrowing given WideChar constant (#$0430) to AnsiChar lost information
[dcc32 Warning] Unit1.pas(32): W1061 Narrowing given WideChar constant (#$043C) to AnsiChar lost information

 

Share this post


Link to post
2 minutes ago, Fr0sT.Brutal said:

Btw, I wonder how do you check whether a char is a letter of a some language (f.ex. Norwegian, German)? They have not only latin chars but some additional which can't be declared with simple 'a'..'z'. You have to add them explicitly, like 'a'..'z', 'æ'?

That's easy for me. I use FireDAC with settings to string fields to widestring (unicode). When writing back the data firedac requires that windows is set for non unicode language to be the correct codepage (simply ignores client and db codepage). Thus I know for sure that if I convert a unicode string it will use the correct codepage.

 

This is going to work until the database is using code page. 

Share this post


Link to post
2 minutes ago, Fr0sT.Brutal said:

I wonder how do you check whether a char is a letter of a some language (f.ex. Norwegian, German)? They have not only latin chars but some additional which can't be declared with simple 'a'..'z'. You have to add them explicitly, like 'a'..'z', 'æ'?

Like the latter, yes.  Then there is the question of codepage.  What if we combine Unicode characters that are not available in the same codepage in the same set of ansi characters? I guess that will fail.

AnsiString has codepage declaration support - but AnsiChar does not.

Relevant read: Marco's Tech Paper https://www.embarcadero.com/images/dm/technical-papers/delphi-and-unicode-marco-cantu.pdf

 

10 minutes ago, Fr0sT.Brutal said:

They couldn't. Set is limited to 255 elements

True - but look at InOpArray.  Technically it would be possible to have a in operator that checks if a value exists in an array that would be syntactically identical to value in set.

Whether it would be efficient or not with even more compiler magic is questionable.

Share this post


Link to post
2 hours ago, Lajos Juhász said:

That's easy for me. I use FireDAC with settings to string fields to widestring (unicode). When writing back the data firedac requires that windows is set for non unicode language to be the correct codepage (simply ignores client and db codepage). Thus I know for sure that if I convert a unicode string it will use the correct codepage.

No, this was a non-DB-related question, just curiosity. While there is IsLetter function, it checks for all letters in Unicode table so I wondered which constructions are popular for the purpose.

2 hours ago, Lars Fosdal said:

What if we combine Unicode characters that are not available in the same codepage in the same set of ansi characters? I guess that will fail.

AnsiString has codepage declaration support - but AnsiChar does not.

Yes, that's possible. CharInSet won't check whether a char is ASCII or not and codepage-dependent cases are possible that won't produce neither compile-time messages nor run-time errors. Alas, I can't imagine how they could force the check. Runtime exception in such a basic function doesn't look good

True - but look at InOpArray.  Technically it would be possible to have a in operator that checks if a value exists in an array that would be syntactically identical to value in set.

Whether it would be efficient or not with even more compiler magic is questionable.

Sounds nice, create request to QC? 🙂

 

 

Edited by Fr0sT.Brutal

Share this post


Link to post
23 minutes ago, Fr0sT.Brutal said:

No, this was a non-DB-related question, just curiosity.

The FD reference was just to give context the reason why I have to lock all my users to a specific code page (also a nice example a problem when you're dealing with an ansi database using Delphi).

 

24 minutes ago, Fr0sT.Brutal said:

CharInSet won't check whether a char is ASCII or not and codepage-dependent cases are possible that won't produce neither compile-time messages nor run-time errors

it will:

 

[dcc32 Warning] Unit1.pas(32): W1061 Narrowing given WideChar constant (#$045A) to AnsiChar lost information

 

25 minutes ago, Fr0sT.Brutal said:

Runtime exception in such a basic function doesn't look good

There is no runtime problem. The compiler will try to convert unicode string to ansistring,  code points that cannot be represent in ansistring will be replaced with ? a well known behavior of windows.

Share this post


Link to post
3 hours ago, Lajos Juhász said:

it will:

Ah, you're right. Nice, the compiler is a bit more clever than I thought

Share this post


Link to post
4 hours ago, Fr0sT.Brutal said:
6 hours ago, Lars Fosdal said:

True - but look at InOpArray.  Technically it would be possible to have a in operator that checks if a value exists in an array that would be syntactically identical to value in set.

Whether it would be efficient or not with even more compiler magic is questionable.

Sounds nice, create request to QC? 🙂

I would, except compiler magic is not a popular subject these days.

Also, the corner cases for very short arrays would make it a lot of code for very little gain.

Share this post


Link to post
On 3/17/2023 at 5:12 PM, Willicious said:

Incidentally, if anyone knows of any good online tutors for Delphi/Embarcadero (i.e. live tutoring, NOT video tutorials), I'm interested!

please write to me directly if you are still interested

Share this post


Link to post

Hi

 

For moving a sprite in a game for desktop OS, don't forget to manage WASD (QWERTY keyboard), ZWQS (AZERTY keyboards) and arrow keys. More accessible for users : add an option window where they choose what keys they want to use (what I never does, but I must add it to all my games too).

 

You have some open sourced games in Delphi on GitHub at https://github.com/topics/delphi-game

You can also find some on GetIt if you look for "arcade" or "game".

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×