Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Umlaute in Windows (https://www.delphipraxis.net/965-umlaute-windows.html)

Christian Seehase 2. Okt 2002 18:56

Moin Hansa,

eine Konvertierungsroutine hab' ich Dir ja jetzt komplett geliefert ;-)
(letztes Posting)
Du brauchst jetzt nur noch ein Formular, einen OpenDialog und einen Button.

Das AnsiUpperCase einen Bug hat ist mir allerdings neu, und mangels intensiver Nutzung, auch noch nicht aufgefallen.

Da AnsiUpperCase auf der API CharUpperBuff (User32.dll) basiert, könnte man aus auch noch einmal mit der API CharUpper versuchen. Natürlich steht zu befürchten, dass die auch fehlerhaft arbeitet.

Hansa 2. Okt 2002 19:29

Hi Chris,

tja, weiß auch nicht so recht. Manchmal sind Fehler da, obwohl angeblich keiner sie sieht oder es nicht zugibt. Bis ich bei Borland anrief habe ich lange in meinem Programm gesucht. Wäre heute noch dran. :D

Da ich ein Freund möglichst einfacher Dinge bin, ich meine jetzt beim Programmieren :oops:, habe ich erst mal die Spur von Daniel bis zum Ende verfolgt. Dein Spezialgebiet und auch das von Luckie ist mir ein Greuel. :mrgreen:

Vorweg : das klappt so schon einwandfrei. Aber auch in Daniels Code sind zwei kleine Fehler. :P Die erkläre ich zum Schluß, weil sie vor allem Anfänger womöglich tagelang aufhalten. Muß ja nicht sein.

Hier nochmal der (modifizierte) Code :
Code:
function AnsiToIBMAscii(s: string): string;
var
  i: integer;
  Result : string;
begin
  Result := '';
  for i := 1 to Length(s) do
  begin
    case s[ii] of
      #196: Result := Result + #142; (* Ä *)
      #214: Result := Result + #153; (* Ö *)
      #220: Result := Result + #154; (* Ü *)
      #228: Result := Result + #132; (* ä *)
      #246: Result := Result + #148; (* ö *)
      #252: Result := Result + #129; (* ü *)
      #223: Result := Result + #225; (* ß *)
    else
      Result := Result + s[i];
    end;
  end;
  AnsiToIBMAscii := Result;
end;

function IBMAsciiToAnsi(s: string): string;
var
  i: integer;
  Result : string;
begin
  Result := '';
  for i := 1 to Length(s) do
  begin
    case s[ii] of
      #142: Result := Result + #196; (* Ä *)
      #153: Result := Result + #214; (* Ö *)
      #154: Result := Result + #220; (* Ü *)
      #132: Result := Result + #228; (* ä *)
      #148: Result := Result + #246; (* ö *)
      #129: Result := Result + #252; (* ü *)
      #225: Result := Result + #223; (* ß *)
    else
      Result := Result + s[i];
    end;
  end;
  IBMAsciiToAnsi := Result;
end;
Der erste Fehler ist mit bloßem Auge zu erkennen : Die Variable Result war in dem alten Code nicht innerhalb der Funktion deklariert. Wer die beiden Fu. also benutzt kriegt hoffentlich einen Compiler-Fehler. Nicht schlimm, aber wenn dieser Fehler NICHT kommt, dann ist die Var. globaler deklariert und da ihr ein Wert INNERHALB der Funktion zugewiesen wird, wird dieser somit "verbogen". Da ist Gefahr im Verzug.

Der zweite Fehler liegt in der FOR-Schleife. Die soll vom ERSTEN bis zum letzten Buchstaben des strings laufen. In der Ursprungsfassung fing sie aber bei 0 schon an. Dadurch wurde in meiner DB bei jedem string-Feld ein komisches 1. Zeichen eingefügt, das auch noch gleich war und das letzte wurde abgeschnitten (Platz für 30 Zeichen nicht 31 !). Das war das Längenbyte in s [0]. Das braucht man aber nicht mitzuschleppen, Da Result := '' am Anfang steht. Direkt darauf zugreifen sollte man sowieso nicht.

Gruß
Hansa

Daniel 2. Okt 2002 19:42

Hallo Hansa,

Deine Bemerkung zur Variablen "Result" stimmt nicht ganz. Diese wird bei Funktionen von ObjectPascal implizit deklariert und wird als Rückgabewert einer Funktion genutzt:

Zitat:

Zitat von Die Delphi-Hilfe
In addition, the function name itself acts as a special variable that holds the function’s return value, as does the predefined variable Result.
...
You can assign a value to Result or to the function name repeatedly within a statement block, as long as you assign only values that match the declared return type. When execution of the function terminates, whatever value was last assigned to Result or to the function name becomes the function’s return value.


Hansa 2. Okt 2002 20:06

Hi,

hast ja Recht. :D Aber nur theoretisch. :mrgreen: Durch sowas wird man schnell aufs Glatteis geführt und dann Gute Nacht! Ich jedenfalls versuche tunlichst solchen Sachen aus dem Wege zu gehen. Und dann noch so ein Allerweltswort!! Siehste, jetzt hab ich selber nicht daran gedacht.

Gruß
Hansa

Christian Seehase 2. Okt 2002 23:01

Moin Hansa,

also Deiner letzen Ausführung vermag ich irgendwie nicht so recht zu folgen. Könntest Du das bitte mal näher erklären?

Hansa 2. Okt 2002 23:10

Hi,

das mit dem Result, ich meinte, dann kann man ja gleich BEGIN oder END als Resultat zurückliefern. :bounce2: War das gemeint ? :shock:

Gruß
Hansa

Christian Seehase 3. Okt 2002 00:48

Moin Hansa,

alles in allem hab' ich nicht verstanden, was Du bei Result für Probleme siehst.
Wie Daniel schon sagte ist diese Variable ja bei Funktionen automatisch vorhanden, und kann innerhalb der Funktion beliebig genutzt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:06 Uhr.
Seite 2 von 2     12   

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