AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language generischen Typen als "irgendeinen" String-Typen deklarieren
Thema durchsuchen
Ansicht
Themen-Optionen

generischen Typen als "irgendeinen" String-Typen deklarieren

Ein Thema von himitsu · begonnen am 12. Sep 2010 · letzter Beitrag vom 13. Sep 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von himitsu
himitsu

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

generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 12. Sep 2010, 13:24
Delphi-Version: 2010
Delphi-Quellcode:
type
  TMyClass = class
    procedure Test<typ>(S: typ);
  end;

procedure TMyClass.Test<typ>(S: typ);
var S2: String;
begin
  S2 := S; <<<
end;
Zitat:
[DCC Fehler] Unit4.pas(32): E2010 Inkompatible Typen: 'string' und 'typ'
Wie kann ich jetzt innerhalv der Klasse den "typ" kompatibel zu String bekommen?
Man kann zwar z.B. so procedure Test<typ: class>(S: typ); sagen, daß es irgendeine Klasse sein wird,
aber wie kann man es zum String kompatibel machen?
(AnsiString, RawByteString, UnicodeString, String)

Ich wollte die Generics benutzen, um einige "ähnliche" Funktionen zu kombinieren.
Wobei sich dort nur ein paar Parameter so unterscheiden, daß sie einmal ANSI und dann auch mal als Unicode vorhanden sein können.

Da es einige Funktionen mit bis zu 3 String-Parametern gibt und ich absolut nicht die automatischen Stringumwandlungen, seitens Delphi, gebrauchen kann, gibt es da also öfters mal bis zu 3^3 = 9 Funktionen, welche alle fast den selben Inhalt besitzen.
$2B or not $2B

Geändert von himitsu (12. Sep 2010 um 13:36 Uhr)
  Mit Zitat antworten Zitat
USchuster

Registriert seit: 12. Sep 2010
Ort: L.E.
120 Beiträge
 
Delphi XE3 Professional
 
#2

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 12. Sep 2010, 15:42
Die Vereinfachung, welche Du mit Generics erreichen möchtest, funktioniert leider nicht aufgrund des nicht vorhandenen Typsystems bzw. der nicht vorhandener Contraints für Stringtypen. Um die Verwendung von überladenen Methoden wirst Du leider nicht drumherum kommen.

Theoretisch könntest Du es analog zu folgendem Beispiel implementieren:
Delphi-Quellcode:
program ParameterizedStringMethodTest;

{$APPTYPE CONSOLE}

type
  TMyClass = class
    class procedure Test<T>(S: T);
  end;

  T1252String = type AnsiString(1252);

class procedure TMyClass.Test<T>(S: T);
var
  StringTypeInfo: Pointer;
begin
  StringTypeInfo := TypeInfo(T);
  if StringTypeInfo = TypeInfo(AnsiString) then
    WriteLn('AnsiString: ' + AnsiString(Pointer(@S)^))
  else
  if StringTypeInfo = TypeInfo(RawByteString) then
    WriteLn('RawByteString: ' + RawByteString(Pointer(@S)^))
  else
  if StringTypeInfo = TypeInfo(UnicodeString) then
    WriteLn('UnicodeString: ' + UnicodeString(Pointer(@S)^))
  else
  if StringTypeInfo = TypeInfo(ShortString) then
    WriteLn('ShortString: ' + ShortString(Pointer(@S)^))
  else
  if StringTypeInfo = TypeInfo(UTF8String) then
    WriteLn('UTF8String: ' + UTF8String(Pointer(@S)^))
  else
  if StringTypeInfo = TypeInfo(T1252String) then
    WriteLn('T1252String: ' + T1252String(Pointer(@S)^))
  else
    WriteLn('Unknown type');
end;

begin
  TMyClass.Test(AnsiString('Ansi'));
  TMyClass.Test(RawByteString('Raw'));
  TMyClass.Test(UnicodeString('Uni'));
  TMyClass.Test(string('string is Uni too'));
  TMyClass.Test(ShortString('Short'));
  TMyClass.Test(UTF8String('UTF8'));
  TMyClass.Test(T1252String('1252'));
  ReadLn;
end.
Der Output müsste so aussehen:
Code:
AnsiString: Ansi
RawByteString: Raw
UnicodeString: Uni
UnicodeString: string is Uni too
ShortString: Short
UTF8String: UTF8
T1252String: 1252
  Mit Zitat antworten Zitat
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 12. Sep 2010, 20:43
Wie kann ich jetzt innerhalv der Klasse den "typ" kompatibel zu String bekommen?
Der spontane Gedanke (so ohne groß nachzudenken oder gar zu testen): Verwende ToString von TObject
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 12. Sep 2010, 21:51
Ich habe aber Strings und keine Objekte.

Aktuell umgeh ich den Compiler über wilde Pointervergewaltigungen und blöde IF-Kontrukte, wobei mir {$IF lieber wäre



Es wäre schön, wenn es wirklich endlich mal einen zweifasigen Compiler gäbe und dieser erst die Typenprüfungen macht, wenn er einen Typen übergeben bekommt.
$2B or not $2B

Geändert von himitsu (12. Sep 2010 um 22:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 12. Sep 2010, 22:13
Es wäre schön, wenn es wirklich endlich mal einen zweifasigen Compiler gäbe und dieser erst die Tüpenprüfungen macht, wenn er einen Typen übergeben bekommt.
Er hat Jehova gesagt
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
376 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 07:32
@Uwe

[ot]

...ist hier etwa Weibsvolk anwesend ?

Ps. Ich liebe diesen Film!
Andreas Schachtner
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 17:45
So, fast alle Arbeit umsonst.

Mein Fazit:
Für eine gleichzeitige Ansi/Unicode-Programmierung ist diese besch** Generic-Implementierung absolut nicht zu gebrauchen.

Danke Emba, für eure tolle Arbeit.
$2B or not $2B
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 18:37
Dazu ist sie eigentlich auch nicht gedacht
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 19:31
Mal ehrlich, vergiss den ganzen AnsiKrams und benutz string und fertig. Wer dennoch was nicht Unicode kompatibles haben will solls halt erst in string umcasten und in deine Methoden reingeben.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 19:47
Das ist eine Bibliothek, welche mit Ansi, UTF-8 und Co. umgehen können muß.
Da gibt es keinen anderen Weg.

Wenn ich dieses nur als "String" (Unicode) auslege, dann müssen "extern" Stringumwandlungen vorgenommen werden und das erzeugt zusätzliche Fehlerquellen.
Es gibt schon seine Grüne, warum ich seit Monaten versuche hierfür eine Ansi/Unicode-kompatible Schittstelle hinzubekommen.

Über die Generics hatte ich mir hier (intern) ein paar Vereinfachungen erhofft, in Form von knapp 1000-2000 Zeilen Quellcode, aka knapp 1/4 bis 1/3 eingesparten "doppelten" Code.
Nja, knapp 2-3 Tage umsonst dahingegangen, wärend ich versuchte die Generics passend hinzubiegen und dann scheiterte es an Compilerfehlern.
$2B or not $2B

Geändert von himitsu (13. Sep 2010 um 19:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:09 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