Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi D2009: Inkompatible Typen Array und xxx (https://www.delphipraxis.net/142048-d2009-inkompatible-typen-array-und-xxx.html)

Hedge 21. Okt 2009 04:06


D2009: Inkompatible Typen Array und xxx
 
Ich rufe auf:

Delphi-Quellcode:
LinkInfo.FullPathAndNameOfLinkFile:= blablablub
Das Attribut sieht so aus:

Delphi-Quellcode:
FullPathAndNameOfLinkFile: array[0..MAX_PATH] of Char;
Egal mit was ich ihn füttere. Es kommt immer eine Inkompatibilitätsmeldung.
Grundlegend habe ich einen String den ich da reinschreiben will.

EDIT: Selbst wenn ich ihm ein a: array[0..1213] of Char; überreiche mault er rum (dann jedoch nur noch "Inkompatible typen")
So sieht der Rest aus:

Delphi-Quellcode:
      copymemory(@a[low(a)],@datei[1],sizeof(a));
      LinkInfo.FullPathAndNameOfLinkFile := a;

Klaus01 21. Okt 2009 05:48

Re: D2009: Inkompatible Typen Array und xxx
 
Guten Morgen,

Delphi-Quellcode:
LinkInfo.FullPathAndNameOfLinkFile:= 'blablablub'
Soweit ich das weiß, sind 0 basierende Arrays zuweisungskompatibel zu (Ansi)Strings.

Grüße
Klaus

mkinzler 21. Okt 2009 07:09

Re: D2009: Inkompatible Typen Array und xxx
 
Nur zu ShortStrings

himitsu 21. Okt 2009 07:56

Re: D2009: Inkompatible Typen Array und xxx
 
MAX_PATH <> 1213
das konnte ja nicht gehn

FullPathAndNameOfLinkFile := '123123';
geht, da der Compiler die '123123' nicht als String-Konstante, sondern als Array ablegt und dieses dann direkt reinkopieren kann

FullPathAndNameOfLinkFile := S;
geht nicht

S := FullPathAndNameOfLinkFile;
das geht aber :mrgreen: , da hier Delphi es sozusagen als PChar ansieht (LStrFromArray)
S := PChar(@FullPathAndNameOfLinkFile)
also als PChar mit abschließender #0 und/oder einer Maximallänge von Length(FullPathAndNameOfLinkFile)

Zitat:

FullPathAndNameOfLinkFile: array[0..MAX_PATH] of Char;
kannst du an der Definition etwas ändern, oder ist sie vorgegeben?

sonst könnte man dieses Array in einem Record verpacken und einen Setter/Getter als StringTypen dafür definieren ... sieht zwar blöder aus, aber läßt sich dann leichter im restlichen Code verwenden :angel2:


Von Delphi selber gibt es keine Default-Funktionen, welche zum Befüllen oder Vergleichen des Arrays genutzt werden, da es nicht weiß, wie du den Inhalt interpretierst.

Hedge 21. Okt 2009 11:27

Re: D2009: Inkompatible Typen Array und xxx
 
Kann die Definition nach Belieben ändern.
z.B. MaxPath durch eine Zahl ersetzen, aber das hat es auch nicht gebracht.

Edit: Hab das komische Array einfach als PChar definiert, jetzt funzt es.

Habe jetzt an einer anderen Stelle das Problem dass ich PWideChar nach String umwandeln muss. Ideen?

himitsu 21. Okt 2009 12:03

Re: D2009: Inkompatible Typen Array und xxx
 
Zitat:

Zitat von Hedge
z.B. MaxPath durch eine Zahl ersetzen, aber das hat es auch nicht gebracht.

MAX_PATH ist eine Konstante (260) und nur weil man da eine Wert (die Größe) ändert, ändert sich nichts am Typ.

Nja, ich meinte ob du den Typen einfach verändern kannst
oder ob er genau so, als Array, definiert sein muß.


Ich hatte mir ein einem Projekt mal so beholfen
Delphi-Quellcode:
TWideString32 = packed Record
  Data: Array[1..32] of WideChar;
  Class Operator Implicit(Const Value: AnsiString): TWideString32;
  Class Operator Implicit(Const Value: WideString): TWideString32;
  Class Operator Implicit(Const Value: TWideString32): WideString;
  Class Operator Equal  (Const A: TWideString32; Const B: WideString): Boolean;
  Class Operator NotEqual(Const A: TWideString32; Const B: WideString): Boolean;
End;
dieses entspricht vom Speicher her diesem
Delphi-Quellcode:
TWideString32 = Array[1..32] of WideChar;
der Typ/Record kann jetzt (so wie er hier ist)
Delphi-Quellcode:
Rec := S {AnsiString};
Rec := S {WideString/UnicodeString};
S {WideString} := Rec; // und indirekt auch AnsiString
if Rec = S {WideString} then
if Rec <> S {WideString} then
und intern wird dann via MoveMemory kopiert.


[add]
ahhh, ich jetzt hab ich's doch gefunden ... wußte doch, daß es irgendwo mal was gab :angel:
[add2]
und och noch den Link vergessen :wall:
http://www.delphipraxis.net/internal...rator+implicit

Hedge 21. Okt 2009 13:14

Re: D2009: Inkompatible Typen Array und xxx
 
Danke für die ausführliche Hilfe.
Konnte es wie gesagt lösen indem ich ne PChar draus gemacht habe.

Muss jetzt nur noch ein PWideChar in einen String umwandeln. Ideen?

himitsu 21. Okt 2009 13:31

Re: D2009: Inkompatible Typen Array und xxx
 
einfach zuweisen ... die Compilermagic macht den Rest

Delphi-Quellcode:
var S: String; // oder WideString, AnsiString ...
  P: PChar;   // oder PWideChar, PAnsiChar

S := P;

Hedge 21. Okt 2009 13:39

Re: D2009: Inkompatible Typen Array und xxx
 
Die Compilermagic ist stark, aber wenn man 2 Strings (PChar und PWideChar) verbinden will löppt das nicht so:

s=string
FullPathAndNameOfWorkingDirectroy=PChar
FindData.cFileName=PWideChar

[delphi}s :=FullPathAndNameOfWorkingDirectroy + FindData.cFileName;[/delphi]

"Operator is auf diesen Operandentyp nicht anwendbar"

Klaus01 21. Okt 2009 13:42

Re: D2009: Inkompatible Typen Array und xxx
 
s:string
FullPathAndNameOfWorkingDirectroy:PChar
FindData.cFileName:PWideChar

vielleicht geht es ja so:

Delphi-Quellcode:
s:= FindData.cFileName;
s:= FullPathAndNameOfWorkingDirectroy +s;
Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 Uhr.
Seite 1 von 2  1 2      

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