![]() |
Zur Laufzeit erstellte Elemente werden nicht angezeig
Hallo, ich hoffe, dass ich das richtige Unterthema gewählt habe. Folgendes Problem habe ich mit diesem Code:
Delphi-Quellcode:
Wenn ich das Programm ausführe, sehe ich ein leeres Formular. Ich kann also keine Buttons etc. sehen und folglich nichts ausführen. Kennt jemand eine Lösung für das Problem?
unit uMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, uForm2; type TMain = class(TForm) procedure FormCreate (Sender: TObject); procedure NeuesFenster (Sender: TObject); procedure F2Close (Sender: TObject); procedure MainClose (Sender: TObject); private { Private declarations } bt1: TButton; bt2: TButton; F2: TFormular2; btEnde: TButton; public { Public declarations } end; var Main: TMain; implementation {$R *.dfm} procedure TMain.FormCreate(Sender: TObject); begin bt1:= TButton.Create(Main); bt1.SetBounds(20,20,160,60); bt1.Parent:= Main; bt1.Caption:= 'Neues Fenster'; bt1.OnClick:= NeuesFenster; btEnde:= TButton.Create(Main); btEnde.SetBounds(20,100,160,60); btEnde.Parent:= Main; btEnde.Caption:= 'Schliessen'; btEnde.OnClick:= MainClose; end; procedure TMain.NeuesFenster(Sender:TObject); begin F2:=TFormular2.Create(Main); F2.Show; bt2:= TButton.Create(F2); bt2.SetBounds(20,20,160,100); bt2.Parent:= F2; bt2.Caption:= 'Formular schließen'; bt2.OnClick:= F2Close; bt1.enabled:=false; end; procedure TMain.F2Close(Sender: TObject); begin F2.Close; bt1.enabled:=true; end; procedure TMain.MainClose(Sender: TObject); begin close; end; end. |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Visible?
gruss |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Habe ich auch schon probiert, klappt aber leider nicht. Trotzdem danke für die fixe Antwort :)
|
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
Delphi-Quellcode:
ohne sie sichtbar zu schalten wirst du auch nichts sehen können.
procedure TMain.NeuesFenster(Sender:TObject);
begin F2:=TFormular2.Create(Main); F2.Show; bt2:= TButton.Create(F2); bt2.SetBounds(20,20,160,100); bt2.Parent:= F2; bt2.Caption:= 'Formular schließen'; bt2.OnClick:= F2Close; bt1.enabled:=false; bt1.Visible := True; //<< warum soll das nicht gehen? bt2.Visible := True; //<< warum soll das nicht gehen? end;
Delphi-Quellcode:
bt2:= TButton.Create(self); //Form1, oder self, oder wie bei dir F2
bt2.SetBounds(20,20,160,100); bt2.Parent:= self; bt2.Caption:= 'Formular schließen'; bt2.Visible := True; //<< warum soll das nicht gehen? Ich sehe einen wunderschönen Button. gruss |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe das jetzt folgendermaßen angepasst:
Delphi-Quellcode:
Entweder habe ich dich noch nicht richtig verstanden, und diese Möglichkeit besteht durchaus, aber es funktioniert noch nicht.
procedure TMain.FormCreate(Sender: TObject);
begin bt1:= TButton.Create(Main); bt1.SetBounds(20,20,160,60); bt1.Parent:= Main; bt1.Visible:= True; //Das geht nicht bt1.Caption:= 'Neues Fenster'; bt1.OnClick:= NeuesFenster; btEnde:= TButton.Create(Main); btEnde.SetBounds(20,100,160,60); btEnde.Parent:= Main; btEnde.Visible:= True; //Das geht nicht btEnde.Caption:= 'Schliessen'; btEnde.OnClick:= MainClose; end; procedure TMain.NeuesFenster(Sender:TObject); begin F2:=TFormular2.Create(Main); F2.Show; bt2:= TButton.Create(F2); bt2.SetBounds(20,20,160,100); bt2.Parent:= F2; bt2.Caption:= 'Formular schließen'; bt2.OnClick:= F2Close; bt1.enabled:=false; bt2.Visible:=true; //Das geht nicht end; |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Was soll TFormular2 denn sein?
Delphi-Quellcode:
gruss
F2 : TForm
//............. F2 := TForm.Create(nil); F2.Show; bt2:= TButton.Create(F2); bt2.SetBounds(20,20,160,100); bt2.Parent:= F2; bt2.Caption:= 'Formular schließen'; bt2.Visible := True; //<< warum soll das nicht gehen? |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Damit du nicht soviel raten must.
Delphi-Quellcode:
Es gibt kein TFormular2...
unit uMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMain = class(TForm) procedure FormCreate(Sender: TObject); procedure NeuesFenster (Sender: TObject); procedure F2Close (Sender: TObject); procedure MainClose (Sender: TObject); private { Private-Deklarationen } bt1: TButton; bt2: TButton; F2: TForm; btEnde: TButton; public { Public-Deklarationen } end; var Main: TMain; implementation {$R *.dfm} procedure TMain.F2Close(Sender: TObject); begin F2.Close; bt1.enabled:=true; end; procedure TMain.FormCreate(Sender: TObject); begin bt1:= TButton.Create(self); bt1.SetBounds(20,20,160,60); bt1.Parent:= self; bt1.Caption:= 'Neues Fenster'; bt1.OnClick := NeuesFenster; bt1.Visible := True; btEnde:= TButton.Create(self); btEnde.SetBounds(20,100,160,60); btEnde.Parent:= self; btEnde.Caption:= 'Schliessen'; btEnde.OnClick:= MainClose; btEnde.Visible := true; end; procedure TMain.MainClose(Sender: TObject); begin close; end; procedure TMain.NeuesFenster(Sender: TObject); begin F2 := TForm.Create(self); F2.Show; bt2:= TButton.Create(F2); bt2.SetBounds(20,20,160,100); bt2.Parent:= F2; bt2.Caption:= 'Formular schließen'; bt2.OnClick:= F2Close; bt1.enabled:=false; bt2.Visible := true; end; end. Siehe F2: TForm; EDIT: Du must F2 von TForm ableiten wie schon gesagt TFormular2 gibt es nicht. Es sei denn du hast dafür eine eigene Classe angelegt. bsp.
Delphi-Quellcode:
gruss
TFormular2 = class(TForm)
private { Private-Deklarationen } public { Public-Deklarationen } end; |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Formular2 ist in einer gesonderten Unit. Das Formular wird eben durch einen Button geöffnet und wieder geschlossen. Hier der Code aus der Unit uForm2
Delphi-Quellcode:
Und egal, wie ich es anstelle, ich sehe einfach keine Buttons. Ich habe auch schon mit der Vorlage meines Informatik-Lehrers verglichen - keine neue Erkenntnis.
unit uForm2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TFormular2 = class(TForm) private { Private declarations } public { Public declarations } end; implementation {$R *.dfm} end. |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
|
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
Vergleich das mal mit deinem. gruss |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Habs gerade auch mal getestet und einfach deinen Code Copy-Pasted.. ich sehe 2 Buttons oben links...
|
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
![]() Das muss gehen wenn der Button Visible geschaltet wurde. :) EDIT: Wenn du Delphi7 hast öffne die *.dpr nicht das Projekt *.dproj das ist für D2010 gruss |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
[QUOTE=EWeiss;1367574]
Zitat:
Delphi-Quellcode:
program Project1;
uses Forms, uMain in 'uMain.pas' {Main}, uForm2 in 'uForm2.pas' {Formular2}; {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; //Fehler (undeclared identifier: 'MainFormOnTaskbar' Application.CreateForm(TMain, Main); Application.CreateForm(TFormular2, Formular2); Application.Run; end. |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
Bedenke das ist D2010 nicht D7 gruss |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Liste der Anhänge anzeigen (Anzahl: 2)
Entschuldigt jetzt bitte, meine laienhafte Ausdrucksweise, aber beim Compilieren des Projekts habe ich bei mir ein Icon mit einer 7 und bei deinem Projekt ist eben ein anderes Icon in der Kopfzeile. Ist da ein Zusammenhang? Oder liegt das nur an den unterschiedlichen Versionen?
|
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
Das kannst du ändern einfach Project1.res löschen. (Die wird dann neu erstellt) Funktioniert es denn jetzt oder immer noch nicht. Wenn nicht ist etwas mit deinem D7 nicht in Ordnung selbst D1 ist dazu in der lage. gruss |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
|
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
Da bleibt dir nichts anderes übrig als alles genau zu untersuchen was du falsch machst beim kopieren. Frohe Oster ;) PS: projekt1 ist keine Unit sondern deine Projekt *.dpr Datei. program Project1; öffne die Datei mal mit einem Text Editor. gruss |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Noch ein kleiner Tipp von mir:
wechsle doch zu Delphi 10.2 Tokyo - das ist in der Starter-Version mehr als ausreichend und kostenlos. Schmeiß dein altes Delphi 7 über Bord. Delphi 10.2 Tokyo Starter Download: ![]() |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
Software der Schule.. da kann man nicht machen was man will. Die müssen untereinander Kompatibel bleiben. gruss |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
|
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
gruss |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
An den Themenersteller:
wenn du einfach Copy-Paste machst und dann etwas nicht funktioniert ("unit project1 fehlt")... das bedeutet für mich ganz klar, dass euer "Lehrer" euch nicht einmal die Grundlagen über den Aufbau einer Delphi-Unit beigebracht hat. Irgendwie kommen mir diese.... "Delphi-Lehrer" alle vor die umgeschulte Köche oder Handwerker. Programmaufbau: ![]() |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
Aber irgendwo habe auch ich meine grenzen. Ich hoffe das er es noch hinbekommt.. irgendwie. Haben alle mal angefangen. Dein Link wird ihm wohl helfen.. ;) gruss |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
Aber ja. Meinen Link mal angucken, um den Aufbau einer Unit zu verstehen. Dann sieht man auch gleich, was man Copy-Pasten darf und was eher nicht. |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Oops, habe gerade gesehen, dass es schon drei Seiten Antworten gab. Falls sid das Problem also schon erledigt hat, ignoriert mich einfach.
Zitat:
Wenn Du statt Main die implizite Variable Self verwendest, wird es funktionieren. Self ist in Methoden eines Objekts (ein Formular ist ein Objekt) immer die aktuelle Instanz des Objekts, also immer korrekt initialisiert. twm |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Vielen Dank für die zahlreichen Antworten. Ich werde mich am Nachmittag nochmal ausgiebig belesen und weitere Versuche starten.
|
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Auch dir empfehle ich sehr gerne das Buch Delphi for Kids.
Das Buch ist zwar für Kinder aber genau deswegen ist alles sehr leicht erklärt und auch für Erwachsene verständlich die nicht gerade der IT-Ecke entspringen. Amazon: ![]() |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
Ich finde den Quelltext generell schwierig. Da wird schamlos auf ein anderes Formular aus einer Unit zugegriffen, bei jedem Buttonclick wird eine neue Instanz von Formular und Button erzeugt, aber an keiner Stelle wieder freigegeben (schicke Speicherlecks) usw. Ich würde die Buttons als Felder der zweiten Formklasse machen, das Erzeugen und Freigeben läuft dann auch innerhalb dieser Form/Klasse. Oder so wie EWeiss es gezeigt hat, aber vermutlich hat der Lehrer einen Grund, eine zweite Unit/Klasse zu benutzen. Grüße Dalai |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Wieso nicht einfach die Buttons im Designer auf das Formular platzieren und diesen ganzen Mist mit dem Erzeugen zur Laufzeug sein lassen?
|
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
Denn wenn ich schon alle Controls dynamisch erzeuge dann sollte man das auch mit den Form's so halten. Wer weis schon was er sich dabei gedacht hat. gruss |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
Denn das kann ja jeder. gruss |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Ich habe mir auf Empfehlung mal das Buch Delphi für Kids zugelegt und Delphi mit dem Download des Buches neu installiert, um Fehlerquellen meiner bisherigen Installation auszuschließen. Das Buch konnte mir vor allem bei theoretischen Fragen bereits weiterhelfen. Mein eigentliches Problem ist jedoch noch nicht gelöst. Selbst bei den simpelsten Projekten, tauchen beim Ausführen keine Elemente auf. Meine Vorgehensweise: Ich öffne eine neues Projekt und speichere dieses zunächst. Dann benenne ich das Formular um und beginne, das Programm zu programmieren. Hier ein weiteres Experiment, auch wieder ohne Erfolg:
Delphi-Quellcode:
unit uMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMain = class(TForm) procedure FormCreate(Sender: TObject); procedure Willkommen(Sender: TObject); private { Private-Deklarationen } btHallo:TButton; lblHallo:TLabel; public { Public-Deklarationen } end; var Main: TMain; implementation {$R *.dfm} procedure TMain.FormCreate(Sender: TObject); begin SetBounds(150,150,230,260); Caption := 'Hallo'; btHallo := TButton.Create(Main); btHallo.Parent := Main; btHallo.Visible := True; btHallo.SetBounds(50,20,120,50); btHallo.Caption := 'Hallo'; btHallo.OnClick := Willkommen; end; procedure TMain.Willkommen(Sender: TObject); begin lblHallo := TLabel.Create(Main); lblHallo.Parent := Main; lblHallo.Visible := True; lblHallo.SetBounds(50,90,120,50); lblHallo.Caption := 'Willkommen'; end; end. |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Liste der Anhänge anzeigen (Anzahl: 1)
Dein Beispiel funktioniert bei mir ohne Probleme....
|
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
|
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Vielleicht liegt es ja an Delphi 7? Das Beispiel da oben wurde mit 10.2 Tokyo (gibt es auch kostenlos) kompiliert.
|
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Bei meinem D6 funktioniert es auch einwandfrei, somit sollte es auch mit D7 funktionieren.. ;) |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Mal eine andere Frage: sind die Methoden denn auch den entsprechenden Events zugewiesen, oder wurde der Code einfach nur "frei Hand" eingetippt? Schau doch mal im Objektinspektor auf der Seite Ereignisse nach.
|
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Beispiel in #37 (EXE und Compilation) funktioniert auch in WIN8.1, XE7.
Code in #1 funktioniert mit kleinen Änderungen - an XE7 angepasst:
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure NeuesFenster(Sender:TObject); procedure F2Close(Sender: TObject); procedure FC(Sender: TObject); private { Private-Deklarationen } bt1: TButton; bt2: TButton; F2: TForm; btEnde: TButton; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FC(Sender: TObject); begin Application.Terminate; end; procedure TForm1.FormCreate(Sender: TObject); begin bt1:= TButton.Create(Self); bt1.SetBounds(20,20,160,60); bt1.Parent:= Self; bt1.Caption:= 'Neues Fenster'; bt1.OnClick:= NeuesFenster; btEnde:= TButton.Create(Self); btEnde.SetBounds(20,100,160,60); btEnde.Parent:= Self; btEnde.Caption:= 'Schliessen'; btEnde.OnClick:= FC; end; procedure TForm1.NeuesFenster(Sender:TObject); begin F2:=TForm.Create(Self); F2.Show; bt2:= TButton.Create(F2); bt2.SetBounds(20,20,160,100); bt2.Parent:= F2; bt2.Caption:= 'Formular schließen'; bt2.OnClick:= F2Close; bt1.enabled:=false; end; procedure TForm1.F2Close(Sender: TObject); begin F2.Close; bt1.enabled:=true; end; end. |
AW: Zur Laufzeit erstellte Elemente werden nicht angezeig
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz