AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Objektablage
Tutorial durchsuchen
Ansicht
Themen-Optionen

Objektablage

Ein Tutorial von Hansa · begonnen am 27. Mär 2004 · letzter Beitrag vom 4. Aug 2008
Antwort Antwort
Seite 2 von 4     12 34      
Hansa
Registriert seit: 9. Jun 2002
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...
Gruß
Hansa
 
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#11
  Alt 7. Okt 2004, 12:40
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...
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?
Stefan
  Mit Zitat antworten Zitat
Hansa

 
Delphi 8 Professional
 
#12
  Alt 7. Okt 2004, 13:03
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 ? Verstehe nur Bahnhof.

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

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)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#13
  Alt 7. Okt 2004, 13:19
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...
TForm1 = class(TForm) in...
TForm1 = class(TMyForm) wechselst dann in die Text-Ansicht des Formulars und änderst die Zeile...
object Form1: TForm1 in...
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...

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.
Stefan
  Mit Zitat antworten Zitat
Hansa

 
Delphi 8 Professional
 
#14
  Alt 7. Okt 2004, 13:48
hehe, du machst also die Arbeit, die die Objektablage macht von Hand und dann auch nur die Hälfte davon. 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 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)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#15
  Alt 7. Okt 2004, 13:51
Jo, das weiß ich doch!
Ich würd mir nur gerne das Hinzufügen in die Objektablage innerhalb der Register-Prozedur machen. Weißt du, wie das geht??
Stefan
  Mit Zitat antworten Zitat
Hansa

 
Delphi 8 Professional
 
#16
  Alt 7. Okt 2004, 13:55
ne, kein Plan. Ich traue deinem Hand-inherited sowieso nicht so recht.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#17
  Alt 7. Okt 2004, 14:08
Zitat von Hansa:
ne, kein Plan. Ich traue deinem Hand-inherited sowieso nicht so recht.
Halloo??? Ich praktiziere kein Hand-Inherited (mehr)!!!
Man über Datei -> Neu -> Weitere... auf die registrieren Formulare innerhalb des aktiven Packages zugreifen, und diese ableiten!
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

 
FreePascal / Lazarus
 
#18
  Alt 8. Nov 2005, 19:03
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

//edit2: Und nu isses geklärt : Die Lösung
Julian J. Pracht
  Mit Zitat antworten Zitat
Hansa

 
Delphi 8 Professional
 
#19
  Alt 8. Nov 2005, 20:56
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. 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. 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 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 ), hatte ich das dumpfe Gefühl, daß wenn es schon keiner benutzt die das einstampfen. 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.
  Mit Zitat antworten Zitat
torud

 
Delphi XE5 Professional
 
#20
  Alt 24. Okt 2007, 20:28
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:41 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