AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Hinweis unterdrücken "Auf x zugewiesener Wert wird niemals benutzt"
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Gloegg_FHBI · begonnen am 2. Jun 2014 · letzter Beitrag vom 4. Jun 2014
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

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

  Alt 2. Jun 2014, 08:54
In diesem Fall könnte man ausnahmsweise with verwenden:
Delphi-Quellcode:
with TWaitCursor.Create do
  sleep(1000);
Das gibt ein Speicherleck

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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 2. Jun 2014 um 08:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

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

  Alt 2. Jun 2014, 08:59
Stimmt. Dann halt mit Variable und try-finally
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 2. Jun 2014, 09:00
Erweitere die Klasse um eine 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;
Stimmt. Dann halt mit Variable und try-finally
Wieso?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

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

  Alt 2. Jun 2014, 09:05
Nebenbei bemerkt, ist diese direkte Referenzierung 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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

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

  Alt 2. Jun 2014, 09:40
Hier eine Variante ohne diese Abhängigkeiten und Überflüssiges (z.B. 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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 2. Jun 2014 um 09:43 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

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

  Alt 2. Jun 2014, 10:08
Weniger zur Technik, sondern zur Philosophie:

Hier eine Variante ohne diese Abhängigkeiten und Überflüssiges (z.B. IWaitCursor ) und vor allem auch kaskadierbar
Kritik soll es nicht sein (ist ja technisch einwandfrei, Daumen hoch auf für das [weak] !), aber ich finde grade bei Dingen wie etwas, das in seinem Konstruktor und Destruktor aktiv das Gesamtbild des Systems verändert es nicht angebracht, das automatisch ablaufen zu lassen wenn es out of scope geht.

Habe ich ein
Delphi-Quellcode:
procedure aufwändigeAufgabe();
begin
   // Schritt 1
   TWaitCursor.Show();
   doStuff();
   doEvenMoreStuff();
   
   // Schritt 2
   transferMoney();
   logStuff();
end;
und jemand spaltet mir das, ohne es besser zu wissen in
Delphi-Quellcode:
procedure aufwändigeAufgabe();
begin
   schritt1();
   schritt2();
end;

procedure schritt1();
begin
   TWaitCursor.Show();
   doStuff();
   doEvenMoreStuff();
end;

[...]
auf, ist das Stundenglas nur noch für Schritt 1 zu sehen. Ja, hätte Refactor-Man es richtig gemacht, hätte er es in aufwändigeAufgabe() gelassen. Aber ich finde den Fehler kann man zu einfach machen.


Ich packe gerne Dinge wie eine lokale TStringList in eine interface-referenzierte Tonne um mir den try..finally-Block für das Aufräumen zu sparen, aber grade im Fall mit dem Cursor wäre mein persönlicher Geschmack wirklich weiterhin ein waschechter try..finally-Block. Da sieht man auch auf den ersten Blick was man hat- Ohne zu wissen, was sich hinter den TWaitCursor -Kulissen abspielt.

Geändert von Der schöne Günther ( 2. Jun 2014 um 10:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:59 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