Ja, nicht alle Zeichen sind überall (gut) sichtbar.
Bei ♬ ♮ ♫ ♯ ♮ sehe ich im XE den Letzten auch nur als Kästchen, weil es in der Schrift dieses Zeichen nicht gibt und keine Umleitung zu einer anderen Schrift für dieses Zeichen registriert wurde.
Und dazu kommt dann noch, dass bei der gleichbreiten rechteckigen kleinen Schrift im Editor vieles nicht erkennbar ist.
Aber grundsätzlich ging es ja nur darum "Noten" als Bezeichner zu verwenden, was prinzipiell geht.
Bezeichner unterliegen einer gewissen Syntax (vor dem
Unicode-Compiler war sie noch recht simpel, aber inzwischen ist wesentlich mehr erlaubt)
Als RegEx
^[A-Za-z_][A-Za-z_0-9]*$
für Delphi 7
und für ab D2009
^([[:alnum:]]|_)([[:alnum:]]|_)*$
.
Delphi-Quellcode:
Aus SysUtils des XE, aber groß wird sich daran nicht viel gändert haben.
function IsValidIdent(
const Ident:
string; AllowDots: Boolean): Boolean;
{$IFNDEF UNICODE}
const
Alpha = ['
A'..'
Z', '
a'..'
z', '
_'];
AlphaNumeric = Alpha + ['
0'..'
9'];
AlphaNumericDot = AlphaNumeric + ['
.'];
var
I: Integer;
begin
Result := False;
if (Length(Ident) = 0)
or not (Ident[1]
in Alpha)
then Exit;
if AllowDots
then
for I := 2
to Length(Ident)
do
begin
if not (Ident[I]
in AlphaNumericDot)
then Exit
end
else
for I := 2
to Length(Ident)
do if not (Ident[I]
in AlphaNumeric)
then Exit;
Result := True;
end;
{$ELSE UNICODE}
function Alpha(C: Char): Boolean;
inline;
begin
Result := TCharacter.IsLetter(C)
or (C = '
_');
end;
function AlphaNumeric(C: Char): Boolean;
inline;
begin
Result := TCharacter.IsLetterOrDigit(C)
or (C = '
_');
end;
function AlphaNumericDot(C: Char): Boolean;
inline;
begin
Result := TCharacter.IsLetterOrDigit(C)
or (C = '
_')
or (C = '
.');
end;
var
I: Integer;
begin
Result := False;
if (Length(Ident) = 0)
or not Alpha(Ident[1])
then
Exit;
if AllowDots
then
for I := 2
to Length(Ident)
do
begin
if not AlphaNumericDot(Ident[I])
then
Exit
end
else
for I := 2
to Length(Ident)
do
if not AlphaNumeric(Ident[I])
then
Exit;
Result := True;
end;
{$ENDIF UNICODE}