Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Class Initialisieren und Terminieren (https://www.delphipraxis.net/78678-class-initialisieren-und-terminieren.html)

EWeiss 9. Okt 2006 11:12


Class Initialisieren und Terminieren
 
Bin meine Classe am übersetzen.
Nun tritt folgende Frage auf.

Wie werden Classen in Delphi generell von außen angesprochen bzw..
Initialisieren die sich selbst?

Delphi-Quellcode:
interface

type cMagnetic = class

   private

   public
    function AddWindow(Handle: Long; hWndParent: Integer = 0): Boolean;

end;
Auf AddWindow kann jetzt von außen zugegriffen werden.
Bei Privat ist klar. Kommen proceduren und functionen rein welche nur intern
von der Classe selbst verwendet werden.

In vb wird ja eine Classe automatisch Initialisiert sobald irgendeine Funktion aufgerufen wird.

Code:
Private Sub Class_Initialize()
   
.....
End Sub

Private Sub Class_Terminate()
   
.....
End Sub
wie verhält sich das in Delphi ist so etwas machbar ?

gruß

Union 9. Okt 2006 11:15

Re: Class Initialisieren und Terminieren
 
In Delphi musst Du eine Instanz durch Aufruf des constructors erzeugen, bevor Du Methoden aufrufst. Ausnahme sind Klassenmethoden (class function bzw. class procedure).

EWeiss 9. Okt 2006 12:09

Re: Class Initialisieren und Terminieren
 
Zitat:

Zitat von Union
In Delphi musst Du eine Instanz durch Aufruf des constructors erzeugen, bevor Du Methoden aufrufst. Ausnahme sind Klassenmethoden (class function bzw. class procedure).

Das heißt .. Sorry Mache mich gerade erst so richtig mit der Sprache bekannt.
Vielleicht eine kleine zeile code ? :)

gruß

Union 9. Okt 2006 12:20

Re: Class Initialisieren und Terminieren
 
Delphi-Quellcode:
var
   Magnetic : CMagnetic; // Man sollte für Typdeklaratationen überigens besser "T" verwenden
begin
   Magnetic := CMagnetic.Create;
   try
      Magnetic.AddWindow(GetDesktopWindow, Self.handle);
   finally
      Magnetic.Free;
   end;
end;

EWeiss 9. Okt 2006 12:52

Re: Class Initialisieren und Terminieren
 
Zitat:

Zitat von Union
Delphi-Quellcode:
var
   Magnetic : CMagnetic; // Man sollte für Typdeklaratationen überigens besser "T" verwenden
begin
   Magnetic := CMagnetic.Create;
   try
      Magnetic.AddWindow(GetDesktopWindow, Self.handle);
   finally
      Magnetic.Free;
   end;
end;

werd es sofort ändern..
Dachte nur weil Class = C :)

gruß

EWeiss 9. Okt 2006 13:07

Re: Class Initialisieren und Terminieren
 
Habs mal versucht umzusetzen!

Delphi-Quellcode:
implementation

constructor
var
   Magnetic : TMagnetic; // Man sollte für Typdeklaratationen überigens besser "T" verwenden
begin
   Magnetic := Magnetic.create;
   try
      Magnetic.Class_Initialize);
   finally
      Magnetic.Class_Terminate;
   end;
end;

procedure Class_Initialize;
begin
    // Default snap width
    m_lSnapWidth := 10;

    // Initialize array (handled windows info)
    ReDim m_uWndInfo(0): WND_INFO;
    m_lWndCount := 0;
End;

procedure Class_Terminate;
begin
    // Stop subclassing
    If (m_lWndCount) Then
        Subclass_StopAll;

End;
Magnetic.create gibt aber einen fehler aus!
Fehlt da eine overload function ?

Habe das gefühl das meine umsetzung nicht ganz richtig ist..

Edit:
Delphi-Quellcode:
Magnetic.AddWindow(GetDesktopWindow, Self.handle);
Gut gemeint aber das geht nicht!
Das Projekt ist eine classe welche von außen aufgerufen wird

Der Functionsaufruf wäre dieser!

Delphi-Quellcode:
Magnetic.AddWindow(frmMain.Handle); // Ist die Hauptform deiner Anwendung
Öffnest du nun ein neues Window(Fenster)

Dann kannst du zu deiner Hauptform das ParentWindow dieses Fenster addieren.
Delphi-Quellcode:
Magnetic.AddWindow(frmMain.Handle, frmTest.Handle);
Das ergebnis wäre.
Wird dein Hauptfenster in die nähe des Test Fenster geschoben dann dockt dieses daran an.
Verschiebst du nun das Hauptfenster wird das TestFenster mitgezogen.
Die Position wo es andockt ist egal!

Diese Klasse macht genau das was Winamp macht wenn dort Fenster andocken.
Es können xBeliebige Fenster zur Hauptform addiert werden.

gruß

himitsu 9. Okt 2006 13:19

Re: Class Initialisieren und Terminieren
 
Delphi-Quellcode:
type cMagnetic = class
   constructor Create;
   public
     function AddWindow(Handle: Long; hWndParent: Integer = 0): Boolean;
end;

implementation

constructor TMagnetic.create;
begin
  // Default snap width
  m_lSnapWidth := 10;

  // Initialize array (handled windows info)
  ReDim m_uWndInfo(0): WND_INFO;
  m_lWndCount := 0;
end;

...
und das terminate paßt in den destructor ... siehe OH ^^


Das war nur ein Beispiel, wie man die Klasse verwendet (erzeigt und freigibt):
Delphi-Quellcode:
var
   Magnetic : TMagnetic;
begin
   Magnetic := TMagnetic.Create; // objektreferenz erzeugen
   Magnetic.AddWindow(GetDesktopWindow, Self.handle); // irgendwas machen
   ...
   Magnetic.Free; // objekt freigeben
end;
try-finally ist nur der Resourcenschutzblock ... damit selbst bei 'ner Exception das Objekt wieder per FREE freigegeben wird.

EWeiss 9. Okt 2006 13:29

Re: Class Initialisieren und Terminieren
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
type cMagnetic = class
   constructor Create;
   public
     function AddWindow(Handle: Long; hWndParent: Integer = 0): Boolean;
end;

implementation

constructor TMagnetic.create;
begin
  // Default snap width
  m_lSnapWidth := 10;

  // Initialize array (handled windows info)
  ReDim m_uWndInfo(0): WND_INFO;
  m_lWndCount := 0;
end;

...
und das terminate paßt in den destructor ... siehe OH ^^


Das war nur ein Beispiel, wie man die Klasse verwendet (erzeigt und freigibt):
Delphi-Quellcode:
var
   Magnetic : TMagnetic;
begin
   Magnetic := TMagnetic.Create; // objektreferenz erzeugen
   Magnetic.AddWindow(GetDesktopWindow, Self.handle); // irgendwas machen
   ...
   Magnetic.Free; // objekt freigeben
end;
try-finally ist nur der Resourcenschutzblock ... damit selbst fei 'ner Exception das Objekt wieder per FREE freigegeben wird.

Super Danke für deine mühe!
Mache wohl besser mal einen neuen Thread auf da es hier um die übersetzung meiner Magnetic Classe geht!

gruß

r2c2 9. Okt 2006 14:00

Re: Class Initialisieren und Terminieren
 
Nach dem beginn im contructor gehört noch n inherited Create... In dem Fall isses zwar nicht so wichtig, man sollte es sich trotzdem angewöhnen...

Guck dir am besten mal n OOP-Tutorial an... Dann klären sich manche Fragen ganz von selbst...

mfg

Christian

Muetze1 9. Okt 2006 14:04

Re: Class Initialisieren und Terminieren
 
Zitat:

Zitat von r2c2
Nach dem beginn im contructor gehört noch n inherited Create... In dem Fall isses zwar nicht so wichtig, man sollte es sich trotzdem angewöhnen...

Wieso denn dies? Wir haben schliesslich keinen Constructor überschrieben - schon allein, da keiner virtuell ist...

@EWeiss:
Delphi-Quellcode:
implementation

var
   Magnetic : TMagnetic;
begin
   Magnetic := TMagnetic.create;  // <- TMagnetic - hier beim Constructor immer die Klasse angeben - die Variable mit der Instanz (Magnetic) ist ja noch nicht gefüllt!
   try
      Magnetic.Class_Initialize;  // klar, kein Problem so - also Class_Initialize als Methode. Du könntest die Initialisierung aber auch im Constructor erledigen
   finally
      Magnetic.Free;   // du willst hier doch die Klasse freigeben. Dies geschieht durch den Destructor und der wird im Normalfall über Free aufgerufen.
   end;
end;

  // Das sind so normale Proceduren gewesen, du willst aber Methoden machen. Daher: TMagnetic. davor. Sprich: Schreibe den Klassennamen mit einem Punkt davor und du erhälst eine Methode.
  // Ansonsten: Diese Anweisungen kannst du auch in den Constructor übertragen
procedure TMagnetic.Class_Initialize;
begin
    // Default snap width
    m_lSnapWidth := 10;

    // Initialize array (handled windows info)
    ReDim m_uWndInfo(0): WND_INFO;
    m_lWndCount := 0;
End;

  // wie oben beschrieben mal als Destructor ausgelegt und nicht mehr als eigene Methode (Class_Terminate)
Destructor TMagnetic.Destroy;
begin
    // Stop subclassing
    If (m_lWndCount) Then
        Subclass_StopAll;

  Inherited;
End;
Nochwas als Tipp: Du hast doch die Architect Version von delphi, daher nutze doch die Code-Vervollständigung. Sprich: Schreibe oben doch einfach mal das Klassen Grundgerüst im Interface Abschnitt:

Delphi-Quellcode:
Type
  TMagnetic = Class
  Private
    m_lSnapWidth: Integer;
    m_uWndInfo: Array Of WND_Info;
    m_lWndCount: Integer;           // wirklich nötig? Die Länge des dynamisches Arrays kann man in Delphi jederzeit abfragen...
  Public
    Constructor Create;
    Destructor Destroy; Override;

  End;
So, wenn du nun dich mit dem Cursor in die Zeile des Constructor's oder Destructor's stellst und dann STRG-SHIFT-C drückst, dann sollte Delphi dir die ganzen Methoden vervollständigen und im Implementation Teil ordentlich einfügen (mit dem TMagnetic vor dem Methodennamen).


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:05 Uhr.
Seite 1 von 2  1 2      

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