Autor Beitrag
hitmiccs
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Do 20.10.05 10:35 
Sorry für den blöden Threadtitel, wusste ehrlich nicht, wie ichs formulieren soll...

Meine Frage:

Ist es möglich, aus einem Formular alle Objekte (Edit-Felder, Buttons, usw) auszuschneiden und in einem anderen (MainForm) wieder einzufügen, und zwar so, dass es funktioniert?
Im Detail: Ich habe ein Programm, das verschiedene Formulare hat, in denen unterschiedliche Aufgaben erledigt werden. Nun (am Ende, wie immer) kam mir die Idee, die Inhalte aus den Formularen auf das MainForm in TabSheets anzuordnen, ist übersichtlicher und braucht nur ein Form.

Geht das? Lassen sich die Units so ändern, dass ich nicht wieder alles von vorne programmieren muss?

Grüße
hitmiccs


Moderiert von user profile iconChristian S.: Topic aus VCL (Visual Component Library) verschoben am Do 20.10.2005 um 11:54
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Do 20.10.05 10:41 
Das Geht mit button1.parent := ...
hitmiccs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Do 20.10.05 10:45 
Blackheart666, kannst du mir das etwas genauer erklären? Muss ich dann in der Unit, die den Quelltext des "geleerten" Forms enthält das "parent" hinter alles setzen? Und was tut dieses "parent" eigentlich?

Steh etwas aufm Schlauch...
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Do 20.10.05 10:51 
Falls Ich Dich jetzt nicht Falsch verstanden hab möchtest Du
Komoponenten mehrfach oder auf einer anderen Form benutzen !?
Probier mal das.
Dann wei?t Du was Ich meine.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject);
begin
  button1.parent := form2;
  Form2.Show;
end;
hitmiccs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Do 20.10.05 11:00 
Danke für das Beispiel, aber ich meine was anderes...
Ich habe 5 verschiedene, fertige Forms - alle sind mehr oder weniger voll mit Edits und Buttons usw. Nun will ich alles auf das MainForm bringen und in TabSheets verstauen, also quasi nach der Methode:

- TabSheet erstellen
- ich hol mir das (oder die?) Form auf den Schirm und schneide alles aus
- ruf mein TabSheet auf den Schirm
- und füg das ganze per Strg-V wieder ein
- wenn ich den Code geändert habe, lösch ich das ursprüngliche Form komplett

Das ich da am Code was machen muss hab ich mir schon gedacht, wenn es denn überhaupt geht.
Nicht das man mich falsch versteht, das soll nicht zur Laufzeit geschehen (will keinen für dumm verkaufen), ich will mir jetzt (nachdem das Projekt fertig ist) nur eine übersichtlichere Oberfläche bauen...
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Do 20.10.05 11:11 
Hi,

das Funktioniert eigendlich sehr gut, habe ich auch schon einige Male gemacht.

Du kannst einfach alle Komponenten markieren, ausschneiden oder kopieren und im neuen Formular wieder einfügen.
Die Eigenschaften und Positionen der Komponenten bleiben dabei alle erhalten.

Solange es auf dem neuen Formular zu keinem Namenskonflikt mit schon bestehenden Komponenten kommt, werden auch alle Namen so beibehalten.

Zum Schluß mußt du nur noch alle benötigten Funktionen in die neue Unit kopieren und vieleicht überprüfen ob die Events noch alle richtig gesetzt sind.
hitmiccs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Do 20.10.05 11:36 
Wie bringe ich denn der MainUnit bei, das sie für die reinkopierten Komponenten in der neuen Unit suchen muss? Ich hab jetzt meine Komponenten aus der alten Form auf das TabSheet in meiner MainForm eingefügt und eine neue Unit angelegt, und darin steht jetzt der Quelltext aus der alten Unit (die zu dem alten Form gehört hat)... Wie gehts jetzt weiter?
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Do 20.10.05 11:50 
Kopier die Funktionen einfach in die Unit von dem Formular auf das du deine Komponenten kopiert hast und füge sie gegebenenfalls zu der Klasse vom Mainform hinzu.


Das dürfte bei dir jetzt die Unit vom MainForm sein.
hitmiccs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Do 20.10.05 11:57 
Ok, verstanden.
Gibts keine möglichkeit, auf eine andere Unit zu verweisen? Ich frag nur, weil sonst die MainUnit wahnsinnig voll wird...
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Do 20.10.05 12:15 
Doch, du kann auch Teile in andere Units auslagern und diese über uses in deine MainForm unit einbinden.

Aber alle Funktionen einer Klasse müssen mit der definition der Klasse in der selben Unit stehen.

Ausserdem müssen die Funktionen für Events in einer Klasse definiert sein, daher ist es am einfachsten diese auch in der Klasse des Formulars zu belassen.
hitmiccs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Do 20.10.05 12:22 
Danke.
Damit muss ich mich erstmal befassen.

Schönen Tag noch!
hitmiccs
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 765
Erhaltene Danke: 130



BeitragVerfasst: Sa 22.10.05 12:29 
Ich glaube, es geht noch einfacher (hoffe ich, habs aber bicht getestet):
Definiere doch einfach das alte Formular als Frame und lade es (über die Frame-Komponente) in das neue Formular ein. Dann musst Du so gut wie gar nichts ändern (lediglich ein eventueller Datenaustausch muss noch programmiert werden.).

ub60
Tewes
Hält's aus hier
Beiträge: 2

Win NT, Win 2000, Win XP, Win 2003
Delphi 2005 Prof.
BeitragVerfasst: Mi 16.11.05 11:36 
Hatte gerade das ähnliche Problem (man kann z.B. keinen Button direkt auf ein TabSheet ziehen), und nach langem herumprobieren und -lesen folgendes herausgefunden:

1. Die Forms (z.B. FormTabSheet1), die auf die TabSheets sollen bleiben in ihren units

2. In den Eigenschaften der Forms den BorderStyle auf bsNone setzen

3. Im onShow Ereignis der Hauptform
3a. dem FormTabSheet1.Parent := TabSheet1 zuweisen
3b. FormTabSheet1.Show aufrufen


So können die Formulare weiterhin zur Entwurfszeit "grafisch designed" werden.