Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi zweites Formular lässt sich nicht anzeigen (https://www.delphipraxis.net/42430-zweites-formular-laesst-sich-nicht-anzeigen.html)

ggfan 18. Mär 2005 17:12


zweites Formular lässt sich nicht anzeigen
 
Ich will in meinem Programm ein zweits Formular anzeigen lassen, doch irgenwie kommt mit dem Befehl show nur eine Zugriffsverletzung raus.
Kann mir da jemand helfen?
Delphi-Quellcode:
program myToDo;

uses
  Forms,
  unmain in 'unmain.pas' {frmmain},
  unnew in 'unnew.pas' {frmnew};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(Tfrmmain, frmmain);
  Application.Run;
end.
Delphi-Quellcode:
unit unmain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CheckLst, Buttons;

type
  Tfrmmain = class(TForm)
    lstToDo: TCheckListBox;
    cmdNew: TBitBtn;
    cmdchange: TBitBtn;
    cmdDelete: TBitBtn;
    lstSortItems: TListBox;
    procedure cmdNewClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  frmmain: Tfrmmain;

procedure
  SortTasks();

implementation
uses unnew;

procedure SortTasks();
Begin
  showmessage('hallo');
end;

{$R *.dfm}

procedure Tfrmmain.cmdNewClick(Sender: TObject);
begin
  frmnew.Show;
end;

end.
Delphi-Quellcode:
unit unnew;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  Tfrmnew = class(TForm)
    GroupBox1: TGroupBox;
    txttitle: TEdit;
    GroupBox2: TGroupBox;
    txtday: TEdit;
    txtmonth: TEdit;
    txtyear: TEdit;
    cmdInputNew: TBitBtn;
    Label1: TLabel;
    Label2: TLabel;
    procedure cmdInputNewClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  frmnew: Tfrmnew;

implementation
uses unmain;
{$R *.dfm}

procedure Tfrmnew.cmdInputNewClick(Sender: TObject);
begin
  unmain.frmmain.lstToDo.AddItem(txtday.Text + '.'+ txtmonth.Text + '.' + txtyear.Text + ': ' + txttitle.Text, unmain.frmmain.lstToDo);
  frmnew.Hide;
end;

end.

toms 18. Mär 2005 17:15

Re: zweites Formular lässt sich nicht anzeigen
 
Hallo,


Und wo wird die Form erzeugt?
Zitat:

frmnew.Show;

ggfan 18. Mär 2005 17:30

Re: zweites Formular lässt sich nicht anzeigen
 
Hast du das so gemeint:
"Tfrmnew.Create(self).Show;"
wenn ja, dann danke. Das funktioniert wunderbar.

Früher als ich meine VB-Phase haate, ging das einfach mit .show, aber man lernt nie aus.

TStringlist 18. Mär 2005 19:39

Re: zweites Formular lässt sich nicht anzeigen
 
kann es event. sein, dass du in deiner Projektdatei irgendwie aus Versehen eine Zeile gelöscht hast, die dort jetzt nämlich eigentlich noch mit anwesend sein müsste, und zwar diese:

Delphi-Quellcode:
 Application.CreateForm(Tfrmnew, frmnew);
Irgendwie spricht dafür auch die Existenz der folgenden Zeile (in der Uses-Klausel deiner Projektdatei):

Delphi-Quellcode:
  unnew in 'unnew.pas' {frmnew};
Beide Zeilen werden nämlich automatisch erzeugt, wenn ich über das Hauptmenue Datei->Neu->Formular meinem Projekt eine weitere Form zufügen möchte. ...Und dementsprechend werden also auch alle nicht dynamisch erzeugte Formen am Programmstart erst einmal durch solche Anweisungen gemeinsam erzeugt. Womit also auch dein erster Show-Form-Versuch:

Delphi-Quellcode:
frmnew.Show;
so dann eigentlich korrekt gewesen wäre. Dein aktueller Versuch, die Form dynamisch mittels

Delphi-Quellcode:
Tfrmnew.Create(self).Show;
zu erzeugen, ist jedoch eher falsch, weil du danach bei jedem neuen Click auf den cmdNew-Button (den nehm ich jetzt mal an) dann nämlich immer wieder eine neue solche Form erzeugen würdest, ohne eine alte solche davor überhaupt noch freigeben zu können. Hierzu hättest du den Ptr "frmnew" bei der Erzeugung der Form nämlich zuerst entsprechend mit laden müssen:

Delphi-Quellcode:
frmnew := Tfrmnew.Create(self);
// danach dann event: frmnew.Show;
um dann nachher irgendwann diese wieder mittels der Free-Methode freigeben zu können:

Delphi-Quellcode:
frmnew.free;
(Solltest du jedoch die wahrscheinlich irgendwie verloren gegangene erste Zeile oben wieder reinstallieren wollen, dann brauchst du jetzt kein eigenes Free'n dieser Form mehr auszuführen (wird dann beim Ende der Application automatisch erledigt)) usw. usf... *g*


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz