Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi unterkategorie bei einer prozedur (https://www.delphipraxis.net/62988-unterkategorie-bei-einer-prozedur.html)

Amo 12. Feb 2006 14:06


unterkategorie bei einer prozedur
 
Also, ich habe mir eine Komponente gemacht, die ich eben aufs formular ziehen kann. Diese hat nun einige funktionen und prozeduren. Bis dahin kein problem, funktioniert auch alles prima. Nur jetzt habe ich so 15 weitere prozeduren eingefügt, die alle eigentlich zusammengehören.
Jetzt das problem ;):
Was muss ich machen um diese prozeduren so aufzurufen später:
Delphi-Quellcode:
MyComponent.Sammlung.NummerEins
Ich komme nicht weiter als "MyComponent.Sammlung" . Was muss ich machen um bei Sammlung "weiterzukommen"?

idontwantaname 12. Feb 2006 14:23

Re: unterkategorie bei einer prozedur
 
so wie du das meinst, funktioniert das nicht, du müsstest ein unterobjekt erstellen, und dieses als feld des hauptobjektes angeben, das unterobjekt beinhaltet dann die proceduren
Delphi-Quellcode:
type
  TUnterObjekt = class(TObject)
  public
    procedure Dings1;
  end;

  TOberObjekt = class(TObject)
  public
    Sammlung: TUnterObjekt;
  end;
nur nicht vergessen, dass Unterobjekt im OnCreate des OberObjektes zu erzeuchen ;)


Aber ob diese variante so sinnvoll ist ?? :?

Amo 12. Feb 2006 14:37

Re: unterkategorie bei einer prozedur
 
Und wie mache ich das mit dem create jetzt? das hier geht schon mal nicht:
Delphi-Quellcode:
procedure TOberObjekt.OnCreate;
begin
  create TUnterObjekt;
end;

mkinzler 12. Feb 2006 14:39

Re: unterkategorie bei einer prozedur
 
Delphi-Quellcode:
type
  TUnterObjekt = class(TObject)
  public
    procedure Dings1;
  end;

  TOberObjekt = class(TObject)
  public
    constructor create;
    Sammlung: TUnterObjekt;
  end;
constructor TOberObjekt.Create;
begin
   sammlung := TUnterObjekt.Create;
end;
[Edit:] constructor sollte natürlich auch definiet werden[/Edit]

Amo 12. Feb 2006 14:50

Re: unterkategorie bei einer prozedur
 
"Incompatible types: 'TUnterObjekt' and 'Class Reference'"

und ich musste "constructor create" nach "Sammlung: TUnterObjekt" setzen, gab sonst noch mehr fehler..

mkinzler 12. Feb 2006 15:04

Re: unterkategorie bei einer prozedur
 
Ich habe den Code mal in Delphi getestet, bei mir funktionier er ( bis auf die Tatsache das, wie du erwähnt hast der Konstruktor nach den Eigenschaften deklariert werden muss).

Poste mal den gesamten Code.

Amo 12. Feb 2006 15:38

Re: unterkategorie bei einer prozedur
 
Also ich habe gerade gemerkt was ich falsch gemacht hatte (ich hatte ".create" vergessen).
Also DAS problem wäre gelöst...jetzt gibt es aber noch mehr schwierigkeiten. :(

Normalerweise habe ich dann die prozeduren (weiter unten im code) so aufgerufen und eben gesagt was die machen sollen: (die Unit heißt Amo)
Delphi-Quellcode:
procedure TAmo.BlaBlaBla;
begin
  //alles was die prozedur machen soll
end;
Das geht ja jetzt nicht mehr, wenn DIESE prozedur zur "Sammlung" gehört. Also
- procedure TAmo.Sammlung.BlaBlaBla;
- procedure Sammlung.BlaBlaBla;
- procedure TSammlung.BlaBlaBla;
- procedure BlaBlaBla;
gehen alle nicht. Wie mache ich das denn hier?

mkinzler 12. Feb 2006 15:48

Re: unterkategorie bei einer prozedur
 
Die Methode gehört dann in die (Unter-)Klasse. Da ich nicht weiß, wie die Unterklasse heißt nehme ich mal an sie heiße TSammlung dann müsste das Ganze so gemacht werden:
Delphi-Quellcode:
type
  TSammlung = class
    procedure BlaBlaBla;
  end;

  TAmo = class
  public
    Sammlung: TSammlung;
    constructor Create;
  end;

...
var
   Amo: TAmo;
...
implementation
...
constructor TAmo.Create;
begin
    Sammlung := TSammlung.Create;
    ...
end;

procedure TSammlung.BlaBlaBla;
begin
...
nun kannst du sie mit
Delphi-Quellcode:
Amo.Sammlung.Blablabla;
aufrufen

Amo 12. Feb 2006 16:05

Re: unterkategorie bei einer prozedur
 
Guuut, das geht jetzt auch :-) *freu*

Jetzt wieder zum nächsten Problem.. :?

Delphi-Quellcode:
procedure TSammlung.BlaBlaBla;
begin
  AndereProzedur; // hier geht es wieder nicht
end;
"AndereProzedur" soll wie ihr seht in TSammlung.BlaBlaBla ausgeführt werden. "AndereProzedur" wurde in TAmo deklariert. Das geht jetzt also nicht. Wenn ich anstelle von "AndereProzedur" jetzt "TAmo.AndereProzedur" eingebe will er das auch nicht ("This form of method call only allowed for class methods").
Was jetzt?

mkinzler 12. Feb 2006 16:22

Re: unterkategorie bei einer prozedur
 
Du musst dem Unterobjekt eine Referenz auf seinen Eigentümer mitgeben.
1. Dazu mußt du die Klasse um eine Eigenschaft Owner erweitern.
2. Erstellen eines Konstruktor der diese Eigenschaft setzt.
3. Ändern des Konstruktors der Oberklasse.

Khabarakh 12. Feb 2006 16:24

Re: unterkategorie bei einer prozedur
 
Damit benötigst du aber auch eine Forward-Deklaration einer der zwei Klassen. Wenn diese aber wirklich so verzahnt sind, macht es wenig Sinn, sie zu trennen.

Amo 12. Feb 2006 16:29

Re: unterkategorie bei einer prozedur
 
Könnte mir bitte einer zeigen wie das geht? :oops:
Also wo ich was ändern muss

mkinzler 12. Feb 2006 16:42

Re: unterkategorie bei einer prozedur
 
Delphi-Quellcode:
type

   TAmo = class; //forward Deklaration;

  TSammlung = class
    Owner: TObject;
    procedure BlaBlaBla;
  end;

  TAmo = class
  public
    Sammlung: TSammlung;
    constructor Create;
  end;

...
var
   Amo: TAmo;
...
implementation
...
constructor TAmo.Create;
begin
    Sammlung := TSammlung.Create( self);
    ...
end;

constructor TSammlung.Create(AOwner: TObject);
begin
    Owner := AOwner;
end;

procedure TSammlung.BlaBlaBla;
begin
...

Waldteufel 12. Feb 2006 17:10

Re: unterkategorie bei einer prozedur
 
Hi. :hi:

Ich hätte mal eine Zwischenfrage.
Warum gruppierst du die Methoden eigentlich? Der Aufwand steht doch imho in keinem Verhältnis zum Nutzen.

Amo 12. Feb 2006 19:00

Re: unterkategorie bei einer prozedur
 
Also da hast du echt recht. Ich habe einfach nicht gewusst wieviel aufwand es ist und, tja...

Naja, ich habe jetzt das problem so gelöst: ich habe diese prozedur, die in blablabla aufgerufen wird einfach unter Sammlung deklariert und es geht!

Vielen vielen dank für die Hilfe!! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:12 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 by Thomas Breitkreuz