Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Vorteil class function (https://www.delphipraxis.net/116681-vorteil-class-function.html)

Thomas Feichtner 4. Jul 2008 09:33


Vorteil class function
 
Hallo Zusammen.

Ich stoße beim durchforsten immer wieder auf class function.
Welche Vorteile/Nachteile hat es wenn man gewisse funktionen als class function ausführt?
Hier ein Beispiel beim Aufrufen einer Form.

Hier ohne Klassenfunktion
Delphi-Quellcode:
unit unit2;

interface

uses Windows, Buttons, Classes, ComCtrls, Controls, Forms, StdCtrls, ExtCtrls;

type
  TMyForm2 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 
  function ShowMyForm(AOwner: TComponent): TModalResult;

implementation

{$R *.dfm}

function ShowMyForm(AOwner: TComponent): TModalResult;
var
  myForm2: TMyForm2;
begin
  Result := 0;
  try
    myForm := TMyForm2.Create(AOwner);
    Result := myForm.ShowModal;
  finally
    FreeAndNil(myForm);
  end;
end;
und hier mit Klassenfunktion
Delphi-Quellcode:
unit unit1;

interface

uses Windows, Buttons, Classes, ComCtrls, Controls, Forms, StdCtrls, ExtCtrls;

type
  TMyForm = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    class function ShowMyForm(AOwner: TComponent): TModalResult;
  end;

implementation

{$R *.dfm}

class function TLsBaseForm.ShowMyForm(AOwner: TComponent): TModalResult;
var
  myForm: TMyForm;
begin
  Result := 0;
  try
    myForm := Self.Create(AOwner);
    Result := myForm.ShowModal;
  finally
    FreeAndNil(myForm);
  end;
end;
Und hier die Unterschiede beim Aufrufen:
Delphi-Quellcode:
procedure TFrom3.Button1Click(Sender: TObject);
begin
  { ohne Klassenfunktion }
  unit2.ShowMyForm(Self);
  { mit Klassenfunktion }
  unit1.TMyFrom.ShowMyForm(Self);
end;
Danke für eure Antworten

spaxxn 4. Jul 2008 09:37

Re: Vorteil class function
 
Wenn du möchtest, dass Formulare nicht zur Erzeugungszeit miterzeugt werden, sondern du sie erst dann erzeugen möchtest, wenn sie auch angezeigt werden, dann realisiert man das so oder zumindest in der Art.

Das dient in erster Linie dazu, den Speicherverbrauch einer Anwendung nicht unnötig aufzublähen.

Edit: Hatte mich verlesen, der Bezug von dem was ich geschrieben habe zu deiner Frage ist gleich null ;)

Auf DSDT gibt es das dazu

Sherlock 4. Jul 2008 09:40

Re: Vorteil class function
 
Zitat:

Zitat von spaxxn
Wenn du möchtest, dass Formulare nicht zur Erzeugungszeit miterzeugt werden, sondern du sie erst dann erzeugen möchtest, wenn sie auch angezeigt werden, dann realisiert man das so oder zumindest in der Art.

Das ist ja im ersten Moment nicht unbedingt ein Grund.

Die zitierte Aussage ergänzt um: "Funktionen die nicht in der Formularklasse definiert sind, sind bereits vor Erzeugung des Formulars verfügbar."

Macht den sinn vielleicht deutlicher.

Edit @Spaxxn: Ja, das hatte ich mir fast gedacht, und versucht zu retten ;)


Sherlock

taaktaak 4. Jul 2008 09:44

Re: Vorteil class function
 
Wenn ich mich da mal einklinken darf:
Das ist doch aber bereits der Fall, wenn die Funktion als Methode im public-Abschnitt genannt wird - oder? Was erreiche ich mit dem Zusatz "class", das verstehe ich nicht...

Meflin 4. Jul 2008 09:56

Re: Vorteil class function
 
Ganz einfach: eine class procedure kannst du auch dann ausführen, wenn die Klasse noch garnicht instanziert wurde!

Beispielsweise kannst du so eine Formklasse erstellen, die sich bei einem Aufruf von .Show selbst instanziert ;)

taaktaak 4. Jul 2008 10:07

Re: Vorteil class function
 
Ah, interessant! Danke für die Auskunft :hi:

HeinzJ 4. Jul 2008 11:04

Re: Vorteil class function
 
Class Member stehen grundsätzlich auch dann zur Verfügung, wenn die Klasse noch nicht instanziert wurde.

hoika 4. Jul 2008 11:11

Re: Vorteil class function
 
Hallo,

du kannst damit sogar Klassen schreiben,
die nur class methods haben,
quasi "globale" Funktionen, die aber trotzdem schön zu einer Klasse gehören.


Heiko

Thomas Feichtner 4. Jul 2008 12:16

Re: Vorteil class function
 
Zitat:

Zitat von hoika
Hallo,
du kannst damit sogar Klassen schreiben,
die nur class methods haben,
quasi "globale" Funktionen, die aber trotzdem schön zu einer Klasse gehören.

Was bringt mir das wenn ich gewisse Funktionen in einer Klasse habe und nicht einfach eine Funktionssammlung in einer Unit?

Also richtigen Vorteil / Nachteil habe ich noch nicht gelesen oder hab ich grad ein Brett vorm Kopf?

Meflin 4. Jul 2008 12:20

Re: Vorteil class function
 
Zitat:

Zitat von Thomas Feichtner
Was bringt mir das wenn ich gewisse Funktionen in einer Klasse habe und nicht einfach eine Funktionssammlung in einer Unit?

Vorteil wäre hier beispielsweise, dass du Namenskonflikte vermeiden kannst - und zwar zwingendermaßen auch für andere Benutzer deiner Unit.

Beispiel: Du hast eine Unit Foo, mit einer Funktion IntToStr ;)

Klar kannst du jetzt über Foo.IntToStr und SysUtils.IntToStr sicherstellen, dass immer die richtige Version verwendet wird. Aber wenn du dein IntToStr zur class function, sagen wir der Klasse TFooUtils machst, dann muss immer TFooUtils.IntToStr verwendet werden...

Abgesehen davon ist "Vorteil" das falsche Wort: du kannst mit class members eben Dinge machen, die ohne nicht gehen... Aber einen "Vorteil" im eigentlichen Sinne gegenüber herkömmlichen members gibt es wohl nicht!

DeddyH 4. Jul 2008 12:26

Re: Vorteil class function
 
Naja, man kann so schöne OOP-Features wie Vererbung nutzen. Mir fallen da spontan meine seligen Java-Zeiten ein, wo man solche Dinge wie Integer.ToString, Float.ToString etc. nutzen konnte.

Der.Kaktus 4. Jul 2008 12:33

Re: Vorteil class function
 
Zitat:

Zitat von DeddyH
Naja, man kann so schöne OOP-Features wie Vererbung nutzen. Mir fallen da spontan meine seligen Java-Zeiten ein, wo man solche Dinge wie Integer.ToString, Float.ToString etc. nutzen konnte.

[OT] Nicht Java..Bitteeeeeeeeeeeeeee[/OT]

dominikkv 4. Jul 2008 12:47

Re: Vorteil class function
 
Bei class function/procedure darf man dann aber nicht auf die Felder der Klasse zugreifen, weil es die ja noch nicht gibt...
Klassenmethoden gehören nicht zur instanz, sondern zur Klasse selber
Klassenmethoden sind zB der constructor (spezielle Form von Klassenmethode), ClassName und InstanceSize, alle von TObject geerbt.

Thomas Feichtner 4. Jul 2008 12:50

Re: Vorteil class function
 
OK, Danke für eure Infos.

Zitat:

Zitat von Meflin
Klar kannst du jetzt über Foo.IntToStr und SysUtils.IntToStr sicherstellen, dass immer die richtige Version verwendet wird. Aber wenn du dein IntToStr zur class function, sagen wir der Klasse TFooUtils machst, dann muss immer TFooUtils.IntToStr verwendet werden...

An so etwas dachte ich schon.

Apollonius 4. Jul 2008 15:01

Re: Vorteil class function
 
Noch ein Vorteil: Du kannst Klassenmethoden ohne den Zusatz "static" auch an abgeleiteten Klassenreferenzen aufrufen. Wenn du beispielsweise TMyDescendantForm von TMyForm erben lässt, kannst du jetzt TMyDescendantForm.ShowMyForm(nil) schreiben und erhältst tatsächlich ein Formular der neuen Klasse.
Statische Klassenmethoden (diese erhalten keinen Self-Parameter) sind nur verkappte Funktionen - sie dienen nur zur Auflösung von Namenskonflikten und besseren Übersichtlichkeit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 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