AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde

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

Ein Thema von freejay · begonnen am 23. Mai 2019 · letzter Beitrag vom 25. Mai 2019
Antwort Antwort
Seite 1 von 2  1 2   
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
268 Beiträge
 
Delphi 11 Alexandria
 
#1

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

  Alt 23. Mai 2019, 12:58
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.
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]

Geändert von freejay (23. Mai 2019 um 13:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.980 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 23. Mai 2019, 13:07
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.

Wenn nein: Wie prüfe ich denn richtig, ob slShow freigeben kann/muss?
Deswegen sollte slShow vor dem try auf nil gesetzt werden.

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#3

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

  Alt 23. Mai 2019, 13:10
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.980 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 23. Mai 2019, 13:13
Die Prüfung wird vom Free doch selbst schon durchgeführt, das kannst Du Dir von daher eigentlich sparen.
Knallt aber hier trotzdem.

Und alles hinter dem finally wird immer ausgeführt.
Genauer: Alles zwischen finally und dem zugehörigen end .
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#5

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

  Alt 23. Mai 2019, 13:16
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;
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
268 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 23. Mai 2019, 13:18
Hey, danke Euch beiden.

Nach 20 Jahren Delphi ein paar Basics aufgefrischt...

Irgendwas fällt immer mal wieder hinten runter, wenn man's lange nicht braucht...
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
268 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 23. Mai 2019, 13:18
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 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#8

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

  Alt 23. Mai 2019, 13:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 23. Mai 2019, 13:23
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.288 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 23. Mai 2019, 13:25
Hallöle...

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;

Geändert von haentschman (23. Mai 2019 um 13:28 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr.
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