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

CARAB1 3 Messages postés lundi 31 août 2009Date d'inscription 6 août 2011 Dernière intervention - 31 août 2009 à 17:04 - Dernière réponse : f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention
- 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 

Votre réponse

5 réponses

Meilleure réponse
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 2 sept. 2009 à 21:49
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;

Merci f0xi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de f0xi
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 31 août 2009 à 18:02
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
CARAB1 3 Messages postés lundi 31 août 2009Date d'inscription 6 août 2011 Dernière intervention - 1 sept. 2009 à 08:27
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
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 2 sept. 2009 à 00:39
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
CARAB1 3 Messages postés lundi 31 août 2009Date d'inscription 6 août 2011 Dernière intervention - 2 sept. 2009 à 11:05
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.