Newsgroup: it.comp.lang.delphi
Titolo: Problemi con 2 classi

Scusate gente se continuo a farvi domande, ma non riesco proprio a venirne a
capo con questo problema. Perchè una cosa così semplice e apparentemente
banale non funziona?
Mettendo un breakpoint sull'execute, la variabile FTest, sembra che sia
modificata, cmq il programma entra ed esce giustamente da quella funzione.
Solo che FTest non contiene niente, io devo dichiarare FTest, come variabile
globale nelle 2 classi, e ho fatto come mi è stato suggerito da Setec ed
Aqua, ma non funziona neancora.
Il Result della funzione non mi da niente !
unit Fserve;
interface
uses Classes, IdTcpClient, Windows;
type
    TThreadSocket = class(TThread)
     FTest : String;
      procedure Execute; override;
    end;
    TFServe = class
     public
      FTest : String;
      FThread : TThreadSocket;
      constructor Create();
      procedure Start();
      function Test : String;
    end;
implementation
{ TThreadSocket }
procedure TThreadSocket.Execute;
begin
     Sleep(50);
     FTest :='prova123';
end;
{ TFServe }
constructor TFServe.Create;
begin
   FThread := TThreadSocket.Create(True);
   FThread.Priority := tpNormal;
   FTest := FThread.FTest;
end;
procedure TFServe.Start;
begin
FThread.Resume;
end;
function TFServe.Test: String;
begin
     Result := FTest;
end;
end.

Ho provato a contattarti in privato ma niente.
Mi manderesti il progetto a 
salex...@libero.it
 che provo a dare
un'occhiata?
Ho provato a debuggare il tuo codice e mi si pianta nell'Execute del Thread!
Tu dici che a te funziona.
Mandami i tuoi sources che provo quelli.
--
Acqua
-------------------------------------------------------
Download new version of my PixExperts for Delphi 6/C++ Builder 6 at
http://www.salexander.supereva.it/Pix_Exp171D6.zip


L'organizzazione delle classi mi pare un po' confusa, ma con queste
modifiche dovrebbe funzionare:
unit Fserve;
interface
uses Classes, IdTcpClient, Windows;
type
  TThreadSocket = class(TThread)
    FTest : String;
    procedure Execute; override;
  end;
  TFServe = class(TObject)    // <--- Eredito esplicitamente da TObject
  public
    FTest : String;
    FThread : TThreadSocket;
    constructor Create();
    destructor Destroy; override;  // <--- mi serve per distruggere il
thread
    procedure Start();
    function Test : String;
    procedure ThreadTerminate(Sender: TObject);
  end;
implementation
{ TThreadSocket }
procedure TThreadSocket.Execute;
begin
  Sleep(50);
  FTest :='prova123';
end;
{ TFServe }
constructor TFServe.Create;
begin
  inherited Create;  // <--- costruttore del TObject
  FThread := TThreadSocket.Create(True);
//  FThread.Priority := tpNormal;    // <--- La priorita' e' tpNormal di
default
  FThread.FreeOnTerminate := false;  // <--- distruggero' io il thread
  FThread.OnTerminate := @ThreadTerminate;    // <--- evento di terminazione
del thread
  FTest := FThread.FTest;   // <--- questo a mio parere non serve granche'
end;
destructor TFServe.Destroy;
begin
  FThread.WaitFor;
  FThread.Free;
  inherited;
end;
procedure TFServe.ThreadTerminate(Sender: TObject);
begin
  FTest := FThread.FTest;   // <--- assegno il valore risultato del thread
end;
procedure TFServe.Start;
begin
  FThread.Resume;
end;
function TFServe.Test: String;
begin
  Result := FTest;
end;
end.
Ciao,
Stefano