AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Class Initialisieren und Terminieren
Thema durchsuchen
Ansicht
Themen-Optionen

Class Initialisieren und Terminieren

Ein Thema von EWeiss · begonnen am 9. Okt 2006 · letzter Beitrag vom 9. Okt 2006
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

Class Initialisieren und Terminieren

  Alt 9. Okt 2006, 11:12
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ß
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Class Initialisieren und Terminieren

  Alt 9. Okt 2006, 11:15
In Delphi musst Du eine Instanz durch Aufruf des constructors erzeugen, bevor Du Methoden aufrufst. Ausnahme sind Klassenmethoden (class function bzw. class procedure).
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

Re: Class Initialisieren und Terminieren

  Alt 9. Okt 2006, 12:09
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ß
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Class Initialisieren und Terminieren

  Alt 9. Okt 2006, 12:20
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;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

Re: Class Initialisieren und Terminieren

  Alt 9. Okt 2006, 12:52
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ß
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

Re: Class Initialisieren und Terminieren

  Alt 9. Okt 2006, 13:07
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:
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!

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.
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ß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#7

Re: Class Initialisieren und Terminieren

  Alt 9. Okt 2006, 13:19
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

Re: Class Initialisieren und Terminieren

  Alt 9. Okt 2006, 13:29
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ß
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#9

Re: Class Initialisieren und Terminieren

  Alt 9. Okt 2006, 14:00
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Class Initialisieren und Terminieren

  Alt 9. Okt 2006, 14:04
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).
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:39 Uhr.
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