![]() |
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:
Auf AddWindow kann jetzt von außen zugegriffen werden.
interface
type cMagnetic = class private public function AddWindow(Handle: Long; hWndParent: Integer = 0): Boolean; end; 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:
wie verhält sich das in Delphi ist so etwas machbar ?
Private Sub Class_Initialize()
..... End Sub Private Sub Class_Terminate() ..... End Sub gruß |
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).
|
Re: Class Initialisieren und Terminieren
Zitat:
Vielleicht eine kleine zeile code ? :) gruß |
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; |
Re: Class Initialisieren und Terminieren
Zitat:
Dachte nur weil Class = C :) gruß |
Re: Class Initialisieren und Terminieren
Habs mal versucht umzusetzen!
Delphi-Quellcode:
Magnetic.create gibt aber einen fehler aus!
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; Fehlt da eine overload function ? Habe das gefühl das meine umsetzung nicht ganz richtig ist.. Edit:
Delphi-Quellcode:
Gut gemeint aber das geht nicht!
Magnetic.AddWindow(GetDesktopWindow, Self.handle);
Das Projekt ist eine classe welche von außen aufgerufen wird Der Functionsaufruf wäre dieser!
Delphi-Quellcode:
Öffnest du nun ein neues Window(Fenster)
Magnetic.AddWindow(frmMain.Handle); // Ist die Hauptform deiner Anwendung
Dann kannst du zu deiner Hauptform das ParentWindow dieses Fenster addieren.
Delphi-Quellcode:
Das ergebnis wäre.
Magnetic.AddWindow(frmMain.Handle, frmTest.Handle);
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ß |
Re: Class Initialisieren und Terminieren
Delphi-Quellcode:
und das terminate paßt in den destructor ... siehe OH ^^
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; ... Das war nur ein Beispiel, wie man die Klasse verwendet (erzeigt und freigibt):
Delphi-Quellcode:
try-finally ist nur der Resourcenschutzblock ... damit selbst bei 'ner Exception das Objekt wieder per FREE freigegeben wird.
var
Magnetic : TMagnetic; begin Magnetic := TMagnetic.Create; // objektreferenz erzeugen Magnetic.AddWindow(GetDesktopWindow, Self.handle); // irgendwas machen ... Magnetic.Free; // objekt freigeben end; |
Re: Class Initialisieren und Terminieren
Zitat:
Mache wohl besser mal einen neuen Thread auf da es hier um die übersetzung meiner Magnetic Classe geht! gruß |
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 |
Re: Class Initialisieren und Terminieren
Zitat:
@EWeiss:
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
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).
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:39 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