AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TEdit-Komponente mit AnsiString

Ein Thema von colcok · begonnen am 11. Okt 2021 · letzter Beitrag vom 11. Okt 2021
Antwort Antwort
colcok

Registriert seit: 15. Mär 2021
11 Beiträge
 
#1

TEdit-Komponente mit AnsiString

  Alt 11. Okt 2021, 07:11
Ich habe mich gefragt, ob es relativ schnell zu bewerkstelligen sein müsste, die TEdit-Komponente, welche UnicodeString-Textelemente verwendet,
auf AnsiString umzubauen.
Würde man eine neue Komponente anlegen, die auf TEdit basiert, wie könnte man die Properties, etc. auf AnsiString ändern?
Ich kann den Aufwand nicht wirklich abschätzen, und wäre dankbar, wenn jemand eine Idee hätte.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TEdit-Komponente mit AnsiString

  Alt 11. Okt 2021, 08:13
Wieso soll man das wollen?
Kannst du erklären wieso du AnsiString benötigst?

Ich vermute ein überschreiben von DoChange oder Keypress-Methoden, um alle neuen Zeichen auf "IsAnsChar" sollte helfen.
Die Basis-TEdit-Komponente wirst du nicht ändern können. Dazu ist UnicodeString schon zu tief in der VCL eingebaut.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
colcok

Registriert seit: 15. Mär 2021
11 Beiträge
 
#3

AW: TEdit-Komponente mit AnsiString

  Alt 11. Okt 2021, 08:34
Vielen Dank für deine Antwort.
Die TEdit-Komponente bietet die Möglichkeit, durch Änderung des Charsets
automatisch den angezeigten Text in den entsprechenden Zeichensatz umzuwandeln.
Das funktioniert allerdings mit Unicode nicht mehr, ich hätte erwartet, dass
die Abwärtskompatibilät gegeben ist.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TEdit-Komponente mit AnsiString

  Alt 11. Okt 2021, 08:45
Vielen Dank für deine Antwort.
Die TEdit-Komponente bietet die Möglichkeit, durch Änderung des Charsets
automatisch den angezeigten Text in den entsprechenden Zeichensatz umzuwandeln.
Das funktioniert allerdings mit Unicode nicht mehr, ich hätte erwartet, dass
die Abwärtskompatibilät gegeben ist.
Dieses Property war m.W. eher ein Mapping auf das Alte Charset/Codepage-Verhalten der Nicht-Unicde-API von Windows (Kann mich aber täuschen).
Da dieses Property immer noch vorhanden ist, wird dem geschuldet sein, das sonst viele dfm-Dateien beim Laden krachen würden.
Da das Nutzen seit D2009 doch sehr gering ist, wird keiner bei Emba auf irgendwelche Alte/Ansi-Kompatiblität mehr geachtet haben.

Also selber Entwickeln als auf seit über 20 Jahren nur noch wegen "damits nicht kracht"-Properties verlassen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
colcok

Registriert seit: 15. Mär 2021
11 Beiträge
 
#5

AW: TEdit-Komponente mit AnsiString

  Alt 11. Okt 2021, 09:07
Verstehe, vielen Dank für die Informationen, dann werde ich mein Glück mit einer
geänderten TEdit-Komponente versuchen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: TEdit-Komponente mit AnsiString

  Alt 11. Okt 2021, 12:41
CreateWindowA('EDIT', ....)
und schon hat man ein "TEdit" als ANSI auf der Form.

Aber dennoch, warum unbedingt umständlich die Komponente als ANSI?

Im OnChange kann man die Eingabe unmittelbar prüfen, um dem Nutzer zu sagen "nee, so nicht"
und beim Auslesen lösst sich das Unicode problemlos in ANSI umwandeln.
Beim Umwandeln dann ungültige Zeichen als '?' oder man wirft eine Fehlermeldung
und fertig.

Stichworte: WinAPI, NonVCL

Delphi-Quellcode:
var
  H: HWND;
  S: AnsiString;
begin
  H := CreateWindowA('EDIT', 'Text 123', 0, 100, 50, 121, 21, Self.Handle, 0, HInstance, 0);

  SetLength(S, GetWindowTextLengthA(H));
  GetWindowTextA(H, PAnsiChar(S), Length(S) + 1);
  ShowMessage(S);
$2B or not $2B

Geändert von himitsu (11. Okt 2021 um 12:54 Uhr)
  Mit Zitat antworten Zitat
colcok

Registriert seit: 15. Mär 2021
11 Beiträge
 
#7

AW: TEdit-Komponente mit AnsiString

  Alt 11. Okt 2021, 14:08
Danke für die WINAPI-Variante, gefällt mir auch.
Ja, im Prinzip lässt es sich leider nicht vermeiden, eigene Umwandlungen einzubauen,
mich hatte eben nur interessiert, warum die Komponente die Funktionalität nicht mehr
liefert (Abwärtskompatibilität), das wurde jedoch bereits geklärt.
Weiterhin hatte mich interessiert, wie viel Aufwand es wäre, eine eigene Komponente
zu implementieren, und wo man dort anzusetzen habe, auch das ist mir nun klar.
Ich habe eben mal deinen WINAPI-Code in C++ umgewandelt, der Text wird in der MessageBox
angezeigt, doch sehe ich leider kein Editfeld. Wo ist der Fehler?
Code:
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
 HWND H = CreateWindowA("EDIT", "Submit",
                 WS_CHILD,
                 10, 10, 124, 25,
                 Handle,
                 NULL,
                 HInstance,
                 NULL);


   AnsiString S;

   S.SetLength(GetWindowTextLengthA(H));
   GetWindowTextA(H, S.c_str(), S.Length() + 1);
   ShowMessage(S);
}
Und wie könnte ich hier jetzt z.B. das Charset probeweise ändern?

Geändert von colcok (11. Okt 2021 um 14:11 Uhr)
  Mit Zitat antworten Zitat
tomkupitz

Registriert seit: 26. Jan 2011
341 Beiträge
 
Delphi 12 Athens
 
#8

AW: TEdit-Komponente mit AnsiString

  Alt 11. Okt 2021, 14:39
WS_VISIBLE fehlt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: TEdit-Komponente mit AnsiString

  Alt 11. Okt 2021, 14:48
Die TEdit-Komponente ableiten und mindestens die Stelle anpassen, wo das CreateWindow ausgeführt wird.
Und dann eben das neue TAnsiEdit in der IDE registrieren und verwenden.

Außerdem kannst in TEdit/TCustomEdit dir abgucken, wie das mit den Charsets an Windows übergeben wird.


oder (ein Doppel-Beispiel, nur halt andersrum)
https://www.delphipraxis.net/141895-...phi-other.html


oder ein älteres Delphi nutzen, also Delphi 2 bis Delphi 2007


und dann gäbe es noch FreePascal/Lazarus ... das ist noh "halb" auf ANSI, nur wird da an vielen Stellen die CodePage für UTF-8 verwendet.
$2B or not $2B

Geändert von himitsu (11. Okt 2021 um 14:51 Uhr)
  Mit Zitat antworten Zitat
colcok

Registriert seit: 15. Mär 2021
11 Beiträge
 
#10

AW: TEdit-Komponente mit AnsiString

  Alt 11. Okt 2021, 15:49
Okay, dank euch, konnte eine Editbox mit dem SetWindowPos-Aufruf sichtbar machen,
auch wenn sie etwas rudimentär ausschaut, aber das ist auch nicht wichtig.

Wäre es im Prinzip ausreichend, folgenden Code in onChange zu setzen?
Code:
void __fastcall TForm1::edtBox(TObject *Sender)
{
  TEdit *DBBoxChange = dynamic_cast<TEdit *>(Sender);
  int codepage = readCodepage();
  RawByteString rbStr(DBBoxChange->Text);
  SetCodePage(rbStr, codepage, false);
 
  DBBoxChange->Text = rbStr;
}
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:07 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