Newsgroup: it.comp.lang.delphi
Titolo: Da PChar a Tstream:come?

Il server mi scrive l'elenco dei dischi presenti in una variabile
Pchar (variabile_Integer:=GetLogicalDriveStrings(100,variabile_PChar).
Volevo rispedirla al Client ma io ho solo questo funzioni x rispedirla
al Client:
SendStream
SendText
SendBuf
Come faccioa convertire il PChar in TStream x spedirlo?
Grazie e cercate di sorvolare su eventuali imperfezioni di linguaggio,
sono alle prime armi.

 Come faccioa convertire il PChar in TStream x spedirlo?
quale classe utilizzi per fare ciň?
posta cosě, la tua domanda non ha alcun significato.
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

Spero di aver capito la tua domanda:
var
   MypChar:PChar;
   mystring:string;
begin
   mystring:=socket.receivetext;
   if mystring='ElencoDIR' then begin
	Num:=GetLogicalDriveStrings(100,MypChar);
...............
se adesso uso Socket.SendText(MypChar) o SendBuf(MypChar) o
SendStream(MypChar) mi danno tutti errori per variabili incompatibili.
Grazie


 SendStream(MypChar) mi danno tutti errori per variabili incompatibili.
ehm.. scusa ma la tua domanda è ancora incompleta, e a domande incomplete 
seguono sempre risposte vaghe e parziali, inoltre non puoi pretendere che 
la gente conosca a menadito le migliaia di classi della VCL.. se faccio 
questa precisazione non è per pedanteria ma perchè così come l'hai posta 
non saprei proprio come aiutarti. 
Dunque, Socket di che classe è? In che unit è definita? Se è nella VCL (le 
unit standard di Delphi), allora probabilmente ce l'avrò anch'io :-)
Facendo una ricerca con Find in Files ho trovato
function TCustomWinSocket.SendBuf(var Buf; Count: Integer): Integer;
function TCustomWinSocket.SendText(const s: string): Integer;
function SendStream(AStream: TStream): Boolean;
function TCustomWinSocket.ReceiveText: string;
Quindi ipotizzando (!) che la tua variabile Socket sia di classe 
TCustomWinSocket (o di un suo derivato, ma è bene che controlli) e visto 
che hai definito MypChar come PChar:
1) hai sbagliato a chiamare la funzione Socket.SendBuf(MypChar), visto che 
non hai fornito il parametro Count (magari avresti dovuto richiamarla in 
questo modo
  Socket.SendBuf(MypChar, SizeOf(MypChar));
2) idem per Socket.SendStream(MypChar), visto che la funzione si aspettava 
un tipo TStream e non un PChar;
3) noi tutti ci aspettavamo invece che Socket.SendText(MypChar) 
funzionasse, visto che la conversione tra PChar e AnsiString in Delphi è 
automatica.
Forniscici ulteriori delucidazioni in merito e ti potremo aiutare meglio 
(non parlo col plurale majestatis per emulare il mago otelma, ma parlo a 
nome del NG)


function TCustomWinSocket.ReceiveText: string;
Esatto tutto quello che hai detto. Sono queste le classi che ho usato.
Non sò come fare a spedire l'elenco delle directori di un disco al
client. Gli unici esempi che trovo online sono sempre di spedizione e
ricezione di stringhe, x le quali usano "Socket.Sendtext" ma x spedire
elenchi di directori o anche solo l'elenco dei dischi locali ottenuti
con GetLogicalDriveStrings non ho la + pallida idea di cosa usare.
Grazie x la pazienza!

function TCustomWinSocket.ReceiveText: string;
Per finire: Cantů sulla suo homepage usa il formato dati TTable perň
lo usa x spedire tutti i dati di una ipotetica ditta....

 con GetLogicalDriveStrings non ho la + pallida idea di cosa usare.
Ad esempio si potrebbe usare una delle funzioni della jcl per convertire
da array di stringhe null terminated a TStrings, e quindi inviare la
proprieta' Text di quest'ultima. In generale comunque per scrivere N
bytes da un PChar su uno stream si puo' fare:
  destStream.WriteBuffer(sourcePChar^, numBytes);
Saluti
Paolo Arosio
-- 
"La dimostrazione dell'esistenza di specie intelligenti nell'universo
 e' che non ci vengono a trovare"

 con GetLogicalDriveStrings non ho la + pallida idea di cosa usare.
dalla documentazione di GetLogicalDriveStrings vedo che ha due argomenti: 
nBufferLength: DWORD (cioè Cardinal) e lpBuffer: LPTSTR (cioè PChar), dove 
lpBuffer conterrà il risultato della funzione in una forma del tipo 
c:\<null>d:\<null><null>  
(dove <null> equivale a #0)
Per decodificare poi questa informazione, ho scritto quick and dirty 
questa funzione:
function _GetLogicalDriveStrings(Separator: Char = #32): string;
{ restituisce l'elenco dei dischi logici, separato da uno spazio
  o da un altro carattere }
var
  BufferSize, n: Cardinal;
begin
  SetLength(Result, 1000);      //il 1000 è arbitrario
  BufferSize:= GetLogicalDriveStrings(1000, PChar(Result));
  SetLength(Result, Pred(BufferSize));
  for n:= 1 to Pred(BufferSize) do
    if Result[n] = #0 then
      Result[n]:= Separator;    //sostituisco ciascun NULL con un 
Separator
end;
Però a noi interessa il fatto che lpBuffer è un PChar quindi 
SendText_GetLogicalDriveStrings)
dovrebbe funzionare!
Se non lo fa, il problema è da ricercare altrove...


 SendText(_GetLogicalDriveStrings)


Grazie a tutti x le risposte....adesso ci provo!