Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Inkompatible Typen AnsiChar und Char (https://www.delphipraxis.net/150506-inkompatible-typen-ansichar-und-char.html)

Angel4585 19. Apr 2010 10:16


Inkompatible Typen AnsiChar und Char
 
Hallo,

ich bekomme in folgendem Codeausschnitt an der markierten Stelle die Compilermeldung "Inkompatible Typen AnsiChar und Char"

Delphi-Quellcode:
 
procedure GetNextNummer(var sNummer: AnsiString);
var xLetter: Byte;
  i: Integer;
  s: AnsiString;
begin
i:=Length(sNummer);
while i>0 do
  begin
  xLetter:=Ord(sNummer[i]);
  case xLetter of
    57:
      begin
      sNummer[i]:=Chr(65); //Keine Meldung
      break;
      end;
    90:sNummer[i]:=Chr(48); //Keine Meldung
    else
      begin
      sNummer[i]:=Chr(xLetter); // Hier kommt die Meldung
      break;
      end;
    end;// case
  dec(i);
  end;// for
s:='';
i:=0;
while i<Length(sNummer)do
  begin
  insert('0',s,1);
  inc(i);
  end;
end;
sNummer[i] sollte doch en AnsiChar verlangen und Chr() liefert auch AnsiChar.
xLetter ist vom Typ Byte, sollte also auch locker passen.
Wenn ich anstatt xLetter zB 230 nehm funktionierts muss also was mit xLetter zu tun haben.
Aber wo genau ist das Problem? Ich seh es nicht :(

:angel:

himitsu 19. Apr 2010 10:32

Re: Inkompatible Typen AnsiChar und Char
 
Verwende statt dem Chr direkt AnsiChar

Chr ist bei dir ja WideChar und da kann es mit dem Byte=AnsiChar-Größe probleme geben.
Die Nummern haben ja keine Größenangabe (Byte), weswegen es dort wohl funktioniert.

PS: GetNextNummer? Denglich ist immer schön. :stupid:

Delphi-Quellcode:
GetNextNumber(var sNumber: AnsiString);
// oder
GibNächsteNummer(var sNummer: AnsiString);
// oder besser noch
MakeNextNumber(var sNumber: AnsiString);
CreateNextNumber(var sNumber: AnsiString);
(Ja, mit Ä funktioniert es in aktuelleren Delphi-Versionen :mrgreen: )

Aber warum überhaupt erst hin-und-herkonvertieren?
Delphi-Quellcode:
procedure GetNextNumber(var sNumber: AnsiString);
var xLetter: AnsiChar;
  i: Integer;
  s: AnsiString;
begin
i:=Length(sNumber);
while i>0 do
  begin
  xLetter:=sNumber[i];
  case xLetter of
    #57:
      begin
      sNumber[i]:=#65;
      break;
      end;
    #90:
      sNumber[i]:=#48;
    else
      begin
      sNumber[i]:=xLetter;
      break;
      end;
    end;// case
  dec(i);
  end;// for
s:='';
i:=0;
while i<Length(sNummer)do
  begin
  insert('0',s,1);
  inc(i);
  end;
end;
ich vermute mal bei dir fehlt auch noch ein +1 :wink:
Delphi-Quellcode:
procedure GetNextNumber(var sNumber: AnsiString);
var i: Integer;
  s: AnsiString;
begin
i:=Length(sNumber);
while i>0 do
  begin
  case sNumber[i] of
    '9':
      begin
      sNumber[i]:='A';
      break;
      end;
    'Z':
      sNumber[i]:='0';
    else
      begin
      sNumber[i]:=AnsiChar(Ord(sNumber[i]) + 1);
      break;
      end;
    end;// case
  dec(i);
  end;// for
s:='';
i:=0;
while i<Length(sNumber) do
  begin
  insert('0',s,1);
  inc(i);
  end;
end;
PS: Passiert auch noch irgendwas mit dem "s"?

Angel4585 20. Apr 2010 08:34

Re: Inkompatible Typen AnsiChar und Char
 
Danke himi :) AnsiChar funktioniert perfekt :D

Eine Änderung bei "s" ist bisher nicht vorgesehen, auch wenn es teilweise tatsächlich für 5 gehalten wird.
Ich habs dem Chef gesagt, aber wenn er sagt nö heisst das nunmal, dass ichs nicht mache.
Und du hattest recht, da fehlte tatsächlich ein +1 :shock:

Ich steh auf Denglisch, das bleibt so :P

himitsu 20. Apr 2010 09:41

Re: Inkompatible Typen AnsiChar und Char
 
Zitat:

Zitat von Angel4585
Eine Änderung bei "s" ist bisher nicht vorgesehen,

Der Witz dabei ist, daß "s" nicht verwendet wird und somit die letzen Zeilen "sinnlos" ist. :zwinker:

Heißt, daß diese Funktion genau das selbe Ergebnis liefert. :angel:
Delphi-Quellcode:
procedure GetNextNummer(var sNummer: AnsiString);
var i: Integer;
begin
i:=Length(sNummer);
while i>0 do
  begin
  case sNummer[i] of
    'Z':
      sNummer[i]:='0';
    '9':
      begin
      sNummer[i]:='A';
      break;
      end;
    else
      begin
      sNummer[i]:=AnsiChar(Ord(sNumber[i]) + 1);
      break;
      end;
    end;// case
  dec(i);
  end;// for
end;

Angel4585 20. Apr 2010 09:59

Re: Inkompatible Typen AnsiChar und Char
 
achso du meinst die Variable s.. hmm.. jetz wo du es sagst versteh ich diese Zeilen auch nicht, die füllen s ja nur mit nullen.. naja aber ich habs nich gemacht, das ist von meinem Vorgänger :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz