Also... Sharky hat schon richtig erkannt, dass ich einfach nicht ständig
Form1.DataSource1.DataSet im nachfolgenden Code wiederholen wollte! Allerdings ist wohl das Prinzip noch nicht ganz klar... Ausserdem steckt in seinem Codebeispiel ein gaaanz böser Fehler drin: Erst wird eine neue TDataSet-Instanz erzeugt (was hier völlig unnötig ist), dann wird der Objektvariablen
ds eine ganz andere Instanz (nämlich Form1.DataSource1.DataSet) zugewiesen. Im
finally-Abschnitt wird dann diese andere Instanz zerstört (also Form1.DataSource1.DataSet) und die neu erzeugte Instanz wird überhaupt nicht zerstört (es gibt ja auch keinen Pointer mehr auf diese neue Instanz)... uiuiuiuiuiuiu....
Die richtige Variante sieht so aus:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
ds : TDataSet; // lokales TDataSet
begin
ds := Form1.DataSource1.DataSet;
Panel1.Caption := Format(' Das sind Daten von %s, %s - %s', [ds['Name'], ds['Vorname'], ds['Mitgliedsnummer']]);
{ ... }
end;
Du könntest es auch so schreiben, was aber länger und vor allem schlechter wartbar ist:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
Panel1.Caption := Format(' Das sind Daten von %s, %s - %s',
[Form1.DataSource1.DataSet['Name'],
Form1.DataSource1.DataSet['Vorname'],
Form1.DataSource1.DataSet['Mitgliedsnummer']
]);
{ ... }
end;
Die Anweisung
ds := TDataSet.Create(Self);
musst Du
unbedingt aus Deinem Code entfernen! Denn Du erzeugst hier eine neue Instanz, die aber weder benötigt noch verwendet wird (deshalb auch der Compiler-Hinweis "Auf 'ds' zugewiesener Wert wird niemals benutzt") und - was wirklich schlimm ist - niemals freigegeben wird! D.h Du erzeugst bei jedem Aufruf Deines Formulars eine neue TDataSet-Instanz, die dann alle nutzlos ohne Referenz im Speicher rumliegen...
Wenn Du allerdings tatsächlich eine Objektinstanz erzeugen musst, ist der nachfolgende Zugriff auf diese neue Instanz
unbedingt durch einen
try-finally-Block zu kapseln (so wie es Sharky schon gezeigt hat):
Delphi-Quellcode:
var
obj1: TMyClass;
begin
obj1 := TMyClass.Create();
try
// Irgendwas mit obj1 machen...
finally
obj1.Free;
end;
end;