Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde (https://www.delphipraxis.net/200768-pruefung-auf-assigned-myobject-true-obwohl-myobject-nicht-initialisiert-wurde.html)

freejay 23. Mai 2019 12:58


Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
 
Hallo zusammen,

vielleicht stehe ich ja nur unglaublich auf dem Schlauch aber müsste in dem Codebeispiel "Assigned(slShow)" nicht false sein?

Delphi-Quellcode:
procedure TfMain.Button1Click(Sender: TObject);
var
  In_A: string;
  slShow: TStringList;
begin
  In_A := '';

  try
    if In_A = '' then
      exit;

    slShow := TStringList.Create;
  finally
    if Assigned(slShow) then
      slShow.Free;
  end;
end;
Wenn nein: Wie prüfe ich denn richtig, ob slShow freigeben kann/muss?

Aber - und mindestens genauso schlimm - die Zeile "if Assigned(slShow) then" wird ja nur ausgeführt, weil das "exit" zu einer Access Violation führt!

Ist vielleicht meine Installation kaputt?

Bin dankbar für jede Hilfe!

Gruß

Freejay

PS: Das ist ein Testprojekt mit zwei Buttons, einem Memofeld und einem Opendialog. Sonst nix. Frisch zusammengebastelt.

Uwe Raabe 23. Mai 2019 13:07

AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert
 
Zitat:

Zitat von freejay (Beitrag 1432938)
vielleicht stehe ich ja nur unglaublich auf dem Schlauch aber müsste in dem Codebeispiel "Assigned(slShow)" nicht false sein?

Eine (non-managed) lokale Variable ist nicht initialisiert. Das gilt auch für Object-Variablen; die kann auf alles mögliche zeigen.

Zitat:

Zitat von freejay (Beitrag 1432938)
Wenn nein: Wie prüfe ich denn richtig, ob slShow freigeben kann/muss?

Deswegen sollte slShow vor dem try auf nil gesetzt werden.

Zitat:

Zitat von freejay (Beitrag 1432938)
die Zeile "if Assigned(slShow) then" wird ja nur ausgeführt, weil das "exit" zu einer Access Violation führt!

Der finally-Abschnitt wird immer ausgeführt - auch bei einem Exit innerhalb eines try-finally.

Delphi.Narium 23. Mai 2019 13:10

AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
 
Die Prüfung wird vom Free doch selbst schon durchgeführt, das kannst Du Dir von daher eigentlich sparen.

Und alles hinter dem finally wird immer ausgeführt.

Uwe Raabe 23. Mai 2019 13:13

AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1432940)
Die Prüfung wird vom Free doch selbst schon durchgeführt, das kannst Du Dir von daher eigentlich sparen.

Knallt aber hier trotzdem.

Zitat:

Zitat von Delphi.Narium (Beitrag 1432940)
Und alles hinter dem finally wird immer ausgeführt.

Genauer: Alles zwischen
Delphi-Quellcode:
finally
und dem zugehörigen
Delphi-Quellcode:
end
.

Schokohase 23. Mai 2019 13:16

AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
 
Fassen wir alles zusammen, dann ergibt sich
Delphi-Quellcode:
procedure TfMain.Button1Click(Sender: TObject);
var
  In_A: string;
  slShow: TStringList;
begin
  In_A := '';
  slShow := nil;

  try
    if In_A = '' then
      exit;

    slShow := TStringList.Create;
  finally
    slShow.Free;
  end;
end;

freejay 23. Mai 2019 13:18

AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
 
Hey, danke Euch beiden. :thumb:

Nach 20 Jahren Delphi ein paar Basics aufgefrischt...

Irgendwas fällt immer mal wieder hinten runter, wenn man's lange nicht braucht... :roll:

freejay 23. Mai 2019 13:18

AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
 
Zitat:

Zitat von Schokohase (Beitrag 1432943)
Fassen wir alles zusammen, dann ergibt sich
Delphi-Quellcode:
procedure TfMain.Button1Click(Sender: TObject);
var
  In_A: string;
  slShow: TStringList;
begin
  In_A := '';
  slShow := nil;

  try
    if In_A = '' then
      exit;

    slShow := TStringList.Create;
  finally
    slShow.Free;
  end;
end;

So sieht's jetzt bei mir auch aus! :-)

Delphi.Narium 23. Mai 2019 13:22

AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
 
Mein Delpbi gibt mir bei der Variante aus dem Eingangspost immer eine Compilerwarnung aus.

Beim slShow.Free sagt es, dass slShow eventuell nicht initialisiert sein könnte.

Eben weil alles zwischen finally und dem zugehörigen end ausgeführt wird, das Create wird aber nicht immer ausgeführt, da die Routine ja mit exit vorher verlassen wird.

Daher: Compilerwarnungen beachten, sie sind manchmal lässtig, aber immer hilfreich. ;-)

Bernhard Geyer 23. Mai 2019 13:23

AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
 
Zitat:

Zitat von freejay (Beitrag 1432945)
Zitat:

Zitat von Schokohase (Beitrag 1432943)
Fassen wir alles zusammen, dann ergibt sich
Delphi-Quellcode:
procedure TfMain.Button1Click(Sender: TObject);
var
  In_A: string;
  slShow: TStringList;
begin
  In_A := '';
  slShow := nil;

  try
    if In_A = '' then
      exit;

    slShow := TStringList.Create;
  finally
    slShow.Free;
  end;
end;

So sieht's jetzt bei mir auch aus! :-)

Sollte es hier nicht eine Compilerwarnung geben?
Die Zeile "slShow := TStringList.Create;" sollte vor dem try stehen.

haentschman 23. Mai 2019 13:25

AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
 
Hallöle...8-)

Besser...
Delphi-Quellcode:
procedure TfMain.Button1Click(Sender: TObject);
var
  In_A: string;
  slShow: TStringList;
begin
  In_A := '';

  slShow := TStringList.Create;
  try
    if In_A = '' then
      exit;
     
  finally
    slShow.Free;
  end;
end;
oder

Delphi-Quellcode:
procedure TfMain.Button1Click(Sender: TObject);
var
  In_A: string;
  slShow: TStringList;
begin
  In_A := '';

  if In_A = '' then
  begin
    exit;
  end
  else
  begin
    slShow := TStringList.Create;
    try
      // deins    
    finally
      slShow.Free;
    end;
  end;
end;
oder

Delphi-Quellcode:
procedure TfMain.Button1Click(Sender: TObject);
var
  In_A: string;
  slShow: TStringList;
begin
  In_A := '';

  if not (In_A = '') then
  begin
    slShow := TStringList.Create;
    try
      // deins    
    finally
      slShow.Free;
    end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz