[erledigt] case (Syntax-Flausen in meinem Kopf)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
charlytango
Beiträge: 845
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

[erledigt] case (Syntax-Flausen in meinem Kopf)

Beitrag von charlytango »

Hi,

ich bin im Code der ZEOS-Komponenten (ZSqlTestCase.pas line 68) auf eine Schreibweise für Konstanten gestoßen die mir neu war

Code: Alles auswählen

const
  { protocol lists }
  pl_mysql_client_server = 'mysql,mysql-4.1,mysql-5,MariaDB-5';
  pl_mysql_embedded = 'mysqld-4.1,mysqld-5';
  pl_all_mysql = pl_mysql_client_server + ','+ pl_mysql_embedded;

Aus irgend einem Grund dachte ich dann, dass das doch eine elegante Art wäre diese Konstanten in einem Case zu verwenden, aber scheinbar klappt das nicht.
Nun suche ich nach der Bestätigung ob es wirklich nicht klappt oder ich nur irgend etwas falsch mache.

Es geht letztlich darum in Abhängigkeit unterschiedlicher SQL-Dialekte und Versionen SQL-Statements zu bauen die selbst schon recht komplex sein können. Da sind dann lange IF Ketten unübersichtlich.
Andere elegante Lösungen sind auch willkommen ;-)

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  s:string;
const
  { protocol lists }
  pl_mysql_client_server = 'mysql,mysql-4.1,mysql-5,MariaDB-5';
  pl_mysql_embedded = 'mysqld-4.1,mysqld-5';
  pl_all_mysql = pl_mysql_client_server + ','+ pl_mysql_embedded;
begin

  s:='mysql-5';

  case s of
    pl_mysql_client_server: showmessage('client_server');
    pl_mysql_embedded: showmessage('embedded');
  else
    showmessage('found nothing');
  end;

end;
Zuletzt geändert von charlytango am So 24. Sep 2023, 14:41, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: case (Syntax-Flausen in meinem Kopf)

Beitrag von af0815 »

Ein Case wird dir den kommaseparierten String nicht zerlegen. In den Konstanten ist das ein einfacher String. Case vergleicht dir ja nur den ganzen String und nur wenn der gleich ist mit einem Case Teil wird der angesprungen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: case (Syntax-Flausen in meinem Kopf)

Beitrag von theo »

charlytango hat geschrieben:
So 24. Sep 2023, 10:43
Andere elegante Lösungen sind auch willkommen ;-)
Es gibt sicher viele Möglichkeiten. Recht einfach ist z.B.

Code: Alles auswählen

  s := 'mysql-5';

  if pl_mysql_client_server.Contains(s) then ShowMessage('client_server') else
    if pl_mysql_embedded.Contains(s) then ShowMessage('embedded') else
      ShowMessage('found nothing');      

charlytango
Beiträge: 845
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: case (Syntax-Flausen in meinem Kopf)

Beitrag von charlytango »

Aus der Traum ;-)

Antworten