AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Zur Laufzeit erstellte Elemente werden nicht angezeig
Thema durchsuchen
Ansicht
Themen-Optionen

Zur Laufzeit erstellte Elemente werden nicht angezeig

Offene Frage von "justin.kuhn"
Ein Thema von justin.kuhn · begonnen am 13. Apr 2017 · letzter Beitrag vom 16. Apr 2017
Antwort Antwort
Seite 1 von 2  1 2      
justin.kuhn

Registriert seit: 13. Apr 2017
13 Beiträge
 
#1

Zur Laufzeit erstellte Elemente werden nicht angezeig

  Alt 13. Apr 2017, 21:27
Hallo, ich hoffe, dass ich das richtige Unterthema gewählt habe. Folgendes Problem habe ich mit diesem Code:
Delphi-Quellcode:
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.
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?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Zur Laufzeit erstellte Elemente werden nicht angezeig

  Alt 13. Apr 2017, 21:42
Visible?

gruss
  Mit Zitat antworten Zitat
justin.kuhn

Registriert seit: 13. Apr 2017
13 Beiträge
 
#3

AW: Zur Laufzeit erstellte Elemente werden nicht angezeig

  Alt 13. Apr 2017, 21:49
Habe ich auch schon probiert, klappt aber leider nicht. Trotzdem danke für die fixe Antwort
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Zur Laufzeit erstellte Elemente werden nicht angezeig

  Alt 13. Apr 2017, 21:51
Habe ich auch schon probiert, klappt aber leider nicht. Trotzdem danke für die fixe Antwort
Delphi-Quellcode:
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;
ohne sie sichtbar zu schalten wirst du auch nichts sehen können.

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

Geändert von EWeiss (11. Jul 2019 um 16:47 Uhr)
  Mit Zitat antworten Zitat
justin.kuhn

Registriert seit: 13. Apr 2017
13 Beiträge
 
#5

AW: Zur Laufzeit erstellte Elemente werden nicht angezeig

  Alt 13. Apr 2017, 22:10
Ich habe das jetzt folgendermaßen angepasst:
Delphi-Quellcode:
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;
Entweder habe ich dich noch nicht richtig verstanden, und diese Möglichkeit besteht durchaus, aber es funktioniert noch nicht.
Angehängte Grafiken
Dateityp: jpg Unbenannt.jpg (19,9 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Zur Laufzeit erstellte Elemente werden nicht angezeig

  Alt 13. Apr 2017, 22:15
Was soll TFormular2 denn sein?

Delphi-Quellcode:
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?
gruss
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.667 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Zur Laufzeit erstellte Elemente werden nicht angezeig

  Alt 14. Apr 2017, 11:20
Oops, habe gerade gesehen, dass es schon drei Seiten Antworten gab. Falls sid das Problem also schon erledigt hat, ignoriert mich einfach.

Hallo, ich hoffe, dass ich das richtige Unterthema gewählt habe. Folgendes Problem habe ich mit diesem Code:
Delphi-Quellcode:
 bt1:= TButton.Create(Main);
 bt1.Parent:= Main;

 btEnde:= TButton.Create(Main);
 btEnde.Parent:= Main;
end;
Dein Fehler liegt in der Verwendung der Variablen Main als Onwer (beim Aufruf von TButton.Create) und als Parent (in der Zuweisung). Main ist zu dem Zeitpunkt noch nicht initialisiert, so dass den Buttons als Owner und Parent NIL zugwiesen wird.

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
Thomas Mueller

Geändert von dummzeuch (14. Apr 2017 um 11:22 Uhr)
  Mit Zitat antworten Zitat
justin.kuhn

Registriert seit: 13. Apr 2017
13 Beiträge
 
#8

AW: Zur Laufzeit erstellte Elemente werden nicht angezeig

  Alt 14. Apr 2017, 13:12
Vielen Dank für die zahlreichen Antworten. Ich werde mich am Nachmittag nochmal ausgiebig belesen und weitere Versuche starten.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#9

AW: Zur Laufzeit erstellte Elemente werden nicht angezeig

  Alt 14. Apr 2017, 13:17
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: https://www.amazon.de/Delphi-f%C3%BC...elphi+for+kids
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.683 Beiträge
 
Delphi 5 Professional
 
#10

AW: Zur Laufzeit erstellte Elemente werden nicht angezeig

  Alt 14. Apr 2017, 14:51
Main ist zu dem Zeitpunkt noch nicht initialisiert, so dass den Buttons als Owner und Parent NIL zugwiesen wird.
Eigentlich nicht. Da Main das Hauptformular ist, ist das selbstverständlich mit einer Instanz belegt, auch schon im FormCreate. Außerdem würde es sonst eine AV geben, davon lese ich aber nichts.

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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 by Thomas Breitkreuz