Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Objektablage (https://www.delphipraxis.net/19014-objektablage.html)

Hansa 27. Mär 2004 16:34


Objektablage
 
Objektablge / Repository

Wie sich gezeigt hat, ist die "Objektablage" in Delphi ziemlich unbekannt. Zumindest wird sie kaum benutzt. Meiner Meinung nach völlig zu Unrecht. Denn sie erleichtert schon einiges.

Viele glauben, man könne damit lediglich eine Form definieren, um diese dann zu kopieren. Der OOP-Ansatz wird dabei allerdings häufig übersehen.

Hat eine Form den Fokus, so kann man mit einem Mausklick (rechts) ein Popupmenü öffnen. In diesem besteht folgende Möglichkeit : "der Objektablage hinzufügen...". Wird dies ausgewählt, so muß ein Name und ein Titel festgelegt werden. Ist dies geschehen, so findet man die Form mit sämtlichen Eigenschaften (inkl. Schriftart, Controls usw.) unter Neu-> (normalerweise) weitere.

Wird die Form ausgewählt, so ist (sehr wichtig !!) unten eine Auswahl zu sehen. "Kopieren", "Vererben", "Verwenden". Kopieren bedeutet einfach nur, dass eine Kopie der Form unter anderem Namen angelegt wird. Ist also die Form in der Objektablage gespeichert als "MyForm", so ist die Kopie genau diese Form mit dem Namen "MyForm1". Auf diese Form kann man nun alle möglichen Sachen drauf packen oder auch entfernen.

Soweit einmal ein erster Einstieg. Richtig interessant ist jedoch, falls man eine Form vererben will. Wählt man "Kopieren", so hat man zumindest schon einmal die Arbeit gespart, sämtliche vielfach benötigten Eingabefelder oder sonstige Eigenschaften zu definieren. Dies gilt für alle im OI einstellbaren.

Wird fortgesetzt...

Hansa 27. Mär 2004 18:12

Re: Objektablage
 
Das wirklich wichtige kommt jetzt :

Ich gehe mal von folgendem Fall aus. Es wird eine Form gebraucht, die folgende Eigenschaften hat : Standard-Schriftgröße 10. Sie soll ein Edit-Feld haben und ein Stringgrid. Ist sie deaktiviert, so soll sie anders aussehen, als aktiviert. Gut, das dürfte reichen. Bei mir kommen noch einige Sachen dazu. Wie geht man nun vor ? Klassisch ganz einfach : Neu -> Form und dann alles von Hand einstellen. Farbe, OnKeyDown, OnClose usw. Aber das ist im Prinzip doch immer dasselbe. Nun kann man diese Form ja wie gesagt einfach kopieren.

Der Nachteil ist aber dann, dass der Vorteil den man hat, die Steuerelemente nicht wieder neu auf der Form zu platzieren und im OI die Eigenschaften einzustellen nur einmalig ist. Wenn man die Forms 10mal kopiert, so muß man sie auch 10 mal abändern, wenn nötig.

Also mache ich doch besser folgendes :

1. neue Form erzeugen
2. OnActivate und OnDeactivate besetzen, z.B. Hellrot, falls aktiviert und grün, falls deaktiviert.
3. Stringgrid und Edit auf die Form. Da wo sie hin sollen.
4. alle weiteren gewünschten Eigenschaften. Schrift usw.

Nun verfrachte ich diese Form in die Objektablage. Alle Eigenschaften bleiben dabei erhalten. Brauche ich noch eine ähnliche Form, die sich zwar so wie die erste Verhalten soll, so erzeuge ich eine neue, aber nicht mit neu -> Form, sonder mit neu -> weitere ->... Da suche ich mir die vorher definierte aus. Und nun (nicht vergessen !) den Radiobutton "Vererben" anklicken. Auf diese neue Form lege ich nun Checkboxen, Datasets usw. Sie behält dann alle Eigenschaften der Vorfahrform, ich kann aber trotzdem (fast alles) tun und lassen was ich will.

Auch diese Form kann ich nun in die Objektablage schieben, so dass ich in Zukunft auch noch die neu eingeführten Checkboxen benutzen kann. Natürlich kann ich jetzt noch weiter machen und das OnActivate der allerersten Form ersetzen.

Das wichtigste ist jedoch folgendes : Angenommen, das OnActivate Ereignis soll ganz anders gemacht werden. Und das bei allen Forms. Ich müsste also Form für Form aufrufen und abändern. Mit meinem Beispiel gehe ich ganz einfach hin, ändere die Ausgangsform und durch OOP ist alles in den vererbten Forms abgeändert :!: Allerdings nur, sofern für die neue Form "Vererben" ausgewählt wurde. Paßt das nicht überall, so suche ich die am besten passende Form und kopiere diese lediglich.

In meinem konkreten Fall sieht die Hierarchie folgendermaßen aus:

Eine Form mit Panel und Editfeld ist der Ursprung. Diese wird vererbt an eine, die noch ein Stringgrid enthält. Manchmal brauche ich kein StringGrid, das Panel/Edit aber schon. Dann nehme ich die 1. Form. Lege ein paar Labels usw. drauf. In einem anderen Fall brauche ich außer dem Stringgrid nun noch ein Image. Und das in 3 Fällen. Deshalb lege ich ein Image noch auf die 2. Form und leite mir von dieser wiederum 3 Forms ab, bei denen ich nur noch die Picture-Eigenschaft anpasse. Usw. usw.

Ich schätze mal, daß bei Einhaltung dieses Konzeptes bestimmt 20 % der Programmierzeit eingespart werden können. Wieso die Objektablage kaum genutzt wird ist mir nach wie vor ein Rätsel. 8)

Wird fortgesetzt...

Hansa 27. Mär 2004 21:01

Re: Objektablage
 
Viel mehr gibt es nicht zu sagen. Vielleicht ist es auch zu einfach, so daß keiner das Ganze benutzt. Wer es nicht benutzt ist selber Schuld, meiner Meinung nach. Allerdings steht auch kaum was darüber geschrieben. Eines fehlt allerdings noch : wie kriegt man die Dinger wieder aus der Objektanlage raus ? Für Testzwecke dürften sich im Repository/Objektablage schon einige unnütze Forms ansammeln. 8) Und das ist auch etwas versteckt untergebracht.

Sollen die wieder weg, dann : Tools -> Objektablage -> Form auswählen -> Objekt entfernen.

Ah, noch ein Hinweis : bei vererbten Forms steht immer inherited im Source. Wenn das fehlt, so hat man die Form nicht vererbt und wird später wahrscheinlich unliebsame Effekte bemerken.

[vorerst beendet]

P.S.: Kommentare sind jetzt erwünscht. Insbesondere würden mich die Gründe interessieren, warum anscheinend keiner diese Sache verwendet.

mirage228 28. Mär 2004 16:13

Re: Objektablage
 
Zitat:

Zitat von Hansa
P.S.: Kommentare sind jetzt erwünscht. Insbesondere würden mich die Gründe interessieren, warum anscheinend keiner diese Sache verwendet.

Weil ich vorher nicht so richtig über das Thema bescheidwusste. Ich hätte auch nicht gedacht, dass es etwas so nützliches dahinter steckt.
Ich denke die Dinge könnten gut in mehreren meiner Projekte Verwendung finden. ^^

Ein wirklich super Tutorial :thuimb:

mfG
mirage228

fkerber 28. Mär 2004 16:22

Re: Objektablage
 
Hi!

Ich wusste gar nicht, dass es so etwas gibt.
Danke für den Tipp, ist bestimmt nützlich.

Ciao fkerber

Hansa 17. Aug 2004 00:08

Re: Objektablage
 
Ähh, ich muß das mal wieder hervorkramen. Wer hat sich jetzt mit dem Thema eigentlich zwischenzeitlich mal beschäftigt ? :zwinker:

nailor 17. Aug 2004 02:28

Re: Objektablage
 
ich nicht. mehr kann ich zu dem thema von daher im moment nicht sagen...

außer, dass ich noch nie wirklich dringnde notwendigkeit dafür gesehen hätte. strg-c/v geht doch auch...

Hansa 17. Aug 2004 02:42

Re: Objektablage
 
Zitat:

Zitat von nailor
ich nicht...außer, dass ich noch nie wirklich dringnde notwendigkeit dafür gesehen hätte. strg-c/v geht doch auch...

[HT]
Cut+Paste Möchtegern-Programmierer sind auch nicht gefragt. Falls du auch zu denen gehörst : keiner zwingt dich jedem mitzuteilen, daß du nicht weißt um was es geht. :mrgreen:
[Ende HT]

Es geht auch um OOP und da liegen die Stärken von dem Ding. Außerdem geht es darum eine einheitliche Oberfläche zu erschaffen. Sofern nur eine einzige Form für ein Mini-Programm verlangt wird, ja dann kann man sich die einzelnen Steuerelemente mit C+P zusammenstückeln und jedesmal am OI rumfummeln. Ab 2 Forms ist es aber gut zu gebrauchen. Bei mehr als 5 ist es allerdings schon schlecht, wenn man nicht weiß um was es geht.

nailor 17. Aug 2004 12:58

Re: Objektablage
 
eine frage hab ich jetzt mal noch. wenn man nachträglich was an der ursprungsform ändert, erben/übernehmen dann alle anderen forms diese änderung? weil wenn nicht, sehe ich keinen unterscheid zwischen:

Strg-A Strg-C "neues Formular" Strg-V

Hansa 17. Aug 2004 15:37

Re: Objektablage
 
Ich glaube das wichtigste steht weiter oben schon. Aber um es noch einmal klar zu machen (anhand eines Beispieles) :

Angenommen ich habe ein Stringgrid mit 5 Spalten und in Spalte 3 soll etwas eingegeben werden. Nun lege ich das in die Objektablage. Ich leite hiervon eine Form, sagen wir Form1 ab (vererben auswählen). Dann noch eine (Form2) und setze in dieser ColCount auf 7 und da muß auch noch ein Panel drauf und ein paar Edits. Somit habe ich zwei Stringgrids mit einmal 5 und einmal 7 Spalten. Das Verhalten ist genau das von der Form im Repository. Bis auf die hinzugekommenen Edits und die Spaltenanzahl.

Nun habe ich mich vertan. :shock: Die Spalte 3 soll keine Eingaben erfassen, sondern die Spalte 4 !

Nun ändere ich die Ursprungsform in der Objektablage dementsprechend ab und Simsalabim, für die 2 Forms gilt das ab dann auch. Mit C+P müßte ich das alles für jede Form im OI neu einstellen.

Desweiteren wird mit C+P nur das, was in der DFM steht mitkopiert. Wurde zusätzlicher Code dazu geschrieben so muß man den im Source auch noch per C+P kopieren und anpassen. Das öffnet Fehlern Tür und Tor.

Anderes Beispiel : Farbe eines speziellen Labels, welches auf 10 Forms liegt, gefällt mir nicht mehr. Kein Problem : ich öffne die 10 Forms nacheinander, klicke das Label an, gehe im OI auf die Color, suche die, die besser aussieht und ändere sie ab. Und das 10mal ! Klar, das ginge schon. 8) Aber ich ändere doch besser das Label der Ursprungsform einmal ab und basta.

Stevie 7. Okt 2004 11:40

Re: Objektablage
 
Tjaja, die armen Leute, die immer ihre Formular von andren ableiten, indem sie dne Vorgänger abändern und dann in der Formular-als-Text-Ansicht das object durch inherited ersetzen... :mrgreen:
Aber mal ne Frage:
Ich hab ein Package, wo meine Standard-Formulare drin sind. Gibt es eine Prozedur, die mir bestimmte Formulare in die Objektablage ablegt? So, dass ich nach dem Installieren des Packages die Formulare auf einem eigenen Tabsheet sehen kann?

Hansa 7. Okt 2004 12:03

Re: Objektablage
 
Zitat:

Tjaja, die armen Leute, die immer ihre Formular von andren ableiten, indem sie dne Vorgänger abändern und dann in der Formular-als-Text-Ansicht das object durch inherited ersetzen...
Was willst du uns damit sagen ? :shock: Verstehe nur Bahnhof. :mrgreen:

Zur Frage : Formulare im Package ? :shock: ---> 2. Bahnhof :zwinker:

Forms in der Objektablage sind meistens bei Datei -> neu -> weitere. Um es noch einmal zu sagen : die Objektablage hat mit eigenen Komponenten theoretisch etwas zu tun und ist doch ein ganz anderer Ansatz. Im Gegensatz zu "normalen" Komponenten funktioniert die Ableitung bei Forms ganz anders. Deshalb kriegt man auch keine Forms in die Komponentenpalette rein gepackt. 8)

Stevie 7. Okt 2004 12:19

Re: Objektablage
 
Ok, ich hol mal etwas aus...
1.) Angenommen, du willst ein Formular von einem anderen ableiten, dann macht man das natürlich am besten so, wie du erklärt hast oder eben so wie ich erklärt hab. Du erstellst ein normales Formular und änderst die Zeile...
Delphi-Quellcode:
TForm1 = class(TForm)
in...
Delphi-Quellcode:
TForm1 = class(TMyForm)
wechselst dann in die Text-Ansicht des Formulars und änderst die Zeile...
Delphi-Quellcode:
object Form1: TForm1
in...
Delphi-Quellcode:
inherited Form1: TForm1
und wechselst wieder in die Formularansicht. Schwupp, ist das Formular von TMyForm abgeleitet und besitzt auch dessen Komponenten.
Wie gesagt, sehr umständlich, aber so wurde mir das am Anfang meiner Ausbildung erklärt... :gruebel: :wall:

2.) Ich hab ein Package gemacht, in dem sich Formulare befinden, die über zusätzliche im OI sichtbare Eigenschaften verfügen und außerdem Komponenten beinhalten. Dies ist nur durch zwei Schritte möglich: 1. Formular erstellen, mit published properties versehen und über RegisterCustomModule installieren, 2. weiteres Formular vom ersten Formular ableiten und Komponenten plazieren. Wenn ich aber dieses Package woanders installiere, möchte ich, dass ich die Formulare, die ich für das Ableiten vorgesehen habe, unter Datei -> neu -> weitere in einem von mir benannten TabSheet auswählen kann.

Hansa 7. Okt 2004 12:48

Re: Objektablage
 
hehe, du machst also die Arbeit, die die Objektablage macht von Hand und dann auch nur die Hälfte davon. :mrgreen: Benutze die Objektablage und genau was Du willst macht die, wenn du dem Formular sagst (Rechtsklick) : ab in Objektablage. Dann wird auch gefragt in welches Tabsheet sie da rein soll. Das Hand-inherited :lol: kriegst du auch gemacht wenn du sagst "vererben". Dann 2. (ähnliches) Formular fischst du dir dann mit datei -> neu -> weitere da raus und sagst wieder : vererben. Dieses 2. Formular kannst du dann bearbeiten. Ein paar mehr Controls usw. Änderungen an dem 1. wirken sich dann auch auf alle Abkömmlinge aus. Aber du weißt ja was OOP ist. 8)

Stevie 7. Okt 2004 12:51

Re: Objektablage
 
Jo, das weiß ich doch! :zwinker:
Ich würd mir nur gerne das Hinzufügen in die Objektablage innerhalb der Register-Prozedur machen. Weißt du, wie das geht??

Hansa 7. Okt 2004 12:55

Re: Objektablage
 
ne, kein Plan. Ich traue deinem Hand-inherited sowieso nicht so recht. :mrgreen:

Stevie 7. Okt 2004 13:08

Re: Objektablage
 
Zitat:

Zitat von Hansa
ne, kein Plan. Ich traue deinem Hand-inherited sowieso nicht so recht. :mrgreen:

Halloo??? Ich praktiziere kein Hand-Inherited (mehr)!!!
Man über Datei -> Neu -> Weitere... auf die registrieren Formulare innerhalb des aktiven Packages zugreifen, und diese ableiten!

Ultimator 8. Nov 2005 18:03

Re: Objektablage
 
Hm, kann man da auch irgendwie "Templates" für neue Projekte anlegen, wie z.B. n DLL-Gerüst, oder ein Unitgerüst mit "Standardcode", den man bei einem leeren Projekt immer wieder eintippen/C&P'en müsste?
Wäre eigentlich praktisch, wenns das gäbe...

//edit in der gleichen Minute hat Sharky die gleiche Frage hier gestellt :lol:

//edit2: Und nu isses geklärt :stupid: : Die Lösung

Hansa 8. Nov 2005 19:56

Re: Objektablage
 
kurze Aktualisierung aus aktuellem Anlass. 8) Ob sich das nun für ganze Projekte, DLLs usw. verwenden läßt ? Keine Ahnung. Um das herauszufinden hilft wohl nur Rechtsklick und nachsehen, wo und wann im Kontextmenü "der Objektablage hinzufügen" auftaucht. Oder einen ganz anderen Ansatz suchen. Alternativ heißt es tief graben, um was darüber zu finden, aber sehr tief.

jetzt noch neues konkretes (kurzes) Beispiel, wie ich es gemacht habe, Rest siehe Anfang :

Nach einem Jahr ist eine Auffrischung auch angebracht. Ganz normal anfangen neues Projekt -> Form ist da. In dieser Form habe ich die Tastatur zuererst mal "behandelt". Also OnKeyPress/OnKeyDown. Z.B. auch mit Esc Form schließen. Dann ab in die Objektablage damit, z.B. unter dem Namen KeyForm.

Weiter, die nächste Form soll ein Datum erhalten und die Nr. der Workstation oben rechts in Form-Ecke. Also neu -> andere. KeyForm gesucht und unbedingt die Radiogroup unten auf inherited setzen !! Ich pappe 2 Labels drauf, ändere im OI die Farben, daß es schöner aussieht, natürlich die Namen usw. Im Formshow werden dann gleich noch die Koordinaten der zwei Labels in Abhängigkeit der Formgröße gesetzt (zur Laufzeit), also so :
Delphi-Quellcode:
  lblDatum.Left := width - (16 * (lblDatum.Font.Size));
  lblStationNr.Left := lblDatum.Left;
Wieder ab ins Repository unter KeyFormLabel oder so. Ab jetzt gehts Schlag auf Schlag, nächste Form davon ableiten. Diese hat die gewünschten Tastaturreaktionen und das Datum und die StationNr stehen immer an der gleichen Stelle, egal wie groß die Form wird.

Gut machen wir mal komplette Lagerverwaltung mit einer Din A 4 Seite Source. :shock: Zwischenzeitlich sind noch mehr Forms als Vorfahr da. Es ist dafür gesorgt, daß es folgende gibt : zusätzlich zu der zuletzt erwähnten hat die Form eine CheckBox "alphabetisch sortieren" eine GroupBox mit "von Nr." und "bis Nr." eine für Ausgabe "Bildschirm", "Drucker". usw. Für die Lagerverwaltung wäre noch das zu gebrauchen : eine Checkbox "Bestände = 0 nicht anzeigen". Das und nur das wird von Hand auf die Form draufgelegt, alles andere ist schon da ! Auch die nichtvisuellen Sachen, wie die Tastaturevents.

Gut, irgendwann vorher hat einer der Vorfahren noch ein Stringgrid zur Anzeige verpaßt gekriegt. Mitsamt eigenem OnDrawCell usw. Dieses hat aber nun keine Ahnung von den Daten, die angezeigt werden sollen, aber bereits dort wurde eine Procedure (als virtual) im protected Abschnitt eingeführt, die bleibt aber da noch leer !! Nennen wir sie "ErmittleDaten" Das ist alles was in der Lagerverwaltung gemacht werden muß : ein SQL-Statement anhand der gemachten Einstellungen (Checkbox angeklickt oder nicht ? usw.) zusammenzubauen. Per override erstzt man dann die vorher leere Prozedur. Eventuell muß noch die Spaltenanzahl des Grids angepaßt werden oder sonstiger Kleinkram.

Ok, das wars. Jetzt brauchen wir noch eine Artikelliste. Wir nehmen denselben Vorfahr wie den von der Lagerverwaltung. Bestand = 0 interessiert da nicht, aber wir wollen entweder Verkaufs oder Einkaufspreis. Also muß andere Groupbox her. Zusätzlich soll das Datum oben in der Ecke aber unbedingt grün werden, weil das schöner ist. :stupid: Tja, die Datumfarbe ändern wir schnell im OI. Die Prozedur ErmittleDaten wird an andere Tabelle angepaßt und fertig.

Edit : fast vergessen 8)

Man muß immer daran denken, die Forms mit "dem Projekt hinzufügen" wirklich dem Projekt mitzuteilen, daß die Form gebraucht wird ! Einfaches Erweitern der Uses Liste genügt normalerweise nicht. Dann tauchen Fehlermeldungen auf wie : "Vorfahr von FormXY nicht gefunden". Da Delphi das allerdings dann auch in die DPR reinschreibt, und eventuell die Reihenfolge der sichtbaren Forms dadurch geändert wird ist es IMHO ratsam, grundsätzlich alle Forms außer der Hauptform und den Datenmodulen erst zur Laufzeit zu erzeugen.

Trotzdem müssen sie erst dem Projekt hinzugefügt werden, um sie dann wieder mit Projekt -> Options auf nicht automatisch erzeugen zu setzen. Delphi macht da noch was mehr, als nur die Uses Liste zu ändern. In diesem Zusammenhang noch das :

Zitat:

Zitat von Borland
...D2005 stores the repository information in an XML file

....\Borland\BDS\3.0\Objrepos\BorlandStudioReposit ory.xml

Older versions use the delphi32.dro file in the Delphi BIN directory for
this purpose. It is a text file...

Ich hatte bei Borland nachgefragt, was denn bei D2005 mit dem Repository sei. Wegen fast keinerlei Äußerungen über die Geschichte (zumindest in keinem deutschen Forum war was zu finden, außer dem von mir selber :lol: ), hatte ich das dumpfe Gefühl, daß wenn es schon keiner benutzt die das einstampfen. :mrgreen: Da sie sich aber offensichtlich die Mühe gemacht haben, das Ganze sogar in eine XML Struktur zu stecken, gehe ich eher vom Gegenteil aus.

torud 24. Okt 2007 19:28

Re: Objektablage
 
Also da ich nun auch mit von der Partie bin, möchte ich kurz meine beiden Probleme schildern.

1. Ich finde leider nicht heraus, wie ich Gespeichertes wieder bearbeiten kann...=> sicher überlesen...

2. Ich habe mir ein ganzes Formular in die OA gelegt und würde dies nun gern als Hauptformular benutzen. Wenn ich aber eine neue Anwendung erzeuge und dann dieses Formular hinzufügen will, kann es ja nicht das Hauptform werden, da ja mit dem neuen Projekt schon eins erzeugt wurde. Ich muss also in den Projektcode gehen und Unit1 manuell entfernen, wenn ich will, dass es klappt...Muss das so sein?

Muetze1 24. Okt 2007 19:39

Re: Objektablage
 
Zu 2.: Nein: Projektoptionen haben eine ComboBox zur Auswahl der Hauptform. Grundsätzlich wird die erste mit Application.CreateForm() erstellte Form zum Hauptformular. Diese Aufrufe stehen im Normalfall in der .DPR Datei vor dem Application.Run. Diese Reihenfolge dort wird von den o.g. Projektoption geändert.

torud 24. Okt 2007 19:45

Re: Objektablage
 
Ok, das konnte ich durchaus nachvollziehen. Das passt soweit schonmal.

Ich wollte aber eigentlich meine eigene Databar in die Objektablage legen. Diese besteht nur aus einem Panel auf der eine Toolbar liegt mit einer Combo und zwei BitButtons. Allerdings wird mir immer das komplette Formular gespeichert, obwohl ich explizit beim Panel rechte Maustaste "Der Objektablage hinzufügen" übergeben habe...komisch :freak:

Muetze1 24. Okt 2007 19:48

Re: Objektablage
 
Die Objektablage übernimmt immer nur Ableitungen von TForm und TFrame. Einzelne kleine Komponenten wie Panels werden nicht berücksichtigt sondern immer nur der direkte Parent - also immer der Untergrund der das Fenster stellt. Zu dem was du erreichen willst, ist die OA nicht gedacht/geeignet.

Aber: Wieso nicht einfach eine TFrame erstellen mit genau diesen Elementen (wobei die TFrame Ableitung das TPanel ersetzt), programmieren etc und dann diese Frame der Objektablage hinzu fügen? Die Frames sind eh dazu gedacht und in Bezug auf deine Forderung wohl die beste Lösung.

torud 24. Okt 2007 20:06

Re: Objektablage
 
Jo jo, Frames sind genau das Richtige. Jetzt muss ich nur noch herausfinden, wie ich einmal angelegte Ablagenobjekte nachträglich bearbeiten kann...

Hawkeye219 24. Okt 2007 20:10

Re: Objektablage
 
Hallo Tom,

was du ursprünglich nutzen wolltest, ist die Komponentenvorlage. Markiere die zu speichernden Komponenten und wähle den Menüeintrag "Komponente -> Komponentenvorlage erzeugen...". Es erscheint ein Dialog, in dem du einen Namen und die Palettenseite für die Komponente bzw. Komponentengruppe wählen kannst. Nach dem Bestätigen werden die markierten Komponenten mitsamt dem zugehörigen Quelltext der Ereignisbehandlungsroutinen in die Komponentenbibliothek übernommen.

Eine Komponentenvorlage bietet sich in den Fällen an, wo ein Frame nicht nutzbar ist, weil z.B. die Komponenten keinen zusammenhängenden Bereich auf dem Formular bilden.

Gruß Hawkeye

Hansa 24. Okt 2007 20:12

Re: Objektablage
 
zu 1. : wie, gespeichert und neu bearbeiten ? :shock: Das steckt doch alles in den Form Units. Du musst die Form eben öffnen und bearbeiten. Sofern sie vererbt wird auch dran denken, dass sich Änderungen auf alle Nachfahren auswirken. Plane das von Anfang an bloß gut !

zu 2. : das "Hauptformular" hat doch keine eigene Bedeutung. Es wird eben standardmäßig erst mal eins erzeugt. Stelle dir mal vor das wäre nicht da und ein Anfänger müsste erstmal mit Datei -> neu -> Forms eine erzeugen. Entwerfe ein Formular so weit, wie es am Anfang Sinn macht. Also nicht zuviel auf einmal. Vererbe die besser später immer feiner. Schiebe das "Hauptformular" dann in die Objektablage.

Nun entferne es aus dem Projekt (Projekt -> aus Projekt entfernen). Guck dir jetzt mal die DPR an. Die hat kein Formular mehr ! Das aus der Objektablage soll nun das "Hauptformular" werden ? Dann wie gehabt : Datei -> neu -> weitere. Gewünschtes Formular auswählen, in diesem Fall eben das, was vorher in die Objektablage geschoben wurde. Wieder DPR angucken und Programm mal laufen lassen.

P.S.: hier gehts nur um die Objektablage und nicht darum, ob sie für einen speziellen Zweck das richtige ist. Bitte beachten ! Meine Antwort bezieht sich deshalb nur auf die Objektablage und die Fragen hierzu. Was Muetzze meint ist wohl, dass man nicht ein loses Panel da reinschieben kann. Das hat auch keiner gesagt. In dem anderen Thread gng es darum, nicht immer denselben Code in mehrere Forms einbauen zu müssen. Genau dazu ist die Objektablage gedacht. Die Form kann sehr wohl auch nichtvisuelle Sachen enthalten, die vererbt werden können. Was habe ich da diverse eigene Funktionen, die vererbt werden ! Was noch hierbei wichtig ist : die müssen mind. in den protected ABschnitt der Form. Frei rumlaufende Funktionen etc. die kapselt man besser in separater Unit und schreibt sie in die uses-Klausel.

Muetze1 24. Okt 2007 20:23

Re: Objektablage
 
Zitat:

Zitat von Hansa
Was Muetzze meint ist wohl, dass man nicht ein loses Panel da reinschieben kann. Das hat auch keiner gesagt.

Klar, wurde aber von torud gefragt (bzw. nach seinen Erklärungen hat er dies versucht) und nicht gesagt.

Zitat:

Zitat von Hansa
Was noch hierbei wichtig ist : die müssen mind. in den protected ABschnitt der Form.

Was aber eher in ein OOP Tutorial gehört, da dies OOP Standard ist...

@torud: Die Komponentenablage hatte ich glatt vergessen (da bisher noch nie genutzt). Dies wäre dann sogar noch eine schnellere Alternative als eine Frame mit der OA zu nutzen. Also am besten Hawkeye219's Vorschlägen folgen...

torud 24. Okt 2007 20:37

Re: Objektablage
 
Gigantisch!!!

Alle Eure Beiträge haben mich doch recht weit gebracht und dank Hawkeye219's Tipp habe ich nun eine doch recht schnelle Lösung gefunden. Auf jeden Fall habe ich wieder einiges dazu gelernt.

Ich werde mir nun nur noch überlegen müssen, wie ich meine Probleme Codetechnisch noch lösen kann, damit das automatisierte und inhaltsunabhängige Speichern auch immer klappt.

Aber das ist ein anderes Thema, dass hier nicht her gehört.

Hansa 25. Okt 2007 00:04

Re: Objektablage
 
Alternativen für Objektablage (leider ohne OOP) :

Als erstes wäre da mal Cut + Paste zu nennen, d.h. man markiere sich seine Komponenten auf einer Form. Mehrere markieren geht mit <Shift> + linke Maustaste. Dann eben kopieren und auf neuer Form einfügen. Hierbei werden die eventuell vorhandenen Ereignisse der beteiligten Komponenten aber nicht mitkopiert. Das was im OI bereits eingestellt ist wird allerdings kopiert.

Ist umfangreicher Code für die Ereignisbehandlung vorhanden, so muss man den auch markieren, einfügen usw. Beim letzten Schritt bietet Delphi etwas Unterstützung. Sind die zu verwendenden Komponenten markiert, dann kann man oben auf Komponente -> "Komponentenvorlage erzeugen" gehen. Aber Achtung ! Mit eigenen Komponenten hat das überhaupt nichts zu tun !! Man wird danach in der Komponentenpalette einen Eintrag "Vorlagen" finden. Wenn man nun eine dieser Vorlagen auf eine Form legt, so spart man sich, jede Komponente einzeln auf eine Form zu ziehen. Das läuft ungefähr auf dasselbe hinaus, wie bei der Objektablage nur "kopieren" oder "verwenden" auszuwählen. Hauptunterschied ist allerdings, dass es sich um Komponenten-Gruppen handelt und diese auch bei bestehenden Forms auf einen Schlag (mitsamt Ereignissen) eingefügt werden können. Zur Erinnerung : Objektablage behandelt immer ganze Forms, deren Eigenschaften allerdings vererbt werden können.

Im Prinzip ist und bleibt die Komponenten-Vorlage auch nichts anderes als die Vervielfältigung des Codes. Um die EXE nicht zu sehr aufzublähen könnte man das bei vielen gleichartigen Projekten eventuell sinnvoll einsetzen. In einem einzigen Projekt sind alleine schon die zwangsläufig auftauchenden Redundanzen bedenklich / überflüssig.

Eine Form mit der Objektablage erzeugen (ohne inherited), oder eben eine Form erzeugen und da dann aus den Komponenten-Vorlagen was draufzulegen, ob das Sinn macht, das muss jeder selber wissen. Ich sage : gibt nicht allzuviel her.

Muetze1 25. Okt 2007 00:13

Re: Objektablage
 
Hast du irgendwann auch mal gute Laune bzw. musst du einem irgendwie immer den Tag versauen? So wie dein Beitrag rüberkommt, bekomme ich gerade wieder Sodbrennen. Mir egal, mir reichts. Ich habe meine geistige Ignore-Liste und damit lebe ich gesünder...

Hansa 25. Okt 2007 00:55

Re: Objektablage
 
blubb. Bitte Beitrag löschen.


Spiel doch nicht die beleidigte Leberwurst. :stupid: Es muss nicht sein, dass unter "Tutorials und Kurse" Fragen aus anderen Threads beantwortet werden. Was soll das ? Torud hat diesen Thread hier mit einer konkreten Frage neu aufgerollt. Meine Antwort bezog sich auf die Fragen, die er zur Objektablage hatte. Zu sonst nichts. Danach wurde der andere hier halb fortgesetzt. Wenn das alles jetzt einer in 1 Jahr liest, der steht dann quasi im Wald. Am besten wäre es sogar, die letzten paar Beiträge zu löschen, um zumindest einigermaßen den Kontext zu wahren. Werde meine nicht zum Hauptthema passenden jedenfalls im Laufe des Tages noch selber löschen bzw. unbrauchbar machen.

Edit : geht so nicht. Das sind von heute ja nur 3. Der 1. muss so bleiben, weil Antwort auf Frage. Der 2. muss allgemeiner umgeschrieben werden und der letzte, also der hier kann weg. Und der ist morgen irgendwann auch weg.

angos 25. Okt 2007 07:21

Re: Objektablage
 
Oha,


das ich das so direkt hinzufügen konnte wusste ich noch nicht. Habe das bis jetzt immer so gemacht:

- Form erzeugt, bearbeitet. diese ist ja dann dem Projekt zugeordnet und kann über neu -> "Projektname" abgeleitet werden. Nun habe ich diese FOrms immer den jeweiligen Projekten zugeordnet.. aber wenn sogar den part Delphi für mich übernehmen kann ist das doch superbe! Danke Hansa

[edit] ich sehe erst jetzt wie alt der thread ist :D, trotzdem danke! [/edit]
Gruß

Hansa 3. Aug 2008 20:27

Re: Objektablage
 
Hier mal noch eine Stellungnahme :

Zitat:

I really don't know why the repository, along with form inheritance,
is so little used in Delphi. I know it is powerful and opens up a lot
of possibilities, and I know companies that invested on it and are
generally happy of the outcome.

Seems one of those technologies both CodeGear and the community at
large are not fully aware of... but I have no idea of how to reverse
this trand...
Da ist einer genauso verblüfft, wie ich selber, dass diese Techniken immer noch so gut wie nicht verwendet werden. Würde mal sagen, das ist der Ober-Guru von Object-Pascal. :mrgreen: Name : Marco Cantu. 8)

mkinzler 3. Aug 2008 20:42

Re: Objektablage
 
Ist halt wenig bekannt
http://www.delphipraxis.net/internal...t.php?t=139638

Muetze1 3. Aug 2008 23:44

Re: Objektablage
 
Moin!

Nutzbar? Wenn's richtig funktionieren würde bestimmt.

Als Einzelnutzer ist es bestimmt richtig gut nutzbar, aber wehe du willst die Objektablage zentral verwalten, z.B. Repository, weil man in einem Team arbeitet.

Siehe auch QC #32917

Wir würden es sehr gerne in der Firma einsetzen, aber leider nicht möglich. Siehe Link.

Es sind wie immer die kleinsten Kinderkrankheiten an denen einem der komplette Spass vergeht, wenn man ganze Arbeitstage investiert um dann festzustellen, dass CodeGear mal wieder vieles anfängt aber nichts zu Ende bringt. Man ist ständig nur dabei die Bugs von Codegear zu umschiffen. Die letzten 6 Bugs die einem die Arbeit mit BDS2006 schwer gemacht hatten wurden von Codegear meistens mit "Ist aber in RAD2007 gefixt" bescheinigt. Also neue Version kaufen - in der alten wird nichts mehr gefixt. Aber hoho - sowas darf man auch nicht sagen, dann wird das CodeGear Support und Hotline Team sauer und will solche Aussagen nicht auf sich sitzen lassen...
Und wenn man dann sich mal die neue RAD Studio Version kauft, dann sind die damals gefunden Bugs vllt - aber nur vllt. wirklich behoben, dafür findet man sofort neue Unzulänglichkeiten.

Sorry, aber ich bin mehr als gefrustet mit Codegear. Ich habe früher gerne geholfen, QC Einträge etc, aber seit nun schon 2 Jahren kommt nichts mehr von CodeGear zurück. Es wird nicht gefixt, es wird drauf eingegangen, etc. Es ist mehr als frustrierend.

Einzig Dinge die man bei den Beta Test findet, die werden noch mit hoher Priorität gefixt, aber wer hat noch Lust einen extra Rechner/System aufzusetzen und Zeit mit Beta Test zu verbringen, wenn man im Endeffekt wirklich nichts dafür zurück bekommt.


MfG
Muetze1

Hansa 4. Aug 2008 01:10

Re: Objektablage
 
Bitte für Kritik an einzelnen Delphi-Versionen separaten Thread aufmachen. Hier gehts ums Prinzip, also wie das überhaupt geht. Wird jetzt IMHO seit BDS2005, sowieso in XML-Datei abgespeichert. Da es sich hierbei auch lediglich nur um Textdateien handelt, wundern mich eventuelle Fehler bei gleichzeitiger Nutzung nicht. Notfalls muss das im Team synchronisiert werden, was aber bei etwas genauerer Planung nicht permanent geschehen muss. Das ist zwar diskussionswürdig und würde mich auch interessieren, aber nicht hier.

Muetze1 4. Aug 2008 07:15

Re: Objektablage
 
Moin!

Zitat:

Zitat von Hansa
Wird jetzt IMHO seit BDS2005, sowieso in XML-Datei abgespeichert. Da es sich hierbei auch lediglich nur um Textdateien handelt, wundern mich eventuelle Fehler bei gleichzeitiger Nutzung nicht.

Die alten Dateien waren auch nur reine Textdateien, somit ist höchstens eine bessere Struktur hinzugekommen.

My last 50 Cent
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz