Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Konstruktor wird nicht erkannt (https://www.delphipraxis.net/46398-konstruktor-wird-nicht-erkannt.html)

DGL-luke 24. Mai 2005 13:18


Konstruktor wird nicht erkannt
 
Ich bin gerade dabei eine "Komponente" zuu entwickeln.

hier der public Abschnitt:

Delphi-Quellcode:
 public
   constructor Create(Parent:TCanvas); override;
   destructor Destroy; override;

   procedure Paint;
   procedure StepIt;
Die Implementation des Konstruktors:

Delphi-Quellcode:
constructor TCanvasBar.Create(Parent:TCanvas);
begin
 inherited;
  fFont:=TFont.Create;
  fMin:=0;
  fMax:=100;
  fStep:=1;
  self.Parent:=Parent;
end;
und das onformcreate der testform:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
bar:=TCanvasbar.create(Form1.Canvas);
end;
hier bekomme ich den Fehler:
Delphi-Quellcode:
[Fehler] Unit1.pas(34): E2076 Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt
Was mache ich also falsch??

Kroko1999 24. Mai 2005 13:20

Re: Konstruktor wird nicht erkannt
 
Create (AOwner: TComponent) muss bleiben

Du musst Canvas anders übergeben!

DGL-luke 24. Mai 2005 13:27

Re: Konstruktor wird nicht erkannt
 
ach so ist das...

und soll ich dann den AOwner inerhalb des Konstruktors einfach wegschmeissen? oder gibts da was sinnvolles dafür? bzw. wie kann ich der übergebenen Komponente sagen, dass sie jetzt ein neues Child bekommt?

Airblader 24. Mai 2005 13:34

Re: Konstruktor wird nicht erkannt
 
Bei den DelphiX Komponenten wurde sowas gelöst, indem du einfach eine Eigenschaft der Komponente addest.
Diese ist z.B. mit dem Namen "SrcCanvas" benannt und enthält eine Liste aller im Projekt enthaltener Canvas'e (Canven? :mrgreen: )

air
P.S.: *kleinlaut frag* was bedeutet eig. inherited?

Bernhard Geyer 24. Mai 2005 13:37

Re: Konstruktor wird nicht erkannt
 
Zitat:

Zitat von DGL-luke
ach so ist das...

und soll ich dann den AOwner inerhalb des Konstruktors einfach wegschmeissen? oder gibts da was sinnvolles dafür? bzw. wie kann ich der übergebenen Komponente sagen, dass sie jetzt ein neues Child bekommt?

Du mußt zwischen Owner (Besitzer der Komponente, räumt auch die Komponente wieder auf, wenn sie freigegeben wird. Der Owner ist in der Regel das Formular für Komponenten) und Parent (in welchen Control wird das Control dargestellt (mit berücksichtigung von Sichtbarkeit, verschiebung der Position).

AOwner wird dem Basis-Konstruktor übergeben, so das dieser sich in die Verwaltungsliste von AOwner eintragen kann.
Normalerweise wird ein Control so angelegt

Delphi-Quellcode:
MyControl := TMyControl.Create(self); // self = Formular, Sorgt für Freigabe, wenn man es nicht selbst erledigt
MyControl.Left := 100;                // 100 Pixel von Linken Rand des parent-Controls
MyControl.Parent := ParentPanel;      // Control ist Windows-Technisch unterhalb des ParentPanel angeordnet

DGL-luke 24. Mai 2005 15:29

Re: Konstruktor wird nicht erkannt
 
ja, das mit dem unterschied zwischen owner und parent ist mir klar.

@Airblader: inherited ruft die nächstältere methode auf, also TObject.Create.

Herrgott nochmla jetzt updatet das nicht... *dcu löscht* *dcu nicht findet* *neues projekt macht* *immer noch nicht geht*

Wo ist die verdammte dcu jetzt hin? wie bring ich die unit zum updaten?

EDIT: Du sollst nicht die gleiche Unit zwei mal auf deinem System haben....

Jetzt hab ich aber folgendes problem: Ich habe bisher von TObject abgeleitet. damit sagt er, dass ich create nicht überschreiben kann.
geht das in ordnung? oder muss ich komplett von TComponent ableiten(was weitere Probleme macht)

inzwischen mekckert er gerade:

Delphi-Quellcode:
[Fehler] U_CanvasBar.pas(8): E2217 Published-Feld 'fPosition' ist weder vom Typ class noch interface

Airblader 24. Mai 2005 15:34

Re: Konstruktor wird nicht erkannt
 
Zitat:

Zitat von DGL-luke
@Airblader: inherited ruft die nächstältere methode auf, also TObject.Create.

Sorry wenn ich nochmal nachhake:
Also praktisch von dem, wovon man ableitet?
Gut, aber was bringt das? :oops:

DGL-luke 24. Mai 2005 15:37

Re: Konstruktor wird nicht erkannt
 
na dass man nicht die alte methode, wenn sie schon eine implementation hat, wieder komplett hinschreiben muss.

könntet ihr euch bitte mal mein oberes editiertes ansehen?
Funktioniert wunderbar(es fehlte ein private)! Hey, ich hab gerade meine erste funktionierende Komponente geschrieben! Dass ich das noch erleben darf....

Airblader 24. Mai 2005 15:44

Re: Konstruktor wird nicht erkannt
 
Zitat:

Zitat von DGL-luke
na dass man nicht die alte methode, wenn sie schon eine implementation hat, wieder komplett hinschreiben muss.

Ah..nochmal zum Verständnis.
inherited ist praktisch nur ein Platzhalter dafür, dass alles, was in der Ursprungskompo (bzw. Ursprungsklasse) in der Prozedur stand, wieder übernommen wird? Und schon wieder ein Stückchen schlauer :stupid:

mirage228 24. Mai 2005 15:44

Re: Konstruktor wird nicht erkannt
 
Zitat:

Zitat von Airblader
Zitat:

Zitat von DGL-luke
@Airblader: inherited ruft die nächstältere methode auf, also TObject.Create.

Sorry wenn ich nochmal nachhake:
Also praktisch von dem, wovon man ableitet?
Gut, aber was bringt das? :oops:

Das kann Dir erstens Tipparbeit ersparen (wenn eine abgeleite Klasse einen Konstrutktor mit ein paar mehr Parametern hat, dann kann man inherited Create(...) die bereits bekannten Felder auch mit dem übgeordneten Konstruktor aufrufen lassen).
Und Du kannst einfacher eine Klasse in deine Klassenhierarchie "zwischenschalten".

mfG
mirage228

DGL-luke 24. Mai 2005 16:00

Re: Konstruktor wird nicht erkannt
 
so jetzt hab ich noch ein kleines problem, für das ich keinen neuen thread aufmach: wie mach ich canvas.textout transparent, sprich canvas.brush.color? clNone ist ja weiss, und cltransparent gibt es nicht....

dizzy 24. Mai 2005 18:27

Re: Konstruktor wird nicht erkannt
 
Brush.Style := bsNone;
\\€dit: Oder wars bsClear? :gruebel: Die OH weiss das genauer ;)

DGL-luke 24. Mai 2005 19:24

Re: Konstruktor wird nicht erkannt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Die OH von D2005 half mir da nicht weiter. siehe anhang :evil:

aber eine API-Funktion namens

Delphi-Quellcode:
SetBKMode(parent.Handle,TRANSPARENT);
hat mir dan weitergeholfen.

dizzy 25. Mai 2005 01:58

Re: Konstruktor wird nicht erkannt
 
Zitat:

Zitat von DGL-luke
Die OH von D2005 half mir da nicht weiter. siehe anhang :evil:

Nimm die Tomaten ab. Da steht laut und deutlich bsClear mit drin :roll: ;)

DGL-luke 25. Mai 2005 09:19

Re: Konstruktor wird nicht erkannt
 
schon klar dass es drinsteht. aber soviel ich weiss, ist das eine tabelle mit 2 spalten. sprich erst der wert und dann die erklärung zum wert.
und das ganze zwei mal nebeneinander. allerdings fehlt die beschreibung einfach.

oder willst du mir weismachen, dass der wert bsSolid das Muster bsCross ergibt?


Die frage des Threads is auf jeden Fall beantwortet. Wenn also jemand dem Konstruktor noch irgendwas hinzuzufügen hat, soll er das tun, aber die transparenz war nur ein kurzer OT-Abstecher. punkt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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