Vedek Bareil
2004-10-07, 23:00:28
Hallo,
ich habe vor einer Weile unter Delphi eine bemerkenswerte Feststellung gemacht:
In einem Demo-Programm wurde eine Zeichenfläche (TPaintBox-Objekt) als Parameter an den Konstruktor eines Threads (TThread) übergeben, von den dann eine Methode auf die Zeichenfläche zeichnete. Kann es sein, daß Delphi in solchen Fällen intern automatisch eine by-reference-Übergabe realisiert, etwa immer dann, wenn eine VCL-Komponente als Parameter übergeben wird?
Wäre die PaintBox by value übergeben worden, hätte der Thread ja nur in eine Kopie gezeichnet, die sichtbare PaintBox auf dem Programmfenster wäre davon unbeeinflußt geblieben...
In Pascal/Delphi werden by-reference-Übergaben ja üblicherweise dadurch realisiert, daß in der Parameterliste der Funktion, an die übergeben wird, das Schlüsselwort var vor dem betreffenden Parameter steht. Das war in dem besagten Demo-Programm nicht der Fall. Hier schematisch der Code:
type TThread1 = class(TThread)
private
FBox: TPaintBox;
//...
protected
procedure Execute; override;
//...
public
construcotr Create(Box: TPaintBox; {...})
end;
//...
constructor TThread1.Create(Box: TPaintBox; {...});
begin
FBox := Box;
//...
end;
//...
procedure TThread1.Execute;
begin
// Zeichnen auf FBox
end;
ich habe vor einer Weile unter Delphi eine bemerkenswerte Feststellung gemacht:
In einem Demo-Programm wurde eine Zeichenfläche (TPaintBox-Objekt) als Parameter an den Konstruktor eines Threads (TThread) übergeben, von den dann eine Methode auf die Zeichenfläche zeichnete. Kann es sein, daß Delphi in solchen Fällen intern automatisch eine by-reference-Übergabe realisiert, etwa immer dann, wenn eine VCL-Komponente als Parameter übergeben wird?
Wäre die PaintBox by value übergeben worden, hätte der Thread ja nur in eine Kopie gezeichnet, die sichtbare PaintBox auf dem Programmfenster wäre davon unbeeinflußt geblieben...
In Pascal/Delphi werden by-reference-Übergaben ja üblicherweise dadurch realisiert, daß in der Parameterliste der Funktion, an die übergeben wird, das Schlüsselwort var vor dem betreffenden Parameter steht. Das war in dem besagten Demo-Programm nicht der Fall. Hier schematisch der Code:
type TThread1 = class(TThread)
private
FBox: TPaintBox;
//...
protected
procedure Execute; override;
//...
public
construcotr Create(Box: TPaintBox; {...})
end;
//...
constructor TThread1.Create(Box: TPaintBox; {...});
begin
FBox := Box;
//...
end;
//...
procedure TThread1.Execute;
begin
// Zeichnen auf FBox
end;