eine blöde Frage

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: eine blöde Frage

Beitrag von theo »

Ich weiss nicht ganz, was der Sinn der Sache ist, aber man kann ja auch die Zahlen vergleichen (für dem BMP):

Code: Alles auswählen

  var UTF8Key: TUTF8Char;
    WC:Word;
begin
  UTF8Key := 'Ӝ';
//  UTF8Key := 'a';
  WC:=Word(UTF8Decode(UTF8Key)[1]);
  case WC of 32..255:
    ShowMessage('Gotcha!');
  else
    ShowMessage('Nope...');
  end; 
Ohne Gewähr.

Sieben
Beiträge: 292
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: eine blöde Frage

Beitrag von Sieben »

Eigentlich gar kein 'Sinn der Sache' - ich habe nur gerade Code in einer alten Komponente von KeyPress nach UTF8KeyPress umgezogen und mich gewundert, was alles durch diesen alten Filter geht...

Sieben
Beiträge: 292
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: eine blöde Frage

Beitrag von Sieben »

Leicht veränderter Testaufbau:

Code: Alles auswählen

procedure TfrmMain.Button1Click(Sender: TObject);
var Str: string;
begin
  Str := 'abc';
  case Str of 'a'..'c':
    ShowMessage('Gotcha!');
  else
    ShowMessage('Nope...');
  end;
end; 
Ergibt Gotcha, aber ebenso 'abd' - 'dbc' dann hingegen Nope.

Schreibe ich dagegen

Code: Alles auswählen

  case Str of 'a':
also ohne Range, lautet die Antwort erwartungsgemäß Nope.

Code: Alles auswählen

  Str := 'linux';
  case Str of 'lin'..'lix':
    ShowMessage('Gotcha!');
  else
    ShowMessage('Nope...');
  end; 
wiederum ergibt Gotcha, erst 'lizux' dann Nope. Vielleicht liegt's an gestern abend, aber das scheint mir irgendwie kontraintuitiv...

Sieben
Beiträge: 292
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: eine blöde Frage

Beitrag von Sieben »

paweld hat geschrieben: So 6. Okt 2024, 13:36 However, ranges are allowed, and are the equivalent of an

Code: Alles auswählen

if (value>=beginrange) and (value<=endrange) then  
  begin  
  end; 
In Ihrem Fall sieht es also so aus:

Code: Alles auswählen

var
  UTF8Key: TUTF8Char;
begin
  UTF8Key := 'Ӝ';   //#211#156
  case UTF8Key of #32..#255: // if (UTF8Key >= #32) and (UTF8Key <= #255) then
    ShowMessage('Gotcha!');
  else
    ShowMessage('Nope...');
  end;
end;  
Und im letzten Falle also:

Code: Alles auswählen

  if (Str >= 'lin') and (Str <= 'lix') then
Ich schiebe es dann mal definitiv auf gestern abend - Danke!

paweld
Beiträge: 93
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: eine blöde Frage

Beitrag von paweld »

@Sieben
Beispiel

Code: Alles auswählen

Str := 'linux';
  case Str of 'lin'..'lix':
    ShowMessage('Gotcha!');
  else
    ShowMessage('Nope...');
  end; 
lassen sich wie folgt aufschlüsseln:

Code: Alles auswählen

string              >  linux: #108 #105 #110 #117 #120
Beginn des Bereichs >  lin:   #108 #105 #110
Ende des Bereichs   >  lix:   #108 #105 #120
aber „lizux“ erfüllt die Bedingung nicht mehr, weil das dritte Byte außerhalb des Bereichs liegt.

Code: Alles auswählen

string              >  lizux: #108 #105 #122 #117 #120
Grüße / Pozdrawiam
paweld

Sieben
Beiträge: 292
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: eine blöde Frage

Beitrag von Sieben »

Nochmals vielen Dank, der 'fog of brain' hat sich etwas gelichtet mittlerweile. :oops:

Warf
Beiträge: 2146
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: eine blöde Frage

Beitrag von Warf »

Wenn man mit UTF-8 Charts arbeitet ist das einfachste die Charaktere in 32 bit codepoints zu übersetzen und dann einfach als Integers Handhaben. Das macht's viel einfacher.

Antworten