![]() |
Jede Komponente in EIGENER Unit
Moin moin,
ich möchte gern jede Komponente die ich schreibe in einer eigenen Unit, da es einfach übersichtlicher ist als alles in einer zu haben. Das Problem: Die eine Klasse braucht die andere und umgekehrt, d.h Klasse1 hat ein Feld "FOwner" das die Komponente des Besitzers angeben soll. In Klasse2 wiederum(Hauptklasse) ist ein Feld von Klasse1. Ist es denn gar nicht möglich das irgendwie in 2 Units unterzubringen? D.h ich müsste Die eine unit in der Anderen im uses-teil haben und umgekehrt. (was aber ja nicht geht) Das macht mich fertig :cry: |
Re: Jede Komponente in EIGENER Unit
du musst die unit unter implementation eintragen (da in die uses, bzw. eine neue uses dort anlegen).
Bei der Deklaration gibst du dann oben TObject als Owner an und überprüfst dann in der funktion ob der typ stimmt.
Delphi-Quellcode:
type
TMyClass1 = class; public procedure OwnerSetzen(AOwner: TObject); end; implementation uses unitMitTMyClass2; procedure TMyClass1.OwnerSetzen(AOwner: TObject); var LOwner: TMyClass2; begin //Hier ist TMyClass2 dann bekannt, deshalb kannst du jetzt prüfen ob AOwner vom Typ "TMyClass2" ist if AOwner is TMyClass2 then begin LOwner := TMyClass2(AOwner); //do something with LOwner end; end; |
Re: Jede Komponente in EIGENER Unit
Moin SirThornberry,
das mit dem implementationstail hab ich mir auchschon überlegt,aber ich brauche die andere Unit ja schon bereits im Interface teil, da ich dort ja den "FOwner: MyClass2" festlegen muss EDIT: ah ich seh schon, danke ich teste das mal :) |
Re: Jede Komponente in EIGENER Unit
Zitat:
Ohne Interfaces bzw. abstrakte Klassen wirst du da nicht weiter kommen. ;) |
Re: Jede Komponente in EIGENER Unit
Du hast recht, ich finde es hässlich, aber von Interfaces habe ich nicht wirklich Ahnung ;)
Solange es funktioniert und die Komponente fertig ist und ich sie mir nichtmehr angucken muss ist mir das egal *g* @Thornberry: wofür steht das L deiner Variablen? "Local" ? Eigentlich ne gute Idee, dann können sich Argumente mit Lokalen Variablen nicht "ersetzen".(Gleicher name z.b) |
Re: Jede Komponente in EIGENER Unit
Zitat:
Beispiel : ich habe 2 Komponentengruppen in 2 Units. Das sind jeweils 3 Stück. Die eine ist abgeleitet von TEdit, die andere von TDBEdit. Leider ging das mit vertretbarem Aufwand nicht anders, aber mit .NET soll sich das ja ändern. Die eine Unit sieht nun ungefähr so aus : (abgeleitet von TEdit) -> MeinEdit -> MeinIntEdit -> MeinRealEdit. Mit etwas Phantasie kann man sich ausrechnen, was da gemacht wird : im OnKeyPress werden die zulässigen Zeiechen geprüft, bei Zahlen steht das Default-Alignment auf rechts und und. Als Faustregel würde ich mal sagen : alles was in der Komponentenpalette in einen eigenen Registerreiter gehört, das gehört auch in eine eigene Unit. |
Re: Jede Komponente in EIGENER Unit
wie würde sich dieses Problem denn da mit abstrakten Klassen lösen lassen ?
So ganz klar is mir das noch nicht jetz ? :nerd: |
Re: Jede Komponente in EIGENER Unit
Auch wenn Du es nicht willst, so möchte ich es zumindest gesagt haben. Wenn Du zwei Komponenten / Klassen hast, welche so eng miteinander verbunden sind (z.B. TreeView und TreeItem), dann sollten diese auch in einer Unit sein und somit deren Zusammengehörigkeit direkt verdeutlichen.
...:cat:... |
Re: Jede Komponente in EIGENER Unit
Indem Du etwas da definierst, ohne es zu impemetieren, wo es eigentlich nicht hingehört und dann anderwo sagst, wo es her kommt und die Implementierung dann da machst. Für so Spaghetti-Code dürfte dir Robert_G helfen können. :mrgreen:
[Edit] Sakuras Beispiel ist noch krasser als meins. Vor allem sollte man noch bedenken, daß es um OOP geht. Man also wirklich nur die Unterschiede zwischen den Klassen neu machen muß. Für meine RealEdit-Klasse, die vom IntEdit kommt und nur den DecimalSeparator abhandelt, mache ich doch keine eigene Unit. |
Re: Jede Komponente in EIGENER Unit
Zitat:
Dabei würdest du weder den Owner noch das Child fest aneinander koppeln. Aber bei so loser Kopplung wirst du um einen TypCast bei den Benachritungen nicht vorbeikommen*. Wenn du jetzt eine Basisklasse für den Owner hast**, die du in beiden Units benutzen kannst, könntest du so virtuelle/abstrakte Methoden des Owners ohne TypCasting ausführen. Aber etwas Gewurschtel wird es eigentlich immer werden. ;) @mieze In dem Fall würde es auch nicht viel Sinn machen. ;) Aber ich fange jetzt ganz sicher nicht mit dem internal und den fehlenden forward declarations aus C# an. :mrgreen: @Hansa Dass du absolut keine Peilung von OOP hast dürfte man in Pseudos anderem Thread gemerkt haben. :mrgreen: *Irgendwas spezielles wird der INotifier ja dem INotifiable mitteilen wollen. ;) **die keinen direkten Verweis auf die Childklasse hat |
Re: Jede Komponente in EIGENER Unit
* ** hmm...sieht nachSpaghetti-Post aus *g*
Zitat:
|
Re: Jede Komponente in EIGENER Unit
Zitat:
|
Re: Jede Komponente in EIGENER Unit
Zitat:
|
Re: Jede Komponente in EIGENER Unit
Das Problem ist, daß Du nicht mal gesagt hast, um was es genau geht. Insofern helfen bei so einer Frage eben nur Beispiele, wenn überhaupt. Einiges sollte man bei der Komponentenentwicklung aber doch beachten :
Es ist mehr oder weniger mühsam, diese selber zu machen. Gehen tut das aber schon. Ist sie fertig, dann besteht kein großer Bedarf mehr, sie zu ändern. Aber nur, wenn sie gut geplant wurde und tatsächlich funktioniert. Dies bedeutet dann aber auch, daß man lange nichts damit zu tun hat, eben erst dann, wenn man doch wieder etwas ändern muß wegen schlechter Planung. Und dann fängt man eben wieder an sich reinzudenken. Jetzt gibt es verschiedene Methoden, sich das Leben schwer zu machen : man schreibe eigene Units für jede Komponente, selbst wenn sie aufeinander aufbauen. Das ist das, was du vorhast. Verfeinern kann man das Spaghetti-Gericht dann noch mit diversen abstracten Zutaten. 8) Als Krönung der Mahlzeit könnte man diese Units dann noch in eigene Unterverzeichnisse packen und im Endeffekt den Compiler zur Kapitulation zwingen. :lol: |
Re: Jede Komponente in EIGENER Unit
Die indys etc sind für dich spaghetticode? :\ :roll: :mrgreen:
|
Re: Jede Komponente in EIGENER Unit
Delphi-Quellcode:
Hallo Hansa,
Jetzt gibt es verschiedene Methoden, sich das Leben schwer zu machen : man schreibe eigene Units für jede Komponente, selbst wenn sie aufeinander aufbauen.
aber was ist, wenn die Komponenten zwar aufeinander aufbauen, aber nix miteinander zu tun haben ? Ich kann mich daran erinnern, dass ich aus einer alten Jedi VCL mal den JVCaption Button seperat herausgelöst habe. ( weil ich ohne die Jedi Installation auskommen wollte) Das ging sehr gut, eins, zwei Units. In der neuen Jedi wird auch der XP Style untersützt. Und auch deswegen muss Du neuerdings halb Jedi einbinden, um diesen einen Button in der Titelleiste zu bekommen :mrgreen: Aber muss Jedi nun denn alle Komponenten in einer Unit schreiben, nur weil sie alle den Win XP Style untersützen ? Es gibt da wahrscheinlich keine so richtig optimale Art und Weise, obwohl es sich die Informatik sehr gern wünschen würde sicherlich. |
Re: Jede Komponente in EIGENER Unit
Zitat:
Edit : sich eine solch große Komponenten-Sammlung wie Indy oder gar Jedi zum Vorbild zu nehmen ist von Anfang an der falsche Weg. Und @Pseudo : was soll jetzt deine Kompo eigentlich machen ? Funktioniert sie überhaupt ? |
Re: Jede Komponente in EIGENER Unit
Zitat:
Ich persönlich finde es auch besser, wenn benötigte Klassen in einer Extra Unit stehen, da weiss ich, wer auf was aufbaut. Ich behalte die Übersicht und muss mich nicht unnötig in einer einzigen Unit hin und herhangeln. Die Zeit, die ich einspare, wenn ich nicht in einer riesigen Quelltext Datei entwickeln muss, kann ich dann gut und gern dazu verwenden, um meine Spagetti Code wieder zusammenzufügen :-) |
Re: Jede Komponente in EIGENER Unit
Bin ganz deiner Meinung, stoxx :)
Zitat:
Zitat:
|
Re: Jede Komponente in EIGENER Unit
Mein Warum, wieso und weshalb man sich Jedi nicht zum Vorbild nehmen sollte, war eine ernstgemeinte Frage, falls dies nicht so rübergekommen ist.
Man kann jeden Tag neue Dinge lernen, nur wie macht man es besser ? Ich code auch manchmal so, wie man es eigentlich nicht machen sollte, aber oft fällt mir eben keine bessere und elagantere Lösung ein. Daher interessiert mich das schon :) |
Re: Jede Komponente in EIGENER Unit
Zitat:
|
Re: Jede Komponente in EIGENER Unit
ich habe nicht gesagt, daß man sich das nicht ansehen soll. Unter Vorbild verstehe ich etwas, das so gut ist, daß man möglichst alles davon nachmachen sollte, um mindestens genauso weit zu kommen.
Wenn ich wissen will, wie Licht besser gesagt Energie erzeugt wird, so kann ich einem Fahrradfahrer abends beim Fahren zusehen. Ich kann auch ein Atomkraftwerk besichtigen und lasse mir das erklären. Jetzt will ich selbst Licht erzeugen und baue deshalb einen vorhandenen Fahrrad-Dynamo so als meinen Dynamo um, daß er nicht während der Fahrt geht, sondern mit stationärem Handbetrieb. Wenn ich das hier so lese, dann kommt es mir fast vor, als würden Pläne geschmiedet, eher ein Atomkraftwerk im Vorgarten aufzubauen. :lol: Zitat:
Wieso hat sich eigentlich noch keiner die Jedi Komponenten einfach angesehen ? Die Frage wäre langst abgehakt. 8) |
Re: Jede Komponente in EIGENER Unit
Zitat:
Zitat:
|
Re: Jede Komponente in EIGENER Unit
Zitat:
|
Re: Jede Komponente in EIGENER Unit
Zitat:
Zitat:
|
Re: Jede Komponente in EIGENER Unit
Es gibt noch einen einfachen Weg, zwei Komponenten in einer Unit zu haben und die Sache ist trotzdem übersichtlich. In so einem Fall wären Includes ganz praktisch, mit denen kann man zumindestens die Implementation einer Komponente in einer Datei ablegen und totzdem hat man keine Probleme mit zirkulären Referenzen. Und für alle, die meinen: "Dann kann ich das Interface aber nicht mehr sehen"(solche Typen habe ich aber hier noch nicht gefunden): Entweder öffnet man zwei Editorfenster in Delphi oder man benutzt seinen Drucker und druckt den Interface-Teil aus. Damit könnte man sogar das lästige Wiederfinden der Stelle, an der man gerade arbeitet, umgehen.
|
Re: Jede Komponente in EIGENER Unit
Jetzt auch noch Include-Files und zirkuläre Geschichten ? :shock: Die Spaghettis sollen also zum Schluß auch noch verknotet werden ? :lol: Tolle Idee, aber seit den ersten ca. 5 Beiträgen kann man die anderen mehr oder weniger vergessen. 8)
Allerdings hätte ich noch eine Frage : wer von denen, die hier was gesagt haben, hat eine einzige eigene fertige Komponente, bei der im OI etwas eigenes eingestellt werden kann und die in der Komponenten-Palette sichtbar ist ? Funktionieren muß sie natürlich auch. Handelt es sich um streng geheimen Code, nicht schlimm. Mich interressiert der nicht, sondern nur von welcher Standard Delphi-Komponente abgeleitet wurde. |
Re: Jede Komponente in EIGENER Unit
Liste der Anhänge anzeigen (Anzahl: 1)
oohr Hansa, ich mag Dich eigentlich ziemlich sehr und lese Deine Beiträge immer sehr gern und respektvoll.
Nur was hat die Größe einer Quelldatei in der sich vielleicht 3 Klassen befinden, die man aus Übersichtsgründen gern in extra Dateien haben möchte mit Spagetticode zu tun ?? Darf man jetzt keine großen Klassen mehr schreiben ? Vieles hat sich ja auch in Delphi2005 mit dem Codefolding gelöst, hab mir da schon ein eigenes übersichtliches System ausgedacht. Dein letzter Beitrag war Müll, sorry :-) So wie im Anhang sieht dann meine Interface Teil aus ( is erstmal nur da Grundgerüst, experimentiere noch etws damit herum, mal sehen, ob es sich bewährt) liebe Grüße von mir |
Re: Jede Komponente in EIGENER Unit
Zitat:
Wer tatsächlich ernsthaft bemüht ist, bei Komponenten einzusteigen, der soll sich mal noch das hier ansehen, sofern er das notwendige Grundwissen denn mittlerweile hat : ![]() |
Re: Jede Komponente in EIGENER Unit
Zitat:
Mir hat der Thread trotzdem was gebracht. Habe das mit dem abstrakten Klassen mal durchdacht. Das ist eine gute Idee, Events können dadurch so allgemein wie möglich gehalten werden. Nun ja .. HAtte nur ständig das gefühl, dass Du nicht so richtig zum Punkt gekommen bist, weiss bis heute nicht, was an Jedi schlecht sein soll, hätte aber gern Deine Meinung dazu gehört. viele Grüße |
Re: Jede Komponente in EIGENER Unit
Da bekomme ich ja Augenkrebs :-) Ne, wenn es dir so gefällt und du mit den Farbeeinstellungen keine Probleme hast, ist alles in Ordnung. Über Geschmack lässt sich ja bekanntlich (nicht) streiten.
Zitat:
Zitat:
Delphi-Quellcode:
Das sind zumindest die, wo ich es noch genau weiß. Da sind mit Sicherheit noch ein paar weitere von mir in der JVCL 3. Nur will ich keine Komponente als meine ausgeben, wenn ich es nicht mit 100% sagen kann, dass es meine ist.
TJvAppInstances = class(TComponent);
TJvEditListAutoComplete = class(TJvBaseEditListAutoComplete); -> TComponent TJvEditListBoxAutoComplete = class(TJvBaseEditListAutoComplete); -> TComponent TJvComboBoxAutoComplete = class(TJvControlAutoComplete); -> TComponent TJvLookupAutoComplete = class(TComponent); TJvEx(Hier alle VCL Controls einsetzen) = class(VCL Control); // eine ganze Menge TJvImageList = class(TImageList); TJvMultiStringHolder = class(TComponent); TJvTabBar = class(TCustomControl); TJvTabBarPainter = class(TComponent); TJvModernTabBarPainter = class(TJvTabBarPainter); -> TComponent TJvXPProgressBar = class(TJvCustomXPProgressBar); -> TGraphicControl Und jetzt ein kleiner Auszug der nicht OpenSource Komponenten
Delphi-Quellcode:
Ich hoffe das reicht fürs erste Mal. Die CLX Komponenten habe ich außen vor gelassen.
// Delphi 1 bis 3
TExtendedBevel = class(TBevel); TStartMenuListView = class(TCustomListView); TTipTrickDlg = class(TCommonDialog); TURLLabel = class(TLabel); TKachelPaintBox = class(TPaintBox); TPreviewPaper = class(TPanel); TAboutDlg = class(TCommonDialog); TGradient = class(TGraphicControl); TSBtnImageList = class(TSpeedButton); TPanelImageList = class(TPanel); TMSEdit = class(TCustomControl); TZLibPackage = class(TComponent); TXPMenuDrawer = class(TComponent); TMenuBar = class(TToolBar); TAHShellListView = class(TCustomListView); // neuere: TAHCompBrowseFolderDialog = class(TCommonDialog); TAHCompRegistryWriter = class(TComponent); TAHCompOneInstance = class(TComponent); TAHCompImageList = class(TImageList); TAHCompPrintObject = class(TComponent); TAHCompPrintPreview = class(TGraphicControl); TAHCompFormHeader = class(TCustomControl); TAHCompComponentBar = class(TCustomControl); THtHintWindow = class(THintWindow); // in der JVCL ebenfalls vorhanden, aber nicht in der KompPal. |
Re: Jede Komponente in EIGENER Unit
Zitat:
|
Re: Jede Komponente in EIGENER Unit
In diesem Nonsense Thread kann man jetzt nur noch sagen : "neue Frage, neuer Thread". 8) Zu Jedi habe ich lediglich gesagt, daß ich es für absolut nicht gut halte, sich an einer Riesen-Komponentensammlung zu orientieren, wenn man nicht mal selber eine kleine Komponente hinkriegt bzw. sich zuerst mal mit Fragen über Aufteilung von Units, Abstract, Include-Files usw. Gedanken macht.
An Komponenten hat offensichtlich noch keiner eine fertige. Was bisher hier gesagt wurde, wird deshalb wohl relativ früh nur durch den Task-Manger gestoppt werden können, oder sogar durch den Ein-Aus Schalter. :lol: [Edit] @jbg : wieso kein Edit ? Zuerst habe ich nur den letzten Beitrag gesehen. Was machen denn diese Komponenten ? Und warum das J ? |
Re: Jede Komponente in EIGENER Unit
Zitat:
Zitat:
Ich glaub du bist der (einzige) Jenige der sowas nicht kann und bist nur neidisch, ein anderer Grund fällt mir nicht ein :wink: |
Re: Jede Komponente in EIGENER Unit
Hai ihr alle.
Bleibt doch bitte beim Thema der Frage. Eure privaten Meinunsverschiedenheiten könnt ihr via PM, im Sandkasten oder an anderen, dafür geeigneten Stellen, lösen. :roll: Danke. |
Re: Jede Komponente in EIGENER Unit
Zitat:
Zitat:
Zitat:
Zitat:
TAHCompBrowseFolderDialog sollte selbsterklärend sein. TAHCompRegistryWriter erlaubt beliebige Daten in die Registry zu schreiben und zu lesen mit einem einzigen EventHandler, in dem man die Felder an eine Add()-Methode übergibt. TAHCompOneInstance erlaubt das Ausführen von nur einer Programminstanz, alle anderen Instanzen schicken ihre Parameter an die erste, die auch automatisch aktiviert werden kann. TAHCompPrintObject und AHCompPrintPreview: Druckfunktion mit Vorschau. TAHCompFormHeader: Du kennst den MSI Installer? Das weiße Header-Panel wird durch diese Komponente nachgebildet. TAHCompComponentBar: Ein ![]() TJvTabBar: Ein ![]() Für den Rest kann man entweder die JVCL Hilfe konsoltieren, oder sich die Funktionalität aus dem Komponentennamen ableiten. Was wird wohl eine TAHCompImageList machen? Zitat:
Es ist mir aber immernoch unklar, warum du von der JVCL als Orientierungspunkt abrätst. Ohne genaue Gründe, kann man daran ja auch nichts ändern. |
Re: Jede Komponente in EIGENER Unit
Zitat:
|
Re: Jede Komponente in EIGENER Unit
Zitat:
Aber den Grund warum du von der JVCL als Orientierungspunkt abrätst hast du immernoch nicht preisgegeben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 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