Conversion structure PIDL en string (en codegear RAD Studio Delphi

Résolu
CARAB1 Messages postés 3 Date d'inscription lundi 31 août 2009 Statut Membre Dernière intervention 6 août 2011 - 31 août 2009 à 17:04
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 2 sept. 2009 à 21:49
//conversion du PIDL complet en string

function PIDLToString(pidl: PItemIDList): String;
var
PidlLength: integer;
begin
PidlLength := GetSizeOfPidl(pidl);
SetLength(Result, PidlLength);
Move(pidl^, PChar(Result)^, PidlLength);
end;

cette fontion est OK en Delphi 7
MAIS Ne pointe pas au bon endroit en CodeGear RAD Studio
cela marche "presque" avec
Result := String(PIDL); //au lieu de move(...)

en débuggage result contient la
Sauf plante mémoire !!!
Quelqu'un a-t-il une idée pour que cela fonctionne dans la nouvelle version ?

Merci

5 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
2 sept. 2009 à 21:49
alors il ne faut pas faire comme cela.


function PIDLToStr(const PIDL: TSHItemID): AnsiString;
begin
SetLength(result, PIDL.cb);
Move(PIDL.abID[0], Result[1], PIDL.cb);
end;
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
31 août 2009 à 18:02
function PIDLToString(pidl: PItemIDList): AnsiString;
var
L : integer;
begin
L := GetSizeOfPidl(pidl);
SetLength(Result, L);
Move(pidl^, Result[1], L);
end;
0
CARAB1 Messages postés 3 Date d'inscription lundi 31 août 2009 Statut Membre Dernière intervention 6 août 2011
1 sept. 2009 à 08:27
Function PIDLToString(pidl: PItemIDList): ANSIString;
var PidlLength: integer;
begin
PidlLength := GetSizeOfPidl(pidl);
SetLength(Result, PidlLength);
Move(pidl^, PChar(Result)^, PidlLength);
end;

*** Il faut une ANSIString pour que le contenu soit OK !!! ***
(et pas une String).

***
Move(pidl^, PChar(Result)^, PidlLength);
ou
Move(pidl^, Result[1], PidlLength);
marche tout les 2 (ce qui me parait normal)

par contre (et pour ma culture) sais tu pourquoi
Result := String(PIDL); plante à l'éexcution ?

M E R C I beaucoup (j'y perdais mon latin)
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
2 sept. 2009 à 00:39
je ne connais pas la declaration du type TItemIDList mais je pense qu'il n'est pas possible de faire un transtypage direct vers String ou AnsiString.

surtout si c'est une structure ou une classe.


un transtypage doit obligatoirement se faire avec des types sources et destinations de la même categorie native.

si on peut aisement transtyper les types entiers (byte, word, integer, cardinal, tcolor, int64) ou les types pointeurs (avec exceptions) il est plus difficile voir impossible de le faire avec des types complexe ou structuré.

par exemple il est impossible de transtype string et structure ou flottant.

les exceptions se font dans un contexte d'interpretation par exemple :

single(3.14)
extended(7/35)
currency(67.1)
real(8)
string('blabla')
pchar('blabla')
ansistring('blabla')


quand le transtypage echoue, il faut alors convertir.
je ne peux pas faire :

S := String(255);

mais je peux faire :

S := IntToStr(255);



je ne peux pas faire :

S := String(MonPoint);

mais je peux faire :

S := format('%d x %d',[MonPoint.X, MonPoint.Y]);



voila.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CARAB1 Messages postés 3 Date d'inscription lundi 31 août 2009 Statut Membre Dernière intervention 6 août 2011
2 sept. 2009 à 11:05
OK ce doit-être ca le type TItemIDList est une structure de données dans l'unité ShlObj :

...
type
{ TSHItemID -- Item ID }
PSHItemID = ^TSHItemID;
{$EXTERNALSYM _SHITEMID}
_SHITEMID = record
cb: Word; { Size of the ID (including cb itself) }
abID: array[0..0] of Byte; { The item ID (variable length) }
end;
TSHItemID = _SHITEMID;
{$EXTERNALSYM SHITEMID}
SHITEMID = _SHITEMID;


{ TItemIDList -- List if item IDs (combined with 0-terminator) }
PItemIDList = ^TItemIDList;
{$EXTERNALSYM _ITEMIDLIST}
_ITEMIDLIST = record
mkid: TSHItemID;
end;
TItemIDList = _ITEMIDLIST;
{$EXTERNALSYM ITEMIDLIST}
ITEMIDLIST = _ITEMIDLIST;

...

Encore M e r c i.
0
Rejoignez-nous