result := c in [....]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
OSchr
Beiträge: 17
Registriert: Di 6. Okt 2015, 17:58

result := c in [....]

Beitrag von OSchr »

Hallo,
in einem Delphi Beispiel funktioniert :

Code: Alles auswählen

function isUpper(c: char): Boolean;
begin
  result := c in ['A'..'Z','Ä','Ö','Ü'];
end;   
In Lazarus bekomme ich die Fehlermeldung:
Ordinal expression expected

Und bezieht sich anscheinend auf das Komma zwischen 'Z','Ä' ????

Ich habe aber leider nirgendwo eine Hilfe dazu gefunden.
Freue mich auf tipps
Zuletzt geändert von Lori am Fr 11. Dez 2015, 17:43, insgesamt 1-mal geändert.
Grund: Highlighter

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: result := c in [....]

Beitrag von Socke »

Ist der Delph-Quelltext in UTF-8 oder in einer Single-Byte-Code-Page gespeichert? Welche FPC-Version nutzt du?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

OSchr
Beiträge: 17
Registriert: Di 6. Okt 2015, 17:58

Re: result := c in [....]

Beitrag von OSchr »

FPC 2.6.4
Wo sieht man die Zeichensatz Einstellung?

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: result := c in [....]

Beitrag von wp_xyz »

Verwende die Suchfunktion des Forums und suche nach "Umlaute", zu diesem Thema gibt es immer wieder dieselben Fragen.

OSchr
Beiträge: 17
Registriert: Di 6. Okt 2015, 17:58

Re: result := c in [....]

Beitrag von OSchr »

Ich habe den code im Editor direkt eingegeben.
Und finde die Einstellung für den Zeichencode im Editor nicht (ähnliches Problem gibt es ja auch bei Notepad...)

Dir wp_xyz vielen Dank für die NICHT HILFREICHE ANTWORT :-(

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: result := c in [....]

Beitrag von wp_xyz »

OSchr hat geschrieben:Ich habe den code im Editor direkt eingegeben.
Dir wp_xyz vielen Dank für die NICHT HILFREICHE ANTWORT :-(
Irgendwann wird man müde, immer wieder dasselbe zu wiederholen, Deine Frage wegen des "in" gab es vor 1-2 Wochen. WAS IST SO SCHWER DARAN, DIE SUCHE ZU BEMÜHEN?

BeniBela
Beiträge: 320
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: result := c in [....]

Beitrag von BeniBela »

Suche nach "in":


Die folgenden Wörter deiner Suchanfrage wurden ignoriert, da sie zu häufig vorkommen: in.
Du musst mindestens ein Wort angeben, nach dem gesucht werden soll. Jedes Wort muss aus mindestens 3 Buchstaben bestehen und darf ohne Platzhalter nicht mehr als 25 Buchstaben haben.

Mathias
Beiträge: 6919
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: result := c in [....]

Beitrag von Mathias »

Ich habe aber leider nirgendwo eine Hilfe dazu gefunden.
Freue mich auf tipps
So sollte es gehen:

Code: Alles auswählen

function isUpper(c: TUTF8Char): boolean;
begin
  Result := (c[1] in ['A'..'Z']) or (c = 'Ä') or (c = 'Ö') or (c = 'Ü');
end; 
Die Zeiten waren so schön, als es nur 256 Zeichen gab. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: result := c in [....]

Beitrag von theo »

Hier gab es neulich was ähnliches
http://www.lazarusforum.de/viewtopic.php?f=10&t=9222

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: result := c in [....]

Beitrag von Michl »

Mathias hat geschrieben:Die Zeiten waren so schön, als es nur 256 Zeichen gab. :wink:
Um mal etwas Verwirrung in das Thema zu bringen, mit FPC 3 geht das unter Windows auch wieder:

Code: Alles auswählen

program project1;
 
function isUpper(c: char): Boolean;
begin
  Result := c in ['A'..'Z','Ä','Ö','Ü'];
end;
 
var
  s: String;
  i: Integer;
 
begin
  s := 'HaA1L_LÖ-CHEN.';
  for i := Length(s) downto 1 do
    if not isUpper(s[i]) then Delete(s, i, 1);
  WriteLn(s);
  ReadLn;
end.   
Allerdings müsste entsprechend Sockes Hinweis die Zeichenkodierung für den Quelltext entsprechend (z.B. CP1252) gewählt werden.

Das gibt bei mir in der Konsole wunderschön das Wort "HALLÖCHEN" aus. Ob man das zwingend braucht steht auf einem anderen Blatt.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

OSchr
Beiträge: 17
Registriert: Di 6. Okt 2015, 17:58

Re: result := c in [....]

Beitrag von OSchr »

Sorry, aber mein Lazarus kennt den Typ TUTF8Char nicht...
Und was auch noch offen ist: wie stellt man den Zeichensatz für den Editor ein? (Ich habe mich bemüht es zu finden)

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: result := c in [....]

Beitrag von Michl »

OSchr hat geschrieben:Sorry, aber mein Lazarus kennt den Typ TUTF8Char nicht...
Zu finden in der Unit LCLType. Also mit

Code: Alles auswählen

uses ..., LCLType; 
sollte es funktionieren.
OSchr hat geschrieben:Und was auch noch offen ist: wie stellt man den Zeichensatz für den Editor ein? (Ich habe mich bemüht es zu finden)
Einstellbar im Quelltexteditor -> Rechtsklick (PopUp öffnet sich) -> Dateieinstellungen -> Zeichenkodierung -> die gewünschte Kodierung wählen.

Achtung, mit Änderung der Zeichenkodierung werden auch alle Stringkonstanten in dieser Kodierung gespeichert. Normalerweise verwendet Lazarus UTF8 als Standard. Mit der Umstellung der Kodierung des Quelltextes auf z.B. CP1252 werden alle Zeichen auf die entsprechende Kodierung umgestellt. Ein "ä" ist dann nicht mehr als $C3 $A4 sondern als $E4 (nur noch 1 Byte gross) gespeichert (http://www.utf8-zeichentabelle.de/). Auch wenn die FPC-String-Magic in FPC 3 den größten Teil der internen Stringkonvertierungen übernimmt, muss man wissen welche Besonderheiten so ein Vorgehen mit sich bringt.

Z.B. funktioniert das oben gepostete Beispiel unter der Verwendung der LCL nur, wenn man dem Compiler die anzuwendene Codepage explizit mitteilt:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
{$CODEPAGE CP1252}  // <- dem Compiler sagen, in welcher Kodierung die Stringkonstanten vorliegen
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, 
  Dialogs, StdCtrls, LazUTF8;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
function isUpper(c: char): Boolean;
begin
  Result := c in ['A'..'Z','Ä','Ö','Ü'];
end;
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
var
  s: String;
  i: Integer;
begin
  s := 'HaA1L_LÖ-CHEN.';
  for i := Length(s) downto 1 do
    if not isUpper(s[i]) then Delete(s, i, 1);
//  SetCodePage(RawByteString(s), 1252, False);  // <- man könnte notfalls per Hand die Kodierung eines Strings setzen
  Memo1.Lines.Add(s);
end;
 
end.   

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

OSchr
Beiträge: 17
Registriert: Di 6. Okt 2015, 17:58

Re: result := c in [....]

Beitrag von OSchr »

DANKE vielmals für die tolle Ausführung! so klappt es und ich habe es gefunden und verstanden!!!

Mathias
Beiträge: 6919
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: result := c in [....]

Beitrag von Mathias »

Z.B. funktioniert das oben gepostete Beispiel unter der Verwendung der LCL nur, wenn man dem Compiler die anzuwendene Codepage explizit mitteilt:
Dies funktioniert nicht nur mit Windows, es geht auch unter Linux, habe es gerade getestet.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten