Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Createn einer vorher nicht definierten Instanz


Luzifer - Sa 30.12.06 21:03
Titel: Createn einer vorher nicht definierten Instanz
Hi Leute

ich hab da etwas etwas seltsames vor... Und zwar möchte ich eine (vorbereitete) Istanz einer Klasse createn, die durch eine Variable festgelegt wird.


Delphi-Quelltext
1:
2:
3:
var myarray : array of TForm;
begin
myarray[eineZahl]:=TForm((eineZahl)).Create(self);


ich hoffe ihr versteht worauf ich hinaus will. Ich möchte, wenn "eineZahl" z.B. "2" ist die vorbereitete Form2 createn usw... leider funktioniert das so wie ich es oben geschrieben habe natürlich nicht... (ich habs natürlich ohne doppelte Klammern geschrieben)

thx for help

greez


Kroko - Sa 30.12.06 21:11

Da wirst Du wohl um ein case schlecht herumkommen,

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var myarray : array of TForm;
begin
  case eineZahl of
    1: myarray[eineZahl]:=TForm1.Create(self);
    2: myarray[eineZahl]:=TForm2.Create(self);
  end;
end;


alias5000 - Sa 30.12.06 21:38

Je nach Benennung, möglich wäre ja theoretisch:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var i: integer
myarray: array[2..4of TForm;
begin
for i 2 to 4 do begin
  myarray[i] := TForm('Form' + inttostr(i)).Create(Application;
end;


Kommt aber drauf an, ob sowas Sinn macht.


Kroko - Sa 30.12.06 21:44


Delphi-Quelltext
1:
 myarray[i] := TForm('Form' + inttostr(i)).Create(Application;                    

einen String in Tform typecasten, das soll gehen ? Habe ich noch nie gesehen bzw. gehört!


alias5000 - Sa 30.12.06 22:37

Iss ungetestet, aber ich hab sowas glaub schonmal gesehen.
Ansonsten darfst du meinen Info- Lehrer höchst persönlich ankreiden^^


Luzifer - Sa 30.12.06 22:45

ja gut das mit dem case wird wohl funktionieren, aber leider sind das nen paar hundert......

das andere funktioniert so leider auch nicht


Bernhard Geyer - Sa 30.12.06 22:53

Und wenn Du von deinen Lehrer überraschen willst, dann wende gleich das Fabrikmuster (http://de.wikipedia.org/wiki/Fabrikmuster) an.


Gausi - Sa 30.12.06 23:36

Bist du dir sicher, dass du ein paar hundert verschiedene Form-Klassen benötigst? Was ist das denn für ein Monster-Projekt mit 100 Units (vorausgesetzt, für jede Form eine Unit) :shock:


Luzifer - So 31.12.06 00:24

naja sie werden ja nicht alle gleichzeitig benötigt, aber es gibt leider so viele verschiedene Möglichkeiten.... wo wir grad bei Möglichkeiten sind: Gibt es denn keine andere Lösung als die Case of Methode?


Bernhard Geyer - So 31.12.06 01:20

user profile iconLuzifer hat folgendes geschrieben:
naja sie werden ja nicht alle gleichzeitig benötigt, aber es gibt leider so viele verschiedene Möglichkeiten.... wo wir grad bei Möglichkeiten sind: Gibt es denn keine andere Lösung als die Case of Methode?

Die Frage ist aber ob dein Ansatz (mit verschiedenen Formularen) nicht falsch ist. Dazu ist es aber nötig mehr über die Aufgabe zu wissen. Evtl. ist ja ein(e) Formular(klasse) ausreichend welche über Properties konfiguriert ist ausreichend.


Luzifer - Mo 01.01.07 04:30

ok ich werde das problem wohl anders lösen müssen, aber eine Frage hab ich dann doch noch (bzw eine ist noch aufgetaucht):


Delphi-Quelltext
1:
2:
3:
var myvariab : TForm;
begin
myvariab:=TForm2.Create(self);

das funktioniert


Delphi-Quelltext
1:
2:
3:
var myarray : array of TForm;
begin
myarray[0]:=TForm2.Create(self);

das nicht (Fehlermeldung: Exception der Klasse EAccessViolation mit der Meldung "Zugriffsveretzung bei....")

Wieso nicht??


Martok - Mo 01.01.07 04:37

user profile iconLuzifer hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
var myarray : array of TForm;
begin
SetLength(myarray,1)  // 1 Element möglich
myarray[0]:=TForm2.Create(self);

das nicht (Fehlermeldung: Exception der Klasse EAccessViolation mit der Meldung "Zugriffsveretzung bei....")

Du hast da ein dynamisches Array. Dem musst du zunächst eine Länge zuweisen, da du sonst ins 'nichts' fasst.

user profile iconLuzifer hat folgendes geschrieben:
ok ich werde das problem wohl anders lösen müssen

Die Frage bleibt bestehen: was ist dein Problem? Da gibts bestimmt eine ganz einfache Lösung ;)


Luzifer - Mo 01.01.07 18:12

danke dir für deine Lösung! (Hätte man auch selber drauf kommen können) :oops: :roll:

Mein Prob ist noch immer das aus dem ersten Post...


Martok - Mo 01.01.07 18:14

user profile iconLuzifer hat folgendes geschrieben:
Mein Prob ist noch immer das aus dem ersten Post...

Schon klar. Aber wieso hast du 100 Form-Klassen? Das größte Projekt was ich kenne hat 25, grob geschätzt. Wie schonmal gesagt wurde: da kann man was dran ändern.


Luzifer - Mo 01.01.07 21:38

naja es gäbe schon die Möglichkeit die Formen zu sparen, aber dann müsste ich andere Komponenten in ähnlicher Weise createn. (Es soll eine Art Enzyklopädie für die Bibel werden, ich mache das ehrenamtlich für die Kirche.... *Bitte keine Anspielungen auf meinen Nick* ;) )
Das Prob an sich würde also weiterhin bestehen. Und selbst, wenn sich das Problem mit einer anderen Methode in diesem Fall umgehen lässt, würde mich (muss ich zugeben) die Frage im allgemeinen interessieren ob sowas überhaupt geht.


alias5000 - Mo 01.01.07 21:48

Ja irgendwie sicher. Trotzdem was anderes. Ich ahne, was du machen willst:

du hast irgendwelche Informationsboxen, sagen wir mal z.B. Erläuterungen zu Bibeltexten. Jede Form ist eine Erläuterung, du hast dort im Formdesigner für jede Erläuterung/Form einen Text in eine Komponente (Label, Memo,...) eingegeben. D.h. du hast dann z.B. 100 ERläuterungen, also 100 Forms, in denen der Text statisch (jede Form hat einen fest zugeordneten Text) eingetragen ist.

Haut das vom Prinzip her hin, oder liege ich vollkommen abseits? Bibeltexte hab ich jetzt nur als Beispiel genommen, kann alles mögliche sein.

Sollte dies der Fall sein, könntest du doch die entsprechenden Texte (und/oder Grafiken, was auch immer du hast), als Dateien ablegen und dann einfach in eine Form laden, die für alle Erläuterungen dienen soll.

Gruß alias5000