AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Wie konstanter String auf unicode casten?

Ein Thema von r29d43 · begonnen am 15. Mär 2020 · letzter Beitrag vom 16. Mär 2020
Antwort Antwort
r29d43

Registriert seit: 18. Jan 2007
287 Beiträge
 
Delphi 10.4 Sydney
 
#1

Wie konstanter String auf unicode casten?

  Alt 15. Mär 2020, 14:07
Delphi-Version: 5
Hallo, nach etlichen Jahren TurboDelphi habe ich mir jüngst mal ein neues Delphi10.3 zugelegt
...und muss mich jetzt beim Übertragen älterer Progs natürlich auch mit diesem Unicode-Stuff herumschlagen, der inzwischen wohl eine ziemlich sperrige aufgeblähte Sache geworden zu sein scheint.

Wie auch immer. Wenn ich mir früher String-Ergebnisse von Api-Funktionen ausgeben ließ, habe ich dafür oft shortStrings[255] benutzt. Das geht jetzt natürlich auch noch, nur dass das Format des dort abgelegten Strings jetzt unicode ist und man das nicht mehr so ohne weiteres mittels der Pos-Funktion und einer gegebenen SubString-Konstanten weiterverarbeiten kann. Beispiel:

Delphi-Quellcode:
var aWinText : String[255];
    Info1 : string;

begin
  GetWindowText(WindowAbcHandle, @aWinText[1],255);
  Info1 := copy(aWinText,1,Pos('unwichtig',aWinText)-1);
  ...
klappt jetzt nicht mehr, weil die Stringkonstante 'unwichtig' nicht im gleichen Format zu aWinText vorliegt. Während z.B. die Funktion compareStr diesen Formatunterschied noch automatisch regelt, scheint das die Pos-Funktion aber leider nicht zu tun. Frage also: Gibt es event. irgendein elegantes Typcasting (oder eine String-Funktion deren Result vom Typ unicode ist) mittels dem ich so eine Stringkonstante (wie 'unwichtig') einfach mal schnell das richtige unicode-Format verpassen/überstülpen kann ...und schon funktionierte auch die Pos-Funktion wieder. Also sowas wie

  Info1 := copy(aWinText,1,Pos(unicode('unwichtig'),aWinText)-1);


Eine andere Möglichkeit wäre event. auch anstelle von shortString[255] ein „array[1..1024] of Char“ als Zielablage der Api-Funktion zu nehmen. Da kommt dann das Ergebnis in quasi einfachen Chars an. Nötig danach allerdings: Eine einfache Möglichkeit per event. PChar o.ä. diese einfache Zeichenfolge dann wieder in den unicodeString „aWinText“ reinzubekommen ..um dann gemäß des bisherigen Codes ganz normal damit weiterarbeiten zu können. Warum klappt das nicht (weil per direkter Zuweisung ala aWinText:='abc' klappt das ja auch!)? Gibt es da event. eine einfache Methode für, die mir bisher nur noch nicht eingefallen ist.


Thx im Voraus
...

Geändert von r29d43 (15. Mär 2020 um 14:13 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.173 Beiträge
 
#2

AW: Wie konstanter String auf unicode casten?

  Alt 15. Mär 2020, 14:24
Du bist schon so weit, dass du jetzt alles auf Unicode umstellst. Das ist gut.

Aber
Zitat:
Gibt es event. irgendein elegantes Typcasting
Lass das sein. Stell alles korrekt um und versuch nicht mit irgendwelchen dirty-hack-typecastings alles so hinzubiegen, dass es irgendwie funktioniert.

Zitat:
Eine andere Möglichkeit wäre event. auch anstelle von shortString[255] ein „array[1..1024] of Char“ als Zielablage der Api-Funktion zu nehmen.
Wie wärs mit string ?

Du bist viel zu ressourcen-orientiert meiner Meinung nach.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Wie konstanter String auf unicode casten?

  Alt 15. Mär 2020, 15:09
Aus dem Hut:
Delphi-Quellcode:
const
  MYMAXLEN = 255;
var
  aWinText : String;
  Info1 : string;

begin
  SetLength(aWinText, MYMAXLEN);
  GetWindowText(WindowAbcHandle, PChar(aWinText), MYMAXLEN);
  Info1 := copy(aWinText,1,Pos('unwichtig',aWinText)-1);
  ...
Solange man nicht explizit Ansi und Unicode mischt, sind die meisten Win32-API-Aufrufe eigentlich kompatibel.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wie konstanter String auf unicode casten?

  Alt 15. Mär 2020, 15:18
...und muss mich jetzt beim Übertragen älterer Progs natürlich auch mit diesem Unicode-Stuff herumschlagen, der inzwischen wohl eine ziemlich sperrige aufgeblähte Sache geworden zu sein scheint.
Das kann man so bestimmt nicht sagen. Die Unicode-Umstellung ist für die meisten Anwender eine simple Open-Compile-Save Erfahrung gewesen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
287 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Wie konstanter String auf unicode casten?

  Alt 15. Mär 2020, 16:14
Besten Dank allen, "string" mit SetLength davor und dann auf PChar typcasten war die Lösung.
  Mit Zitat antworten Zitat
Redeemer
Online

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.010 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Wie konstanter String auf unicode casten?

  Alt 15. Mär 2020, 17:19
Wird bei string[n], AnsiString[n] und ShortString[n] eigentlich die Längenangabe beachtet oder sind das alles Aliase für den ganz normalen ShortString?
Es ist schon lustig, dass ab Delphi 2009 string[n] Ansi ist und string Unicode.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#7

AW: Wie konstanter String auf unicode casten?

  Alt 15. Mär 2020, 17:49
Wird bei string[n], AnsiString[n] und ShortString[n] eigentlich die Längenangabe beachtet oder sind das alles Aliase für den ganz normalen ShortString?
Es wird ein entsprechend großer Speicher reserviert. Das entspricht in etwa einem array[0..n] of AnsiChar, wobei im 0-Element die Länge hinterlegt ist. Deswegen auch die Beschränkung auf maximal 255 Zeichen.

Es ist schon lustig, dass ab Delphi 2009 string[n] Ansi ist und string Unicode.
string[n] ist ja eigentlich auch schon seit Einführung der Huge-Strings (sie auch {$H+}) deprecated.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
628 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Wie konstanter String auf unicode casten?

  Alt 16. Mär 2020, 13:31
Besten Dank allen, "string" mit SetLength davor und dann auf PChar typcasten war die Lösung.
Wenn es dir noch nicht bekannt ist, schau dir doch bitte mal diese Seite an: https://www.embarcadero.com/de/rad-i...upgrade-center

Da gibtes diverse Whitepapers zum Thema Unicode, die du dir unbedingt mal reinziehen solltest. Die Umstellung ist mit dem nötigen KnowHow dann um ein vielfaches einfacher.

Geändert von Rolf Frei (16. Mär 2020 um 15:56 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz