Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Problem mit Uses-Klausel (https://www.delphipraxis.net/172663-problem-mit-uses-klausel.html)

Sir Rufo 16. Jan 2013 14:24

AW: Problem mit Uses-Klausel
 
Zitat:

Zitat von Medium (Beitrag 1199252)
Edit: Okay, den Spezialfall den Sir Rufo nennt gibt es auch. Das habe ich bisher aber meist nur im Zusammenhang mit DBControls gesehen, und ich persönlich würde diese Praxis auf einem absolut notwendigen Minimum halten. Zumal die Uses-Klauseln dadurch alles andere als übersichtlicher würden.

Diesen "Spezialfall" hast du bei 99% aller Komponenten (z.B. TButton, TEdit, etc.) und ist auch nur "speziell" bei installierten Komponenten aus der Komponentenpalette möglich, da es sich um ein "spezielles" Verhalten der IDE handelt ;)

Und der TE fragte auch ganz "speziell" nach Komponenten.
(ist aber in diesem Zusammenhang aber eher nur eine Randnotiz wert, weil es eben IDE "speziell" ist)

Medium 16. Jan 2013 14:27

AW: Problem mit Uses-Klausel
 
Das ja, was aber nicht ginge ist:
Delphi-Quellcode:
unit MyMainUnit;

interface

uses
   Auto; // kennt nur Auto

var
   MeinAuto : TAuto;

MeinAuto.Lenkrad := TLenkrad.Create;
Da die Deklaration von TLenkrad fehlt. Memberzugriff geht immer, auch ohne das der Typ des Objekt-Feldes im Scope liegt. Nur die unmittelbare Verwendung dessen geht nicht. Ebenso geht auch z.B. das nicht:
Delphi-Quellcode:
uses
   Auto; // kennt nur Auto

var
   MeinAuto : TAuto;

MeinAuto := TMercedes.Create;
Um das zu realisieren gibt es mehrere Wege: Eine Factory, die eine Enummeration als Parameter erhält und anhand dessen ein Objekt des richtigen Typs liefert; das gleiche nur anders: In der Unit Auto müssten dann noch Dinge wie "TMercedesClass = class of TMercedes;" usw. deklariert werden, welche statt der Enummeration übergeben würden; eine String-Basierte Factory die einen Text-Parameter nimmt und anhand diesem unterscheidet, ... letztlich würde hier, wenn es um das Erzeugen eines spezifischen Autos geht, am ehesten aufs Factory-Pattern hinauslaufen. Fühlt sich für mich zumindest am "natürlichsten" an. Wie man dieser nun konkret sagt, was sie erzeugen soll, wäre dann wie o.g. sehr variabel. Da käme es dann auf den genauen Einsatz an, und wohl auch persönlichen Geschmack.


@Roter-Kasten-Rufo: Dass die VCL nicht der Gold-Standard der Best-Practices ist, weiss ich auch ;P

Sir Rufo 16. Jan 2013 14:29

AW: Problem mit Uses-Klausel
 
@Medium :thumb:

stahli 16. Jan 2013 15:39

AW: Problem mit Uses-Klausel
 
Irgendwas kam mir doch schon beim Abschicken merkwürdig vor. :oops:
Hätte auf meine Signatur hören sollen. :stupid:

philharmony 16. Jan 2013 16:21

AW: Problem mit Uses-Klausel
 
Hmm nächstes Problem: meine 'TParkhaus' enthält eine 'Autos : TList', die nur die Pointer auf die verwendeten 'TAuto' enthält. Ich habe zwar eine procedure Parthaus.AddAuto(Name : String), und eine function Parkhaus.GetAuto : TAuto, allerdings kennt UnitMain ja nur 'Parkhaus' und kann dann zwar ein Auto hinzufügen, aber nichts mit dem ReturnValue von GetAuto vom Typ TAuto anfangen, richtig?

DeddyH 16. Jan 2013 16:44

AW: Problem mit Uses-Klausel
 
Richtig.

philharmony 16. Jan 2013 16:59

AW: Problem mit Uses-Klausel
 
Ich glaube, die Rupie hängt noch knapp über dem Boden fest:

Wenn 'TParkhaus' eine Property vom Typ 'TAuto' hat, dann kennt die MainUnit, die TParkhaus verwendet auch TAuto. Ist das richtig?
Dann könnte ich anstatt der GetAuto ja auch eine ArrayProperty mit Typ TAuto benutzen, die den entsprechenden Zeiger aus der TList zurückgibt. Kennt die MainUnit dann TAuto?

DeddyH 16. Jan 2013 17:29

AW: Problem mit Uses-Klausel
 
Damit die MainUnit die Klasse TAuto kennt, muss diese in irgendeiner der eingebundenen Units auch deklariert sein.

philharmony 16. Jan 2013 17:53

AW: Problem mit Uses-Klausel
 
Ok danke, ich denke ich habs. Ich bin noch von meiner Arbeit mit C ausgegangen, wo ein #include den gesamten damit eingebundenen Text inklusive aller dort vorhandenen #includes kennt.

Medium 16. Jan 2013 19:16

AW: Problem mit Uses-Klausel
 
Wichtiger Unterschied zu Includes: Diese werden quasi wie einkopierter Text behandelt (imho werden sie sogar genau das), während unter Units ein "semantischer" Zusammenhang besteht: Lediglich das, was in einer Unit explizit an Typen deklariert ist, ist nach aussen hin sichtbar, und die Sichtbarkeit erstreckt sich auch nur über genau eine Uses-Klausel, und wird über diese nicht an weitere "Unterbenutzer" weitergeleitet.
Delphi kennt unterdessen auch Includes. Hier aber nicht über ein Keyword, sondern eine Compilerdirektive ({$i Dateiname} wenn ich nicht irre, grad kein Delphi parat). Dabei wird dann ebenfalls nur der Inhalt von "Dateiname" an die Stelle kopiert, wo die Direktive steht. Ist keine gängige Praxis, und imho auch kein allzu astreiner Stil, in manchen Situationen aber sehr hilfreich. Bei dir bin ich aber der festen Überzeugung, dass sich das auch über ein geeignetes Klassendesign schöner lösen lässt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 Uhr.
Seite 2 von 3     12 3      

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