Autor Beitrag
hydemarie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Di 17.01.17 02:00 
Angenommen, ich würde gern eine Anwendung basteln, die so ähnlich aufgebaut ist wie ein mehrtabbiger Texteditor, also mit einem identischen Formular in jedem Tab bei beliebig vielen neuen Tabs: Gibt es eine Art Clone-Befehl dafür?
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 17.01.17 08:13 
Hey,

die Frage ist, ob das nötig ist.
Wenn in jedem Tab die gleiche Ansicht kommen soll brauchst Du ja nur eine Ansicht. Und die angezeigten Daten wechselts Du bei Click auf einen Tab einfach aus. Ich verwende dafür immer TabControls eine Table/MemTable. Die ganzen Eingabefelder sind dann einfach Tabellengebunden.

Das klappt sogar wenn sich die Ansichten teilweise unterscheiden. Die Tabs werden von einem TabControl bereitgestellt. Der Wechsel der Ansicht ist dann über ein PageControl möglich bei dem die Tabs unsichtbar sind.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
hydemarie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Di 17.01.17 10:14 
Nun ja, dann müsste ich in jedem Tab bei jedem Anklicken sämtliche dort angezeigten Daten neu einlesen und ggf. verarbeiten, nicht?
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 17.01.17 10:53 
Ja, schon. Dafür arbeitet man da ja mit Tabellen im Hintergrund.

Ein anderer Weg ist, ein PageControl zu verwenden und die eigentliche Verarbeitung nicht im Hauptformular zu implementieren, sondern in einem weiteren.
Pro neuer Datei die Du öffnest erstellst Du dann eine neue Page im PageControl und erzeugts ein neues Formular das Du dann einfach in der neuen Page einbettest.

Ich nutze diese steife Variante aber nie für identische Formulare. Einfach da es deutlich mehr Speicher braucht das ganze Formular zig mal anzulegen als nur die Daten vorzuhalten.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?

Für diesen Beitrag haben gedankt: hydemarie
hydemarie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Di 17.01.17 10:56 
Performance ist mir diesmal tatsächlich ausnahmsweise mal wichtiger als Ressourcen. Mit einer sparsamen Anwendung rechne ich hier schon rein technisch nicht.

Und wie klone ich eine Page?
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 17.01.17 12:31 
Dafür gibt es keine 100% Lösung. Das hängt von zu vielen Faktoren ab um einfach pauschal zu sagen, das geht so oder so.
Neue Page erstellen, neues Formular erstellen und auf der neuen Page einbetten. Dann für alle Controls des Forms die Daten via Assign vom original kopieren.
Alle VCL Controls sollten Assign implementiert haben. Somit sollte das reibungslos funktionieren.
Sollte. Garantieren will ich das nicht. Zudem ist es ein schlechter Programmierstiel die Daten direkt in den Komponenten eines Formulares zu parken. Das macht es mühselig was zu erweitern, und Imports / Exports zu realisieren. Man sieht es ja gerade an Deinem Beispiel, es wird umständlich.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?

Für diesen Beitrag haben gedankt: hydemarie
hydemarie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Di 17.01.17 12:38 
Ohje. Na gut, ich probiere das mal aus...
Aber ich will doch kein "neues" Formular, sondern eine Kopie des alten?
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 17.01.17 14:03 
Das ist schon klar. Aber Du musst dir ja irgendwie die neue Instanz für dein kopiertes Formular erstellen. Dazu ist es nunmal nötig ein neues Objekt deiner Fensterklasse anzulegen.

Ich könnte Dir ja eine kleine Demo schreiben. Aber ich bin mir sicher dass Du mehr Spass daran hast es selber rauszufinden.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
hydemarie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Di 17.01.17 14:22 
Eigentlich nicht. :lol:

Ach so, ich kann mein einmal erzeugtes Formular (also aus dem Designer o.s.ä.) einfach neu instanziieren und schon habe ich zwei unabhängige Exemplate?
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 17.01.17 20:03 
Hm, sieht so aus als habe ich Dich falsch eingeschätzt.

Ein Formular ist ja nur eine Klasse. Also eine Sammlung von Methoden die einem klassifizierten Zweck dienen. Im Fall eines Formulars, Daten anzeigen und empfangen, könnte man sagen.
Willst Du eine Klasse verwenden brauchst Du eine Instanz von ihr die Du dir via Constructor der Klasse holst.

K.a. was für ein Delphi Du verwendest, habe Dir mit XE2 mal eben ein Beispiel zusammengeclickt. Ich kopiere/klone da allerdings noch keinen Formularinhalt. Das ist wie gesagt weder clever, noch gibt es dafür eine Standartlösungen.

€Demo Exe für Schnelltester und Spielfreudige hinzugefügt.
Einloggen, um Attachments anzusehen!
_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?


Zuletzt bearbeitet von Sinspin am Di 17.01.17 22:49, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: hydemarie
hydemarie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Di 17.01.17 20:28 
Tut mir leid, nicht immer besonders smart zu sein. Ich arbeite dran. VCL stellt mich noch vor Rätsel. :)
Ich verwende momentan Delphi 10.1.

Ach so, das Instanziieren einer VCL-Unit legt automatisch eine neue leere Kopie des UIs mit komplett eigenen Einstellungen an?
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 17.01.17 21:43 
Dir braucht nichts leid zu tuen. Ich dachte nur Du hättest schon etwas mehr Erfahrungen mit Delphi. Scheinst aber eher bisher mit anderen Sprachen gearbeitet zu haben.
Nicht die Unit kann instanziert werden. Die Klasse schon. Das ist in Delphi anders gefasst als in anderen Sprachen. Du kannst mehr als eine Klasse pro Unit haben.

Das erste Fenster, also das Hauptfenster wird in der .DPR via der globalen Instanz einer jeden VCL Anwendung (Klasse TApplication) erstellt.
Die anderen Fenster des gleichen Formulares erstelle ich dann jeweils selber indem ich den Constructor selber aufrufe.
Das wird in CreateForm einfach nur versteckt. Die Instanz ist via der globalen Object Variable FrmMultiFormDemo erreichbar. Die braucht man aber nur wenn man von anderen Dialogen/Formularen auf das Fenster zugreifen will. Im Fall meiner selbst erstellten Fenster lasse ich die Object Variablen einfach fallen da sich Application alles merkt und sich später um das aufräumen kümmert solange nicht beim erzeugen via TFrmMultiFormDemo.Create NIL als Parameter übergeben wird.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
hydemarie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Di 17.01.17 21:53 
Ich bin primär in Lisp und C++ unterwegs, Delphi war vor so zwanzig Jahren kurz in meinem Fokus. :)

Zitat:
Du kannst mehr als eine Klasse pro Unit haben.


Ah, da liegt tatsächlich mein Missverständnis, danke. Ich gucke mir deinen Code baldigst an. :)
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 17.01.17 23:52 
- Nachträglich durch die Entwickler-Ecke gelöscht -
hydemarie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Mi 18.01.17 00:24 
Ich möchte so eine Art "besseres BareTail" schreiben, das hatte ich ja in einem anderen Diskussionsstrang schon kurz angemerkt. Dafür möchte ich prinzipiell beliebig viele Tabs gleichzeitig geöffnet haben, in denen jeweils eine Logdatei überwacht (ggf. gefiltert, markiert, ...) werden kann, also unabhängig von den anderen.

Kann nicht so schwer sein, dachte ich.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.01.17 02:02 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 18.01.17 07:40 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Ok, so funktioniert die Anwendung "BareTail" auch in etwa. Und was soll bei dir nun geklont werden? :D
Das frage ich mich (Jetzt erst recht) auch. Es soll ja pro Tab sicher eine andere Logdatei überwacht werden?

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
hydemarie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Mi 18.01.17 14:46 
Ja, aber dafür reicht "neuen Tab hinzufügen" nicht - ich will auf dem Tab ja was (Textcontrol, Inhalt, ggf. Formatierungsknöpfe) anzeigen. :?
Also muss ich schon was klonen - das (leere) Form nämlich. Anschließend initialisieren.
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 18.01.17 15:48 
Genau das macht der Button ja. Es wird ein Formular, in dem Fall einfach das gleiche wie für das Hauptfenster, nochmal erstellt und eingebettet. So gesehen ist das schon klonen. Nur das wir als Delphianer unter klonen wohl was anderes verstehen.
Denn wir unterscheiden zwischen der Formularvorlage und dem Objekt das eine Instanz der Vorlage ist. Die Anzahl der Objekte die die gleiche Vorlage verwenden ist nicht begrenzt. Das hängt einfach vom Anwendungsfall ab. Eine Vorlage ist generell eine Klasse die irgend eine Aufgabe oder eben ein visuelles Steuerelement kapselt.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?

Für diesen Beitrag haben gedankt: hydemarie
hydemarie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Mi 18.01.17 16:48 
Ah, danke! :) Dann war das also eher ein Phrasenmissverständnis. 8)