PHP Forum - Coding Board
November 23, 2017, 12:14:42 *
Willkommen Gast. Bitte einloggen oder registrieren.

Einloggen mit Benutzername, Passwort und Sitzungslänge
News:
 
   Übersicht   Hilfe Suche Einloggen Registrieren  
Seiten: [1] 2
  Drucken  
Autor Thema: Dynamische Forms  (Gelesen 271 mal)
0 Mitglieder und 1 Gast betrachten dieses Thema.
berlinermauer
Full Member
***
Beiträge: 129


Profil anzeigen E-Mail
« am: Juni 26, 2009, 07:02:49 »

Hi,
Ich schaffe es nun, dynamisch Forms zu erstellen,
nur wie kann ich der TForm irgendwie anweisen,dass sie FORM5 als Vorlage verwenden soll?
Gespeichert


interNode
Abschaum
Full Member
***
Beiträge: 173



Profil anzeigen E-Mail
« Antworten #1 am: Juni 26, 2009, 07:32:43 »

Volagen in Sinne von -  Mit designer erstllen und dann als Vorlage verwenden - geht meines Wissens nicht.


Du kanndt sie Form aber genausogut per Code erstellen. Dann ist es leicht das Ding als Vorlage zu verwenden.
Gespeichert

Signatur entfernt, da ich mich für mein eigenes Board schämen muss - Syler

Antw.: Danke und die Verwarnung drückt nur deine Hilfslosigkeit über die Aktion aus. Du bistkein guter Admin. Tut mir Leid.
berlinermauer
Full Member
***
Beiträge: 129


Profil anzeigen E-Mail
« Antworten #2 am: Juni 26, 2009, 07:57:27 »

ja genau, aber jeden Button einzel das wird mir zu viel,
ich code gerade ein RAT und will da für jeden PC eine Form haben,
hm und die DFM Dateien sind auch nicht so zu nütze.
Gespeichert


CorVu5
Newbie
*
Beiträge: 32



Profil anzeigen E-Mail
« Antworten #3 am: Juni 26, 2009, 11:12:08 »

TForm ist doch nur die Klasse von der deine Form abgeleitet ist, und als "Vorlage" nimmst du sie, indem du ein neues Objekt deiner Klasse erstellst.
neueform : FORM5;
neueform := FORM5.Create;

nebenbei solltest du deine Typen immer mit einem T beginnen.
Gespeichert
berlinermauer
Full Member
***
Beiträge: 129


Profil anzeigen E-Mail
« Antworten #4 am: Juni 26, 2009, 11:24:25 »

naja ich hatte es so gemacht,
dass ich ein Array of TForm hatte und dann eine ganz neue kreiert habe.

So funktionierts aber hoffentlich, danke dir Smiley

Edit: Fail AccessViolation at Lesen von Address 00000008

Edit: Wenn ich als Owner sich selbst ein geb kommt nen StackOverflow,
dh. es buggt am Parameter von Create der AOwner: TComponent ist
« Letzte Änderung: Juni 26, 2009, 11:27:11 von berlinermauer » Gespeichert


inherited
Newbie
*
Beiträge: 16


Profil anzeigen E-Mail
« Antworten #5 am: Juni 26, 2009, 11:41:39 »

erstell eine eigene 'mutter' klasse die du von TForm ableitest. du kannst ja den konstruktor ueberschreiben, in dem du gewisse dinge, wie form, groesse, position oder einen button ect. selbst uebernehmen kannst. dazu wuerde ich auch das dynamisches array in der mutter klasse definieren und durch den destruktor, der durch die jeweilige instanz aufgerufen wird, das array wieder aufraeumen
Gespeichert
berlinermauer
Full Member
***
Beiträge: 129


Profil anzeigen E-Mail
« Antworten #6 am: Juni 26, 2009, 11:59:26 »

Gespeichert


inherited
Newbie
*
Beiträge: 16


Profil anzeigen E-Mail
« Antworten #7 am: Juni 27, 2009, 12:26:37 »

Code:
type
  TChildForm = class;
  TForm1 = class(TForm)
  private
    childs: array of TChildForm;
  end;

  TChildForm = class(TForm1)
  private
  public
    hier deine funktionen/dein constructor zur fenster gestaltung.
  end;

procedure createchild
begin
  self.childs neu dimensionieren bzw. groesse childs + 1
  self.childs[letztes element] := TChildForm.Create(self)
  self.childs[letztes element].Show
end;

procedure destroychild
begin
  childs[entsprechendes fenster].free / whatever
  childs neuordnen bzw. aufraeumen
end;
so in etwa hab ich mir das vorgestellt. du hast so ein dynamisches und flexibles system um beliebig viele fenster nach deinen vorstellungen zu erstellen. ebenso koenntest du die mutterklasse dementsprechend gestalten, die abgeleiteten fenster haben ja dann die selben eigenschaften. in die child fensterklasse kannst du ja auch noch andere dinge (dinge, die zu deinem fenster gehoeren) unterbringen. so hast du alles geordnet und hast kaum schwierigkeiten etwas zu aendern oder zu erweitern. ist ja nichts anderes als komponenten entwicklung Schockiert)
Gespeichert
berlinermauer
Full Member
***
Beiträge: 129


Profil anzeigen E-Mail
« Antworten #8 am: Juni 27, 2009, 12:35:37 »

Ok danke dir, aber ich wollte ja eben nicht für jeden Button code anlegen müssen, sondern einfach dass er ne Vorhandene Form nimmt.
Gespeichert


inherited
Newbie
*
Beiträge: 16


Profil anzeigen E-Mail
« Antworten #9 am: Juni 27, 2009, 12:45:43 »

wenn du einmal dein fenster gestaltest und es immer wieder neu instanzierst hast du immer wieder das selbe fenster, allerdings ist jedes fuer sich eigenstaendig. es ist quasi wie ein template das du einfach immer wieder neu erstellst. aenderst du die vorlage, ist auch jedes fenster das aus der vorlage heraus erstellt wird, geaendert.

du musst so das fenster nur einmal schreiben (=


kapselst du das ganze in noch eine klasse, so kannst du irgendwelche einmalige informationen die das fenster betreffen im speicher hinterlegen ohne das fenster selbst im speicher zu haben (das das fenster bei bedarf erstellt wird)
Gespeichert
berlinermauer
Full Member
***
Beiträge: 129


Profil anzeigen E-Mail
« Antworten #10 am: Juni 27, 2009, 07:22:01 »

ja schon, aber jeden Button einzeln zu definieren ist doch krank.

Der Vorschlag von Corvu5 wäre nice wenn er gehen würde,

aber du hast recht ich werde es wohl so machen müssen.
Nur ich frage mich, wie ich nen Button auf ner Speziellen Form erstelle,
also dass er ihn nicht auf Form1 macht sondern VicWind
Gespeichert


inherited
Newbie
*
Beiträge: 16


Profil anzeigen E-Mail
« Antworten #11 am: Juni 27, 2009, 10:14:49 »

nochmal: du leitest eine fensterklasse von deiner TForm klasse ab. in deiner abgeleiteten klasse sorgst du fuer das aussehen, buttons usw.
und zwar nur einmal!
erstellst du nun eine instanz dieser klasse, so sieht dein fenster genau so aus wie du es in der klasse beschrieben hast - ist ja auch logisch.
angenommen dein fenster heisst window1. du kannst jetzt aus saemtliche propertys wie z.b. deinen button oder groesse des fensters zugreifen, so machst du das ueber deine window1 klasse (window1.button.enabled usw.)

erstellst du nochmal ein fenster aus der klasse (window2), so sieht dieses fenster ganz genau so aus wie dein window1. selbst deinen button findest du auf window2, allerdings hat er eine andere funktion wie der button auf window1. ist ja auch klar, er ist ja der window2 instanz untergeordnet. ebenso kann man den button ueber den window2 klassen pointer ansprechen (window1.button.enabled).

hast du dann noch eine uebergeordnete klasse, kannst du in ihr das dynamische array definieren. mit zwei funktionen kannst du dann deine fensterklassen in das array eintragen bzw. wieder aufraeumen. und das muss jetzt nicht unbedingt sowas sein, du kannst auch andere funktionen die zur handhabung der child fensterchen dienen dort unterbringen.
bzw. da gabs mal was, vergleichbar mit den static variablen in cpp, das dir eine uebergeordnete klasse ersparen kann, kann mich aber nichtmehr erinnern.

das kleine 'snippet' von mir, genau das ist das oben beschriebene.
dynamisch erstellbare fenster nach einem festen template das du nur einmal beschreiben musst.
Gespeichert
berlinermauer
Full Member
***
Beiträge: 129


Profil anzeigen E-Mail
« Antworten #12 am: Juni 27, 2009, 10:54:10 »

Aber ich muss dafür trotzdem erstmal alles von hand erstellen, oder wie kann ich das von Form5 ableiten?
Gespeichert


inherited
Newbie
*
Beiträge: 16


Profil anzeigen E-Mail
« Antworten #13 am: Juni 27, 2009, 11:02:10 »

und? ist doch kein problem.

du koenntest vielleicht probieren, zur laufzeit gewisse teile der klasse in eine andere zu kopieren. sollte eigentlich auch funktionieren.

wenn das fenster unbedingt zusammen geklickt sein muss, kannst du auch ein fenster aus einem resourcen dialog erstellen. allerdings musst du dann von der vcl abschied nehmen
Gespeichert
inherited
Newbie
*
Beiträge: 16


Profil anzeigen E-Mail
« Antworten #14 am: Juni 28, 2009, 12:07:49 »

klick dir dein fenster zusammen und rufe es folgendermassen auf:
Code:
 wnd := TFenster.Create();
  wnd.Show
wobei wnd dein array sein sollte und TFenster natuerlich die zusammen geklickte fensterklasse. haette auch gleich drauf kommen koennen..
das kommt davon, wenn man nicht mit dem teuflischen delphi arbeitet :>
Gespeichert
Seiten: [1] 2
  Drucken  
 
Gehe zu:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | New Look by Nolt Prüfe XHTML 1.0 Prüfe CSS