Conversion structure PIDL en string (en codegear RAD Studio Delphi [Résolu]

Messages postés
3
Date d'inscription
lundi 31 août 2009
Statut
Membre
Dernière intervention
6 août 2011
- - Dernière réponse : f0xi
Messages postés
4278
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
- 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
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
4278
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
3
Merci
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;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 122 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
Messages postés
4278
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
0
Merci
function PIDLToString(pidl: PItemIDList): AnsiString;
var
L : integer;
begin
L := GetSizeOfPidl(pidl);
SetLength(Result, L);
Move(pidl^, Result[1], L);
end;
Commenter la réponse de f0xi
Messages postés
3
Date d'inscription
lundi 31 août 2009
Statut
Membre
Dernière intervention
6 août 2011
0
Merci
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)
Commenter la réponse de CARAB1
Messages postés
4278
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
0
Merci
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.
Commenter la réponse de f0xi
Messages postés
3
Date d'inscription
lundi 31 août 2009
Statut
Membre
Dernière intervention
6 août 2011
0
Merci
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.
Commenter la réponse de CARAB1