Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt" (https://www.delphipraxis.net/180596-hinweis-unterdruecken-auf-x-zugewiesener-wert-wird-niemals-benutzt.html)

Gloegg_FHBI 2. Jun 2014 08:39

Delphi-Version: 7

Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
 
Hallo DPler,

Ich habe folgende Klasse geschrieben:
Delphi-Quellcode:
type
  IWaitCursor = interface
  end;

  TWaitCursor = class (TInterfacedObject, IWaitCursor)
  private
    fCursor : TCursor;
  public
    constructor Create;
    destructor Destroy; override;
  end;

implementation

constructor TWaitCursor.Create;
begin
  inherited;
  fCursor := Screen.Cursor;
  Screen.Cursor := crHourGlass;
  MainFrom.TrafficLight := tlRed;
end;

destructor TWaitCursor.Destroy;
begin
  Screen.Cursor := fCursor;
  MainFrom.TrafficLight := tlGreen;
  inherited;
end;
Diese Klasse benutze ich um in länger dauernden Prozeduren den Wartecursor anzuzeigen und automatisch den richtigen Cursor wiederherzustellen, nachdem die Prozedur beendet ist.

Nun bekomme ich aber für jede Verwendung einen Hinweis vom Compiler, dass die variable nicht genutzt wird. Kann man das irgendwie für diese Fälle ausschalten?

Delphi-Quellcode:
procedure TMainForm.MyMethod;
var
  cur : IWaitCursor;
begin
  cur := TWaitCursor.Create; // Auf 'cur' zugewiesener Wert wird niemals benutzt
  sleep(1000);
end;

mkinzler 2. Jun 2014 08:42

AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
 
In diesem Fall könnte man ausnahmsweise with verwenden:
Delphi-Quellcode:
with TWaitCursor.Create do
  sleep(1000);

Neutral General 2. Jun 2014 08:52

AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
 
Zitat:

Zitat von mkinzler (Beitrag 1260981)
In diesem Fall könnte man ausnahmsweise with verwenden:
Delphi-Quellcode:
with TWaitCursor.Create do
  sleep(1000);

Muss er ja nicht einmal.

Delphi-Quellcode:
procedure TMainForm.MyMethod;
begin
  TWaitCursor.Create;
  sleep(1000);
end;
Geht auch und produziert keine Warnung. Warum eine Variable anlegen wenn man sie eh nicht verwendet?

Sir Rufo 2. Jun 2014 08:54

AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
 
Zitat:

Zitat von mkinzler (Beitrag 1260981)
In diesem Fall könnte man ausnahmsweise with verwenden:
Delphi-Quellcode:
with TWaitCursor.Create do
  sleep(1000);

Das gibt ein Speicherleck ;)

Zitat:

Zitat von Neutral General (Beitrag 1260982)
Zitat:

Zitat von mkinzler (Beitrag 1260981)
In diesem Fall könnte man ausnahmsweise with verwenden:
Delphi-Quellcode:
with TWaitCursor.Create do
  sleep(1000);

Muss er ja nicht einmal.

Delphi-Quellcode:
procedure TMainForm.MyMethod;
begin
  TWaitCursor.Create;
  sleep(1000);
end;
Geht auch und produziert keine Warnung. Warum eine Variable anlegen wenn man sie eh nicht verwendet?

Aber ebenfalls ein Speicherleck ;)

Neutral General 2. Jun 2014 08:59

AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
 
Stimmt. Dann halt mit Variable und try-finally :mrgreen:

Sir Rufo 2. Jun 2014 09:00

AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
 
Erweitere die Klasse um eine
Delphi-Quellcode:
class function Construct : IWaitCursor;
Delphi-Quellcode:
type
  IWaitCursor = interface
  end;

  TWaitCursor = class (TInterfacedObject, IWaitCursor)
  private
    fCursor : TCursor;
  public
    constructor Create;
    destructor Destroy; override;

    class function Construct : IWaitCursor;
  end;

implementation

class function TWaitCursor.Construct : IWaitCursor;
begin
  Result := TWaitCursor.Create;
end;

constructor TWaitCursor.Create;
begin
  inherited;
  fCursor := Screen.Cursor;
  Screen.Cursor := crHourGlass;
  MainFrom.TrafficLight := tlRed;
end;

destructor TWaitCursor.Destroy;
begin
  Screen.Cursor := fCursor;
  MainFrom.TrafficLight := tlGreen;
  inherited;
end;
dann kann das ohne Speicherleck und Warnung so benutzt werden
Delphi-Quellcode:
procedure Foo;
begin
  TWaitCursor.Construct;
  Sleep( 1000 );
end;
Zitat:

Zitat von Neutral General (Beitrag 1260984)
Stimmt. Dann halt mit Variable und try-finally :mrgreen:

Wieso? ;)

Sir Rufo 2. Jun 2014 09:05

AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
 
Nebenbei bemerkt, ist diese direkte Referenzierung
Delphi-Quellcode:
MainFrom.TrafficLight := tlRed;
natürlich sehr suboptimal. Damit hast du der Klasse eine sehr starke Abhängigkeit gegeben, die man eigentlich vermeiden soll (eigentlich muss).

Das solltest du anders lösen

Sir Rufo 2. Jun 2014 09:40

AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
 
Hier eine Variante ohne diese Abhängigkeiten und Überflüssiges (z.B.
Delphi-Quellcode:
IWaitCursor
) und vor allem auch kaskadierbar
Delphi-Quellcode:
unit WaitCursor;

interface

uses
  System.SysUtils,
  Vcl.Forms,
  Vcl.Controls;

type
  TWaitCursor = class( TInterfacedObject )
  private
    class var [weak] _Instance : TWaitCursor;
    class var _OnShow : TProc;
    class var _OnHide : TProc;
  private
    FCursor : TCursor;
  protected
    constructor Create;
  public
    destructor Destroy; override;

    class function Show : IInterface;
    class property OnShow : TProc read _OnShow write _OnShow;
    class property OnHide : TProc read _OnHide write _OnHide;
  end;

implementation

{ TWaitCursor }

constructor TWaitCursor.Create;
begin
  inherited;
  FCursor := Screen.Cursor;
  Screen.Cursor := crHourGlass;
  if Assigned( _OnShow )
  then
    _OnShow( );
end;

destructor TWaitCursor.Destroy;
begin
  _Instance := nil;
  Screen.Cursor := FCursor;
  if Assigned( _OnHide )
  then
    _OnHide( );
  inherited;
end;

class function TWaitCursor.Show : IInterface;
begin
  if not Assigned( _Instance )
  then
    _Instance := TWaitCursor.Create;
  Result := _Instance;
end;

end.
Beispiel
Delphi-Quellcode:
procedure Foo;
begin
  TWaitCursor.Show;
  Sleep( 1000 );
end;

procedure Bar;
begin
  TWaitCursor.Show;
  Foo;
end;

himitsu 2. Jun 2014 09:44

AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
 
Ja, man kann solche Meldungen deaktivieren, aber mann kann den "Fehler" auch einfach beseitigen. :angel2:

Und am Einfachsten ist es, wenn man die ungenutzte Variable weglässt.
Oder man macht z.B. ein
Delphi-Quellcode:
if cur = nil then ;
dahinter und nutzt die Variable.


Ach ja, die Variable weglassen und den Resultwert "ignorieren" geht nur, wenn diese Funktion nicht deaktiviert ist.
Wobei das eigentlich nicht mehr vorkommen sollte, da es nur ein Kompilerschalter für die Unterstüzung von uraltem Code ist. (Abwärtzkompatibilität)
siehe
Delphi-Quellcode:
{$X+}
/
Delphi-Quellcode:
{$EXTENDEDSYNTAX ON}


Und hier gibt es noch das Problem der impliziten Typumwandlung.
Da man hier ja unbedingt das Interface braucht, müsste man ohne die Variable den Typ manuell in ein Interface umwandeln.
Delphi legt bei Zwischenergebnissen und für nicht verwendete Result-Werte eine lokale Variable an, wobei es hier allerdings den Klassentyp verwendet und nicht das Interface.

Also ich hätte da eine Class-Funktion in TWaitCursor eingebaut, welche das Interface als result liefert, womit man sich die manuellen umwandlungen überall erspart und das nur an einer Stelle macht.
[edit] siehe das Beispiel vor mir.

Union 2. Jun 2014 09:50

AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
 
Im OP steht doch was von Delphi 7. Gab's da schon class vars, functions und properties?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 Uhr.
Seite 1 von 3  1 23      

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