AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OOP--> Constructor richtig verwendet???

Ein Thema von Christian18 · begonnen am 4. Jan 2006 · letzter Beitrag vom 4. Jan 2006
Antwort Antwort
Seite 2 von 3     12 3      
Thorben77

Registriert seit: 22. Okt 2004
359 Beiträge
 
#11

Re: OOP--> Constructor richtig verwendet???

  Alt 4. Jan 2006, 13:09
Sind zwar schon 'n paar neue Beiträge da, aber ich schick's trotzdem mal ab .

Mach's so:

Überschreib den Destruktor und geb den Button da frei:

Delphi-Quellcode:
interface

type
  TNavi = class(TObject)
  private
    FButton: TButton;
  public
    constructor(AForm: TForm; ACaptuion: string);
    destructor Destroy; override;
  end;

implementation

constructor TNavi.Create(AForm: TForm; ACaptuion: string);
begin
  inherited Create;
  FButton := TButton.Create(nil);
  FButton.Caption := ACaption;
  FButton.Top := 10;
  FButton.Left := 10;
  FButton.Parent := AForm;
end;

destructor TNavi.Destroy;
begin
  FButton.Free;
  inherited Destroy;
end;

Allerdings musst/solltest Du bei deinem Formular auch irgendwo Navi.Free aufrufen:

Delphi-Quellcode:
unit UMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, UKlassen;

type
  TFMain = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    FNavi: TNavi; // <--- hier ist das jetzt deklariert
  public
    { Public-Deklarationen }
  end;

var
  FMain: TFMain;

implementation

{$R *.dfm}

procedure TFMain.FormCreate(Sender: TObject);
begin
  // Menü erzeugen:
  FNavi := TNavi.Create(Self, 'BlaBlaBlubb');
end;

procedure TFMain.FormDestroy(Sender: TObject);
begin
  // freigeben:
  FNavi.Free;
end;

end.
MfG
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#12

Re: OOP--> Constructor richtig verwendet???

  Alt 4. Jan 2006, 13:19
Zitat von jbg:
Mit der "neuen" Lösung musst du jedem im Team erklären, dass er nach dem Create noch deine Erzeugen Methode aufrufen soll. Vergiss einer das, kannst du dir denken was passiert.
Hallo jbg,

du hast geschriben, dann ich bei der zweiten Lösung anderen Programmierern sagen muß das man noch den Create noch die Methode aufrufen muß.

Ist das würklich so??? Ich habe mir einfach mal eine Delphi Standart Komponente angeschaut. (TOpenDialog) bei der ist es doch auch so wie in meiner zweiten Lösung oder sehe ich das falsch???

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var o : TOpenDialog;
begin
  o:=TOpenDialog.Create(self); --> erzeugen
  if o.Execute then --> aufruf durch Execut
    begin
      ...
    end;
end;
Ist das nicht das gleiche??? Also nochmal welche vorteile hat das ganze denn jetzt für mich wenn ich eine Constructor verwende???

MFG Christian18

PS: Meine Frage zu der Kapselung ist noch offen...
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#13

Re: OOP--> Constructor richtig verwendet???

  Alt 4. Jan 2006, 13:31
Hallo Christian18,

ich bin noch Anfänger, aber wenn ich das mit der Kapselung richtig verstanden habe, bedeutet es, dass die Daten durch die direkte Veränderung von außen "gekapselt" sind. D.h. die Variablen werden unter "private" deklariert und können dann nur durch Methoden des Objekts (z.B. SetXY) verändert werden.

Ich hoffe, ich liege da richtig.

mfg gfjs
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#14

Re: OOP--> Constructor richtig verwendet???

  Alt 4. Jan 2006, 13:34
Zitat von gfjs:
Hallo Christian18,

ich bin noch Anfänger, aber wenn ich das mit der Kapselung richtig verstanden habe, bedeutet es, dass die Daten durch die direkte Veränderung von außen "gekapselt" sind. D.h. die Variablen werden unter "private" deklariert und können dann nur durch Methoden des Objekts (z.B. SetXY) verändert werden.

Ich hoffe, ich liege da richtig.

mfg gfjs
also so wie ich mein erstes bsp. programmiert habe. oder???
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#15

Re: OOP--> Constructor richtig verwendet???

  Alt 4. Jan 2006, 13:47
Hallo, Christian18.

Schaust Du hier: Delphi-Souce

mfg gfjs
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#16

Re: OOP--> Constructor richtig verwendet???

  Alt 4. Jan 2006, 14:15
Zitat von Christian18:
Ist das nicht das gleiche???
Nein, denn dein "Erzeuge" gehört noch zum Initialisieren des Objekts. TOpenDialog.Execute setzt bereits eine vollständig initialisiertes TOpenDialog Instanz voraus.

Zitat:
Also nochmal welche vorteile hat das ganze denn jetzt für mich wenn ich eine Constructor verwende???
  • Jeder versteht deinen Code besser.
  • Du kannst die Vererbung nutzen.
  • Du musst dir nicht bei jedem Objekt überlegen, ob da noch ein "Erzeuge" Aufruf hin muss.

Der Konstruktor heißt nicht um sonst Konstruktor. Er konstruiert das Objekt. Das war schon immer so und wird auch so bleiben. Das man das natürlich anders machen kann ist klar. Nur um den Konstruktor-Aufruf kommt man nicht herum und warum eine andere Programmierweise nutzen, wenn man sowieso den Konstruktor aufrufen muss.
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: OOP--> Constructor richtig verwendet???

  Alt 4. Jan 2006, 14:36
Zitat von Christian18:
Zitat von jbg:
Mit der "neuen" Lösung musst du jedem im Team erklären, dass er nach dem Create noch deine Erzeugen Methode aufrufen soll. Vergiss einer das, kannst du dir denken was passiert.
Hallo jbg,

du hast geschriben, dann ich bei der zweiten Lösung anderen Programmierern sagen muß das man noch den Create noch die Methode aufrufen muß.

Ist das würklich so??? Ich habe mir einfach mal eine Delphi Standart Komponente angeschaut. (TOpenDialog) bei der ist es doch auch so wie in meiner zweiten Lösung oder sehe ich das falsch???

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var o : TOpenDialog;
begin
  o:=TOpenDialog.Create(self); --> erzeugen
  if o.Execute then --> aufruf durch Execut
    begin
      ...
    end;
end;
Ist das nicht das gleiche??? Also nochmal welche vorteile hat das ganze denn jetzt für mich wenn ich eine Constructor verwende???

MFG Christian18

PS: Meine Frage zu der Kapselung ist noch offen...
Hi Christian,

bei dem Beispiel wird der OpenDialog aufgerufen nicht erzeugt.

Deine beiden Sourcen machen genau das gleiche, aber:

du hast eine unit für die Komponente und eine Unit für dein Programm. Für jedesmal wenn du die Komponente nutzen möchtest (du kannst ja mehrere Instanzen erstellen) müsstest du folgendes Schreiben:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
  var n : TNavi;
begin
  n:=TNavi.Create();
  n.Erzeugen(Form1, 'Button');
  n.Free;
end;
Auch wenn du nun nur deine Komponente weitergeben möchtest müsste derjenige der sie nutzen möchte auch noch diesen Source selber schreiben. Dies kann man sich nun sparen, wenn man das einmal deklariert hat. Man hat dann nur noch den Einzeiler
n:=TNavi.Create(FMain, 'Button'); Gerade wenn man viele dieser Objekte hat, spart dies Zeit und ist übersichtlicher sowie weniger Fehleranfällig.

Hoffe geholfen zu haben
Ansgar
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#18

Re: OOP--> Constructor richtig verwendet???

  Alt 4. Jan 2006, 14:46
Hallo,

ich habe hier nochmal ein drittest bsp. sollte man bei jeder klasse die man erzeugt einen constructor haben???

bsp.:

Delphi-Quellcode:
unit UKlassen;

interface

uses
  Forms, StdCtrls;

type
  TFenster = class
    constructor Create(Sender: TObject);
  private

  public

  end;

type
  TNavi = class
    constructor Create(f : TForm; c : Array of String);
    destructor Destroy();
  private
    b : TButton; // Button für die Navigationsleiste
    w : TFenster; // Fenster
  public

  end;

implementation

constructor TFenster.Create(Sender: TObject);
  var f : TForm;
begin
  f:=TForm.Create(nil);
  f.Caption:=TButton(Sender).Caption;
  f.ClientWidth:=240;
  f.ClientHeight:=320;
  f.BorderStyle:=bsSingle;
  f.BorderIcons:=[biSystemMenu,biMinimize];
  f.Font.Name:='Arial';
  f.KeyPreview:=True;
  f.Position:=poScreenCenter;
  f.ShowModal;
end;

constructor TNavi.Create(f : TForm; c : Array of String);
  var i : Integer; // Schleifenvariable
begin
  for i:=0 to Length(c) - 1 do
    begin
      b:=TButton.Create(nil);
      b.Caption:=c[i];
      b.Width:=200;
      b.Height:=30;
      b.Top:=10 + i * 40;
      b.Left:=f.Width div 2 - b.Width div 2;
      b.OnClick:=TFenster.Create;
      b.Parent:=f;
    end;
end;

destructor TNavi.Destroy();
begin
  b.Destroy;
end;

end.
--> das bsp. funktioniert aber leider nicht. habe versucht den button ein onclik ereigniss zuzuweisen das ereigniss besteht aus den constructor. das kann man wohl nicht machen oder??? wie würdet ihr das denn machen, wenn das ereigniss in eine anderen klasse soll.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#19

Re: OOP--> Constructor richtig verwendet???

  Alt 4. Jan 2006, 15:12
Wer war denn dein Delphi-Lehrer? Denn normalerweise kommt man auf sochen "Unsinn" nicht von alleine.

Ein Konstruktor kann nicht als Methodenzeiger verwendet werden. Und soeinen brauchst du für das OnClick. Du musst also eine TNotifyEvent kompatible Methode zu deiner Klasse hinzufügen und diese dann dem OnClick-Ereignis zuweisen.
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#20

Re: OOP--> Constructor richtig verwendet???

  Alt 4. Jan 2006, 15:14
Zitat von jbg:
Wer war denn dein Delphi-Lehrer? Denn normalerweise kommt man auf sochen "Unsinn" nicht von alleine.

Ein Konstruktor kann nicht als Methodenzeiger verwendet werden. Und soeinen brauchst du für das OnClick. Du musst also eine TNotifyEvent kompatible Methode zu deiner Klasse hinzufügen und diese dann dem OnClick-Ereignis zuweisen.
ja ich weiß, dann hat die klasse TFenster aber keinen constructor. ist das auch möglich das eine klasse keinen constructor hat???

mfg christian18
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 10:29 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