Autor Beitrag
Metschu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135

Windows XP SP2 Home
Delphi 7; Delphi XE2-Starter
BeitragVerfasst: Mi 09.11.11 15:11 
Hallo zusammen!

Ich bin gerade dabei, meine Delphi 7PE Projekte auf Delphi XE2 zu übertragen.

Bei dem Compilieren der Projekte kommen dann immer die Warnungen:

[DCC Warnung] FormulareErstellenUnit.pas(511): W1057 Implizite String-Umwandlung von 'ShortString' zu 'string'
[DCC Warnung] FormulareErstellenUnit.pas(879): W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von 'TFontName' zu 'ShortString'
[DCC Warnung] FormulareErstellenUnit.pas(881): W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von 'string' zu 'ShortString'
[DCC Warnung] FormulareErstellenUnit.pas(886): W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von 'TCaption' zu 'ShortString'
...


Aus Speicherplatzgründen habe ich immer die Variable "Shortstring" genommen.
Wenn ich jetzt die Variable "String[10]" nehme, hab ich das gleich Problem, da das ja auch ein Shortstring ist.
Bei "String" sind die Meldungen weg.
Gibt es eine Möglichkeit, dies zu unterdrücken bzw welche Variablen sind dafür geeignet?

Von der Funktion her ist alles in Ordnung, die Variablen größen sind alle passend für die Projekte, nur stören mich diese 50 Hinweise...

Gruß

Torsten
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 09.11.11 15:52 
Wieso nutzt du ShortString? Der Unterschied zwischen (Ansi)String und ShortString dürfte bei 3 Byte pro Variable liegen, wenn ich mich da nicht täusche. Wenn du derartig Speicher sparen musst, bist du bei einer komplexen Sprache wie Delphi wahrscheinlich eh falsch. ;-)

Seit Delphi 2009 nutzt die VCL nunmal nicht mehr AnsiString, sondern UnicodeString. Und nicht alles, was in einen UnicodeString reinpasst (z.B. in einer Caption), passt auch in einen Short- oder AnsiString rein.

Also: Nutze den Typ String. Oder füge in den Code die Umwandlungen explizit ein.

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 09.11.11 18:14 
ShortString ist schon länger (seit Delphi 2 im Grunde) nur noch aus Kompatibilitätsgründen da und sollte nicht mehr verwendet werden. Durch die Umstellung auf Unicode merkt man es nur deutlicher. :mrgreen:
Metschu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135

Windows XP SP2 Home
Delphi 7; Delphi XE2-Starter
BeitragVerfasst: Mi 09.11.11 18:41 
Vielen Dank für die Infos!

Hatte mir nur in der Hilfe den "Speicherverbrauch" mal angeschaut und dann immer den für meine Zwecke kleinsten genommen.
Wollte eben Sparsam sein :?

Gruß

Torsten
Metschu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135

Windows XP SP2 Home
Delphi 7; Delphi XE2-Starter
BeitragVerfasst: Do 17.11.11 19:01 
Hab nun aber das nächste "Problem"...

Wenn ich ein tRecord speichern möchte und als Variable einen String definiere, kommt die Fehlermeldung:
"[DCC Fehler] Unit1.pas(37): E2155 Typ 'TZeile' benötigt Finalization - nicht im Dateityp erlaubt"

Begrenze ich dann die länge der String-Variable bekomme ich logischerweise bei der Zuweisung von einem Edit-Feld wieder die Warnung:
"[DCC Warnung] Unit1.pas(42): W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von 'TCaption' zu 'ShortString'"

Welchen weg muss ich denn hierbei einschlagen?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 17.11.11 19:31 
user profile iconMetschu hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich ein tRecord speichern möchte und als Variable einen String definiere, kommt die Fehlermeldung:
"[DCC Fehler] Unit1.pas(37): E2155 Typ 'TZeile' benötigt Finalization - nicht im Dateityp erlaubt"
Wo hast du was definiert?
Metschu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135

Windows XP SP2 Home
Delphi 7; Delphi XE2-Starter
BeitragVerfasst: Do 17.11.11 19:51 
Dies hab ich mal zum Testen erstellt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
var
  Form1: TForm1;

Type
  TZeile=Record
  Test1:String[254];
  Test2:String[100];
  Test3:String[19];
  Test4:pChar;
End;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var zeile:TZeile;
    f1:File of TZeile;
begin
 zeile.Test1:=Edit1.Text;
 zeile.Test2:=Edit1.Text;
 zeile.Test3:=Edit1.Text;
 zeile.Test4:=pChar(Edit1.Text);
end;
end.

pChar Klappt übrigens, nur steht in der Hilfe ja, das es Unsicher in der Verarbeitung mit normalem String ist...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 17.11.11 22:20 
user profile iconMetschu hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
    f1:File of TZeile;					
Naja, dafür brauchst du einen Record mit einer festen Größe, da gehen normale Strings oder andere Pointer natürlich nicht. Aber wozu die Umstände? Nimm einfach einen TFileStream und schreibe die Daten direkt hinein. ;-)