Autor Beitrag
Hrtgpdh
Hält's aus hier
Beiträge: 14

WIN2000, WINXP, Linux, WIN7, WIN8
Delphi7, Delphi2010, VS2003, VS2005, VS2008, VS2012, Eclipse
BeitragVerfasst: Di 20.09.05 08:43 
Hallo,

ich möchte gerne in einer Anwendung ein Fenster, (mit dem ich Projekte) bearbeiten kann, mehrfach instanziieren können. (Um gleichzeitig mehrere Projekte öffnen, und bearbeiten zu können).
Ich kenne das entsprechend aus anderen OOP- Sprachen und habe es in auch hier in Delphi versucht, bekomme dann aber immer Compiler- Fehlermeldungen.
D.h. ich habe in meinem Main- Formular mehrere identische Klassen- Variablen deklariert
Bsp.
Projekt1 : FrmProjekt;
Projekt2 : FrmProjekt;
Projekt3 : FrmProjekt;
und versuche die mit Create zu erschaffen, aber dann s.o..
Besser wäre es näturlich noch, wenn ich zur Laufzeit nur eine Klassen- Variable hätte die ich immer wieder neu instanziieren könnte, aber da habe ich im Moment keine Idee wie das funktionieren könnte.

Ich benutze Delphi 7 Professional, und mich würde interessieren ob und wie das funktioniert, bzw. auch ab welcher Delphi- Version?

Danke für eure Hilfe

Gruß Hartwig
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Di 20.09.05 09:45 
1.) Form1: TFrmProjekt; und 2.) schreibst du nicht über deinen Konstruktoraufruf...
ausblenden Delphi-Quelltext
1:
2:
3:
Application.CreateForm(TFrmProjekt, Form1);
Form1.ShowModal;
FreeAndNil(Form1);
funktioniert bei mir nämlich wunderbar (sofern TFrmProjekt existiert).

AXMD
Hrtgpdh Threadstarter
Hält's aus hier
Beiträge: 14

WIN2000, WINXP, Linux, WIN7, WIN8
Delphi7, Delphi2010, VS2003, VS2005, VS2008, VS2012, Eclipse
BeitragVerfasst: Di 20.09.05 09:51 
Funkioniert leider so nicht, du musst dir vorstellen, das ein Benutzer z.B. ein Projekt bearbeiten will, und dann z.B. Infos aus einem anderen Projekt braucht, oder für einen Kollegen was kontrollieren will, etc. deswegen sollte es möglich sein mehrere Projekt gleichzeitig öffnen zu können.
Mit ShowModal müsstest du das ja dann immer erst das Form schliessen, bevor du ein neues öffnen kannst, wenn ich das richtig im Kopf habe.

Gruß Hartwig
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Di 20.09.05 09:54 
War auch nur ein Beispiel... nimmst du stattdessen halt Show ;). Nur freigeben musst dus wieder :)

AXMD
Hrtgpdh Threadstarter
Hält's aus hier
Beiträge: 14

WIN2000, WINXP, Linux, WIN7, WIN8
Delphi7, Delphi2010, VS2003, VS2005, VS2008, VS2012, Eclipse
BeitragVerfasst: Di 20.09.05 10:30 
Das Problem ist nur wenn ich die Instanz mit free wieder freigebe, sind alle alten Inhalte auch weg, und evt. möchte dann ja jemand an dieser Stelle weiterarbeiten.
Ich suche nach einer Option, wie z.B. in C++ bzw, in Java, wo ich die Möglichkeit habe
(Java- Code:)

ausblenden Quelltext
1:
2:
3:
JFrame Fenster1, Fenster2;
Fenster1 = new JFrame();
Fenster2 = new JFrame();


oder auch
mit anderen Konstruktoren (z.B. die Nr. des Projektes) und nur eine offizíelle Deklaration

ausblenden Quelltext
1:
2:
3:
JFrame Fenster;
Fenster = new JFrame(1);
Fenster = new JFrame(2);

Dann weiß ich das ich zwei gleiche Fenster mit unterschiedlichen Inhalten bekomme.

Ich bin im Moment der Meinung, das ich hier z.B. 5 Forms aufbauen müsste und dann die Verwaltung der Forms bzw. die Organisation im Hintergrund könnte ziemlich komplex werden.

Gruß Hartwig
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Di 20.09.05 11:24 
Hallo,

dann solltest du das Form erst beim Schließen deiner Anwendung frei geben, vorher kannst du es mit Hide verstecken und mit Show wieder anzeigen.

Du kannst natürlich auch bei Formularen den Constructor überschreiben und somit andere Parameter übergeben. Ich nehmen an dann kannst du es nicht mehr mit CreateForm erzeugen, aber letzendlich sind auch Forms nur Objekte wie alle anderen.

Ein kleines Beipiel: Form1 Besitzt ein Knopf um ein neues Form2 zu erstellen Modal an zu zeigen (dann kann ich den Prozess auf eine Prozedure eindampfen) und es wieder frei zu geben. Form2 Besitzt einen neuen Construktor und einen Button der das Modale Fenster weider schließt.

Die Unit für Form 2 sieht so aus:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    Shape1: TShape;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    constructor Create(AOwner: TComponent; aCaption : string);
  end;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  ModalResult := mrCancel;
end;

constructor TForm2.Create(AOwner: TComponent; aCaption: string);
begin
  inherited Create(aOwner); // Den Constructor von tForm aufrufen dammit das Form als solches erzeugt wird
  self.Caption := aCaption; // Den neuen zusätzlichen Parameter verwenden
end// Constuctor

end.


und die Auftufende Funktion aus Unit1 so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
  var
    MyForm : tForm2;
begin
  MyForm := tForm2.Create(self, 'Fenstertitel');
  MyForm.ShowModal;
  MyForm.Free;
end;


Gruß
Klabautermann
Hrtgpdh Threadstarter
Hält's aus hier
Beiträge: 14

WIN2000, WINXP, Linux, WIN7, WIN8
Delphi7, Delphi2010, VS2003, VS2005, VS2008, VS2012, Eclipse
BeitragVerfasst: Di 20.09.05 14:59 
Merci, dann probier ich es mal auf diese Weise, ich lass es euch wissen ob es funktioniert hat.

Gruß Hartwig
Hrtgpdh Threadstarter
Hält's aus hier
Beiträge: 14

WIN2000, WINXP, Linux, WIN7, WIN8
Delphi7, Delphi2010, VS2003, VS2005, VS2008, VS2012, Eclipse
BeitragVerfasst: Do 22.09.05 16:57 
Nochmals Merci, ich konnte meine Problemstellung auf diese Art lösen, und die Anwendung verhält sich sehr gut.

Gruß Hartig