![]() |
Create überschreiben (newbefrage)
hallo!
ich weiß, eine newbe frage :-D ich versuche gerade folgendes zu realisieren: ein formular soll abhängig von dem in mode übergebenen style / erscheinungsbild angezeigt werden. soll also folgendes machen:
Delphi-Quellcode:
und wenn nichts angegeben wird für mode, dann soll es einfach den standard nehmen also
mywindow := window.create(self, Mode);
Delphi-Quellcode:
bewirkt das gleiche wie
mywindow := window.create(self);
Delphi-Quellcode:
wobei Mode z.b. von einer anderen anwendung oder in meinem fall halt mal per editbox vorgegeben wird.
mywindow := window.create(self, default);
muss ich da nun die create überschreiben oder die formcreate? und wie schaut das dann im code genau aus? ich muss ja da auch die funktionen der überschriebenen erben. stephan. |
Re: Create überschreiben (newbefrage)
den Konstruktor (.Create).
.FormCreate ist ja nur eine Eventmethode |
Re: Create überschreiben (newbefrage)
und den Konstructor überladen, damit beide Varianten möglich sind.
Gruß oki |
Re: Create überschreiben (newbefrage)
und wie schaut das dann bitte genau aus?
ich habe nun eine überladene Create mit
Delphi-Quellcode:
und wie muss ich die dann gestalten? ich hätte folgendes gemacht:
procedure TForm.Create (AOwner: TComponent; Mode : Modetyp); override;
Delphi-Quellcode:
sehe ich das richtig oder hab ich da noch irgendwo einen fehler drinnen?
procedure TForm.Create (AOwner: TComponent; Mode : Modetyp); override;
begin inherited; Form.Create(self); if Mode = .... // case for mode here end; wie gesagt, ich will ein formular erstellen, das aus zwei bereichen besteht. jede beliebige kombination der bereiche soll wählbar sein. sagen wir der obere ist a und der untere b. nun solls möglich sein, das formular nur mit entweder a oder b anzuzeigen oder aber auch mit beiden. abhängig vom parameter. wenn mir newbe da jemand bitte weiterhelfen könnte vielelicht auch mit code, damit ichs gleich an dem lerne, wäre mir sehr geholfen. danke! |
Re: Create überschreiben (newbefrage)
Hi, so:
Delphi-Quellcode:
Der Constructor wird somit überladen. Du kannst dann beide Constructoren aufrufen, den alten mit nur AOwner und den neuen. Es gibt die Funktion somit zweimal mit unterschiedlichen Parametern. die OH gibt da auch gut auskunft.
Constructor Create(AOwner: TComponent; Mode : Modetyp); overload;
procedure TForm.Create (AOwner: TComponent; Mode : Modetyp); begin inherited create(AOwner); Form.Create(self); if Mode = .... // case for mode here end; Gruß oki |
Re: Create überschreiben (newbefrage)
Ist Form ein Childobjekt Deiner Komponente? Oder wofür steht das Form.Create?
|
Re: Create überschreiben (newbefrage)
schaut so aus:
Delphi-Quellcode:
das sollte eigentlich Create(AOwner) heißen. und ruft den alten Constructor auf.
type TMyForm = class(TDForm)
.... procedure FormCreate .... procedure FormDestroy .... private public constructor Create (AOwner: TComponent; Mode: Windowtyp); overload; ..... end; // und dann kommen die einzelnen Realisierungen im ImplementationTeil oder meinst du im code von oki? |
Re: Create überschreiben (newbefrage)
Hi,
schau mal was dein Compiler sagt, ich glaube hinter das overload muß noch ein override.
Delphi-Quellcode:
Komm da immer wieder durcheinander und vertrau auf die Compilermeldungen für meine Korrekturen.
Constructor Create(AOwner: TComponent; Mode : Modetyp); overload; override;
Gruß oki |
Re: Create überschreiben (newbefrage)
Ich meinte die Zeile Form.Create im Konstruktor.
|
Re: Create überschreiben (newbefrage)
habs jetzt wie oki gesagt hat (ohne das form.create) gemacht und da kommt folgendes:
da bekomm ich nun mehrere fehlermeldungen: zweimal "Deklaration 'Create' unterscheidet sich von vorheriger Deklaration" (bei der deklaration im type und im implementation) dann "Diese Form des Methodenaufrufs ist nur in Methoden von abgeleiteten Typen erlaubt" (beim inherited) und beim type mit dem constructor nochmals "ungenügend Forward- oder External-Deklaration: 'MyForm.Create'" also irgendwie will der compiler den code nicht! :roll: |
Re: Create überschreiben (newbefrage)
Sorry, Sorry!
ich hab jetzt wie empfohlen auch mal die Hilfe bemüht. Da dein Constructor eine virtuelle Methode ist, mußt du folgendes tun:
Delphi-Quellcode:
Nur wenn Du statische Funktionen und Methoden hasst reicht overload. Hier noch mal die Beispiele aus der OH:
Constructor Create(AOwner: TComponent; Mode : Modetyp); reintroduce; overload;
Delphi-Quellcode:
und
type
T1 = class(TObject) procedure Test(I: Integer); overload; virtual; end; T2 = class(T1) procedure Test(S: string); reintroduce; overload; end; ... SomeObject := T2.Create; SomeObject.Test('Hello!'); // Ruft T2.Test auf. SomeObject.Test(7); // Ruft T1.Test auf.
Delphi-Quellcode:
Schau aber unbedingt noch mal in die OH. Da ist auch erläutert was man darf und was nicht!
function Func(X: Real; Y: Integer): Real; overload;
... function Func(X: Integer; Y: Real): Real; overload; Gruß oki edit: Formatierung |
Re: Create überschreiben (newbefrage)
ok, werde mal auch die OH konsultieren.
aber noch zur weieren erklärung: ich will folgendes tun: ich designe ein fortschritts / progress fenster. oben werden in einer liste die tasks mit zeit angezeigt, unten die balken für den aktuellen task und der total balken. nun solls aber möglich sein, nicht nur beide panel (habs auf die weise gelöst) gemeinsam anzuzeigen, sondern eventuell auch nur eines der beiden. also z.b. nur die liste oder nur die balken. und um das zu realisieren, hätte ich die create überschrieben und ihr einen weiteren parameter mitgegeben, in welchem ich mitliefere, wie das fenster auszusehen hat. also entweder eines der beiden oder beide (mach ich derzeit mit einem enum type). das ein und ausblenden der fenster sollte ja nicht das problem sein, und die abfrage des parameters im create mit case und dann die gewünschten aktionen, aber ich brauch dazu die überladene create, damit ich den windowmodus mitgeben kann. nur mal so zur ausführlichen erklärung, was ich damit bezwecke. |
Re: Create überschreiben (newbefrage)
Hi,
also, das mit dem überladenen Constructor müßte nun eigentlich klappen. Wenn nicht, muß ich es wohl mal selbst zum Test proggen. Eine zweite Variante ist, deinem Formular eine neue Eigenschaft zu verpassen. diese nach dem Create setzen und dann das Formular anzeigen. Als bsp. mal der folgende code so eben weg geschrieben:
Delphi-Quellcode:
Jetzt kannst du zur Laufzeit dein Fenster normal über den mitgelieferten Constructor creieren, setzt dein Property und zeigst das Fenster an:
type
TModeType = (mt_none, mt_guckst_du_da, mt_guckst_du_hier ); TMyGuckstDuForm = class(TForm) private FModeType: TModeType; procedure SetModeType(const Value: TModeType); { private-Deklarationen } protected { protected-Deklarationen } public { public-Deklarationen } property ModeType : TModeType read FModeType write SetModeType; published { published-Deklarationen } end; implementation { TMyGuckstDuForm } {----------------------------------------------------------------------------- Procedure: SetModeType Author: oki Date: 19-Jun-2007 Arguments: const Value: TModeType Result: None Des.: hiert wird die Ansicht des fensters in Abhängigkeit von ModeType geändert. -----------------------------------------------------------------------------} procedure TMyGuckstDuForm.SetModeType(const Value: TModeType); begin FModeType := Value; case FModeType of mt_none: ............; mt_guckst_du_da: ............; mt_guckst_du_hier: .............; end; end;
Delphi-Quellcode:
Gruß oki
var MyForm : TMyGuckstDuForm;
begin MyForm := TMyGuckstDuForm.create(self); MyForm.ModeType := mt_guckst_du_da; MyForm.Show; end; |
Re: Create überschreiben (newbefrage)
danke für die hilfe.
nur eine frage: wozu brauch ich bei dieser variante dann eigentlich noch die überladene create?? die kann ich mir dann ja sparen, oder? achja, zum auslesen des modes brauch ichs ja, d.h. von dort einfach das setmode aufrurufen könnte ich machen :) |
Re: Create überschreiben (newbefrage)
Zitat:
Beim Constructor wird der Anwender gezwungen den ModeType mit anzugeben, zumindest dann, wenn der eigene constructor mit reintroduce eingeführt wird.
Delphi-Quellcode:
public
constructor Create (AOwner : TComponent ; AModeType : TModeType) ; reintroduce ; |
Re: Create überschreiben (newbefrage)
Hi Jelly,
grundsätzlich geb ich dir recht. Nur ist hier nicht der Nutzer am Werk, sondern der Programmierer. Solche "Fehler" sollten dann aber auch abgefangen werden. Dafür schreibe ich bei meinen Typdeklarationen auch immer ein "none" mit rein. Zudem sollte der neue Constructor den alten überladen. Somit sind beide immer noch verwendbar. Der Aufruf ohne ModeType ist somit auch wieder möglich und der von dir beschriebene Fehler tritt auf. Grundsätzlich glaube ich, dass der Programmierer in Abhängigkeit von den Anwendungsmöglichkeiten seines Fensters diese Entscheidung treffen sollte. Ein besser oder schlechter kann man hier wohl so nicht definieren. Vielleicht ist ein "Default" in der Vorbelegung ein guter Kompromiß. Gruß oki [edit] Tschuldigung, hab Stephans Beitrag glatt übersehen. Wenn du willst, kannst du ihn dir spaaren. Wenn nicht, spaart dir der neue Constructor eine Zeile Code; die Eigenschaft gibt dir die Möglichkeit den Style des Fensters während es angezeigt wird umzuschalten. gruß |
Re: Create überschreiben (newbefrage)
hab mir da nun ein neues problem aufgegabelt:
wie ich schon erwähnt habe, besteht mein programm im wesentlichen aus 3 panels, ein panel enthält die listview, in welches ich einträge vornehmen kann, dann habe ich ein panel, dass den prozessfortschrittsbalken enthält und dann hab ich ein drittes panel, das den gesamt-fortschrittsbalken enthält. nun will ich wie schon früher geschrieben über den mode angeben, wie mein angezeigtes fenster aussehen soll. es gibt also die möglichkeiten *) nur listview panel *) nur prozessfortschrittsbalken *) nur totalfortschrittsbalken *) listivew und prozessbalken *) listview und gesamtbalken *) prozessbalken und gesamtbalken *) alle drei momentan hätte ich angedacht, mir für jede der 7 möglichkeiten / kombinationen ein element in der enumeration (modetype) zu machen, das gefällt mir aber nicht wirklich, weil ich dann auch 7 case abfragen habe. gibts da nicht eine einfachere lösung, als 7 enumeration typen und damit auch case abfragen? bin für jede vereinfachung zu haben. und natürlich auch für jeden vorschlag. wie würdet ihr das oben machen, damit alle 7 varianten für die fensterdarstellung realisierbar sind. daran, dass das der überschriebenen create mitgeteilt wird, hat sich aber nichts geändert. |
Re: Create überschreiben (newbefrage)
Wie wäre es mit einer Menge?
Delphi-Quellcode:
type
TMyModes = (mmListView,mmProgressBar,mmTotalProgress); TMyMode = set of TMyModes; end; |
Re: Create überschreiben (newbefrage)
Für neue Fragen bitte ein neuer Thread. Auch wenn es weiter um den Mode geht hat das nichts mehr mit der ursprünglichen Frage zu tun. Deshalb mach ich hier mal zu
* * * LOCKED * * * |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:09 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