AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Form dynamisch erzeugen

Ein Thema von whiteF · begonnen am 16. Okt 2016 · letzter Beitrag vom 24. Okt 2016
Antwort Antwort
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#1

Form dynamisch erzeugen

  Alt 16. Okt 2016, 23:35
Hallo,
ich möchte eine Form dynamisch erstellen lassen. Die dynamische Form namens "FormMessengerNW" habe ich bereits in Delphi erstellt und mit labels bestückt. Über eine public Variable bestimme ich einen Text den ich bei der Form "FormMessengerNW" beim OnShow einlesen/anzeigen möchte.
Die "FormMessengerNW" ist ein Hinweisfenster das am Rand eingeblendet wird und mit einem Timer nach ein paar sekunden wieder verschwindet (oder mittels close button).
Diese Form funktionierte an sich bereits als ich sie direkt aufrief, jedoch bekomme ich den dynamischen Aufruf nicht ganz hin.

Das hatte ich bereits probiert:

Form1
Delphi-Quellcode:
...
var
  FormMessengerNW_Instanz : TFormMessengerNW;
begin
...
    try
      showmessage('0');
      FormMessengerNW_Instanz := FormMessengerNW.Create(Application.MainForm);
      FormMessengerNW_Instanz.OnCreate:= FormMessengerNW.OnCreate;
      FormMessengerNW_Instanz.OnShow := FormMessengerNW.OnShow;
      FormMessengerNW_Instanz.OnClose := FormMessengerNW.OnClose;
    finally
    showmessage('1');
      FormMessengerNW_Instanz.Show;
      showmessage('2');
    end;
...
FormDyn
Delphi-Quellcode:
procedure TFormMessengerNW.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  //FormMessengerNW.Release;
end;

procedure TFormMessengerNW.FormShow(Sender: TObject);
begin
  showmessage('form open');
end;

procedure TFormMessengerNW.FormCreate(Sender: TObject);
begin

  (Sender as TForm).AlphaBlendValue := 235;

  lblTitle.Left := 35;

  imgClose0.Top := imgClose0.Top;
  imgClose0.Left := 324;
  imgClose1.Top := imgClose0.Top;
  imgClose1.Left := imgClose0.Left;

  reMessage.Width := 323;
  reMessage.Left := 15;
  reMessage.Top := 30;
  reMessage.Height := 62;
end;
das showmessage "2" wird nicht mehr eingeblendet.
Es kommt immer "EAcces Vioalation"


Wie würdet ihr soetwas lösen?

VG
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#2

AW: Form dynamisch erzeugen

  Alt 16. Okt 2016, 23:38
Da es das Formular ja bereits gibt, probier statt
Delphi-Quellcode:
FormMessengerNW_Instanz := FormMessengerNW.Create(Application.MainForm);
FormMessengerNW_Instanz.Show;
mal
Delphi-Quellcode:
Application.CreateForm(TFormMessengerNW, FormMessengerNW);
FormMessengerNW_Instanz.Show;

Geändert von Jim Carrey (16. Okt 2016 um 23:41 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Form dynamisch erzeugen

  Alt 17. Okt 2016, 00:00
Deine Klasse ist ja TFormMessengerNW

Also musst Du auch eine Instance davon erzeugen.

Dein Aufruf von:


 FormMessengerNW_Instanz := FormMessengerNW.Create(Application.MainForm); ruft auf der bestehenden Instance Create auf nicht den von der Klasse!!!
also ändere einfach zu:

 FormMessengerNW_Instanz := TFormMessengerNW.Create(Application.MainForm); Achte auf das "T" in TFormMessengerNW.Create

Meiner Meinung nach sollte das Aufrufen eines Constructors zumindest eine Hint liefern, aber man kann ja nicht alles haben
Fritz Westermann
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#4

AW: Form dynamisch erzeugen

  Alt 17. Okt 2016, 00:17
Warum aber eine neue Variable der Klasse anlegen, wenn er doch eh schon eine hat?
Dann wäre folgendes doch viel sinniger:

Application.CreateForm(TFormMessengerNW, FormMessengerNW);
  Mit Zitat antworten Zitat
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#5

AW: Form dynamisch erzeugen

  Alt 17. Okt 2016, 08:35
oh nein,
ich habe tatsächlich nur das "T" vergessen... vielen Dank! 4 Augen sehen mehr als 2. Jetzt klappts ohne EAccess Violation.

Da hätte ich dann noch eine kleine Anschlussfrage:

Wie spreche ich diese dynamisch erzeugte Form dann am besten an?

ich beende über ein ImgClick diese Form, das hatte bei direkter Formnutzung ja so geklappt (FormMessengerNW.Close und bei dynamischer?
und bei dynForm?
(Sender as TForm).Close; //wobei Sender nicht immer TForm ist
ThisForm.Close; //


Ich steh da etwas auf dem Schlauch...
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Form dynamisch erzeugen

  Alt 17. Okt 2016, 09:27
Hi,

im Endeffekt genauso, wie du auf alle anderen Eigenschaften und Methoden zugreifen kannst, über die Instanz

Code:
FormMessengerNW.Close
bzw. über

Code:
FormMessengerNW.Hide
kannst du die Form wieder verschwinden lassen, ohne die Instanz zu löschen und beim nächsten
mal neu erzeugen zu müssen.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:21 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