![]() |
Delphi-Version: 7
Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
Hallo DPler,
Ich habe folgende Klasse geschrieben:
Delphi-Quellcode:
Diese Klasse benutze ich um in länger dauernden Prozeduren den Wartecursor anzuzeigen und automatisch den richtigen Cursor wiederherzustellen, nachdem die Prozedur beendet ist.
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; 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; |
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); |
AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
Zitat:
Delphi-Quellcode:
Geht auch und produziert keine Warnung. Warum eine Variable anlegen wenn man sie eh nicht verwendet?
procedure TMainForm.MyMethod;
begin TWaitCursor.Create; sleep(1000); end; |
AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
Zitat:
Zitat:
|
AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
Stimmt. Dann halt mit Variable und try-finally :mrgreen:
|
AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
Erweitere die Klasse um eine
Delphi-Quellcode:
class function Construct : IWaitCursor;
Delphi-Quellcode:
dann kann das ohne Speicherleck und Warnung so benutzt werden
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;
Delphi-Quellcode:
procedure Foo;
begin TWaitCursor.Construct; Sleep( 1000 ); end; Zitat:
|
AW: Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
Nebenbei bemerkt, ist diese direkte Referenzierung
Delphi-Quellcode:
natürlich sehr suboptimal. Damit hast du der Klasse eine sehr starke Abhängigkeit gegeben, die man eigentlich vermeiden soll (eigentlich muss).
MainFrom.TrafficLight := tlRed;
Das solltest du anders lösen |
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:
) und vor allem auch kaskadierbar
IWaitCursor
Delphi-Quellcode:
Beispiel
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.
Delphi-Quellcode:
procedure Foo;
begin TWaitCursor.Show; Sleep( 1000 ); end; procedure Bar; begin TWaitCursor.Show; Foo; end; |
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:
dahinter und nutzt die Variable.
if cur = nil then ;
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. |
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 00:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz