Entwickler-Ecke

Sonstiges (Delphi) - Problem From2 darf nach start nicht 2.mal starten


ALF - So 29.09.02 17:33
Titel: Problem From2 darf nach start nicht 2.mal starten
Hi Profs

Folgendes problem versuche ich zu lösen Form1 ist

Quelltext
1:
FormStyle:=fsMDIForm                    

die anderen Form(s) From2, Form3, usw. sind

Quelltext
1:
FormStyle:=fsStayOnTop;                    



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
TForm1.Button1Click(Sender: TObject);
begin
       
 {hier muss die Abfrage rein ob Form2 oder Form3 schon gestartet ist z.B.}

  If {From2 nicht vorhanden} then
        Form2:=TForm2.Create(self);
end;

alle versuche mit

Quelltext
1:
2:
if Active(form
if activechild

usw. funcen nicht oder nicht richtig

anbei noch ne zweite Frage
beim minimieren der Form2 form3 usw. werden die formen standardmässig an die Taskleiste angedockt ich möchte es aber oben an form1 menuleiste andocken welche möglichkeiten gibt es auch da hab ich schon einiges versucht wie onMinimize oder

Quelltext
1:
if Form2.windowstate=wsMinimize then top:=34;                    

aber auch das will nicht so richtig funcen

wer kann da helfen?

Gruss ALF


Klabautermann - So 29.09.02 19:56

Hallo,

ich denke dieses kleine Beispiel wird dir helfen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function TfrmMain.Form2Exists: BOOLEAN;
  VAR
    i : LongInt;
begin
  Result := FALSE;
  FOR i := MDIChildCount - 1 DOWNTO 0 DO
    IF (MDIChildren[i] IS tFrom2) THEN
      Result := TRUE;
end; // Form2 Exists


So schwer ist es ja nicht ;)

Gruß
Klabautermann


CenBells - Mo 30.09.02 09:25

Guten Morgen allerseits.

Ich glaube, wenn aman viele Fenster hat ist folgende Abfrage schneller

Quelltext
1:
2:
3:
4:
5:
6:
7:
If not Assigned(Form2) then begin 
  Form2 := TForm2.create(self)
  {andere anweisungen}
end;

Form2.show;
Form2.bringtofront;


LCS - Mo 30.09.02 09:51

Hi
Ireniceus hat folgendes geschrieben:
If not Assigned(Form2) then begin
Form2 := TForm2.create(self)
{andere anweisungen}
end;

Das funktioniert aber leider nur beim ersten Mal, oder wenn du nach dem Schliessen und Freigeben von Form2 selbst dafür sorgst, das Form2 wieder nil ist.

Gruss Lothar


CenBells - Mo 30.09.02 10:19

Zitat:
Das funktioniert aber leider nur beim ersten Mal, oder wenn du nach dem Schliessen und Freigeben von Form2 selbst dafür sorgst, das Form2 wieder nil ist.


Ja, schon, aber das ist doch eigentlich guter stil, wenn man sich um seinen "Speicher" kümmert. Vor allem in DLL s und so.
So wie ich die Frage allerdings verstanden hab, sollen die fenster aber nicht geschlossen werden, während das programm läuft. Und wenn doch, dann macht man halt im onclose event

Form2.release;

Und endlich bin ich bei 50 angelangt *G* :D :D

Gruß
ken


ALF - Mo 30.09.02 15:14

Hi Profs

Tut mir leid wenn ich nerve aber alle versuche hatte ich schon ausprobiert

For schleife wird trotzt geöffneter From2, Form3 usw.gar nicht durchlaufen!

der zweite Vorschlag läauft nur ein einziges mal obwohl ich in der
onclose anweisung 'Free' drinstehen habe

meine vermutung ist, weil die Form(s) From2, Form3 usw. nicht

.Formstyle:=fsMDIChild

sind, können sie auch nicht mit der MDIChildcount abfrage gesucht werden oder bin ich da Falsch? oder ist es uninteressant welche Formstyle
die anderen Form(s) haben.

hat also nix geholfen da ich das alles schon durch habe

Für weitere Hilfe würde ich mich freuen da auch die 'F1' taste nicht mehr her gibt als ihr mir gepostet habt
es sei den mein Programm ist falsch Programiert

Gruss Alf


CenBells - Mo 30.09.02 15:42

Zitat:
der zweite Vorschlag läauft nur ein einziges mal obwohl ich in der
onclose anweisung 'Free' drinstehen habe


deshalb habe ich ja auch noch geschrieben, das du im onclose
release;

aufrufen musst.

Hättest dir das mal alles durchgelesen :wink:

Gruß
Ken[/quote]


ALF - Mo 30.09.02 16:05

Hi Profs
sorry aber auch mit release func nicht

ich sag doch, wahrscheinlich ist mein Programmcode falsch oder so
ich weiss es nicht wo der fehler liegt

ich poste mal bischen Proc(s)





Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas', {Form1}
  Unit2 in 'Unit2.pas', {From2}
  Unit3 in 'Unit3.pas', {Form3}
  CrTbl in 'CrTbl.pas'; {Calls und Proceduren}
  
{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Unit1 sieht so aus;



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:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, Menus, FileCtrl, Db, DBTables;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Panel1: TPanel;
    ......
    ......

    procedure FormCreate(Sender: TObject);
    procedure Verlustmeldung1Click(Sender: TObject);
    procedure Table1AfterPost(DataSet: TDataSet);
    ........
    ........

    private

    { Private-Deklarationen }
  public

    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Present: TDateTime;
  Year, Month, Day: Word;
  ......
  ......

  implementation

uses Unit2, Unit3;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin

     Present:=Now;
     ......
     ......

end;

procedure TForm1.Verlustmeldung1Click(Sender: TObject);
var i: longint;
begin
     
     {hier muss die Abfrage rein ob Form2 schon vorhanden ist}
     {if  not exists form2 then create Form2}    

      { for i:=mdichildcount-1  downto 0 do
             if (mdichildren[i]) is tForm2 then
             else
             TForm2.create(self);}

      //die For anweisung wird überhaupt nicht ausgeführt
      //egal wie ich sie umformuliere selbst 'ActiveMDIChild' func nicht     
      //dabei spielt es noch nicht mal ne rolle ob Form2 oder Form3 usw.
      //created ist 
       
       if not Assigned(Form2) then Form2:=TForm2.create(self);
     
      // diese starte einmal und dann nicht wieder obwohl in  
      //  Form2 onClose  release drinsteht        

end;


die Unit 2 hat nun folgendes,


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:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Menus, ExtCtrls, FileCtrl, DB, DBTables;

type
  TForm2 = class(TForm)
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    ......
    ......
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    ........
    ........ 

var
  Form2: TForm2;
  RTag, RMonat, RJahr: integer;
  .......
  .......
  .......

implementation

uses Unit1, CrTbl, Unit3;

Procedure Pruefe; forward;

{$R *.DFM}

procedure TForm2.FormCreate(Sender: TObject);
var
    FindDatei: Tsearchrec;
    DateiItem: TmenuItem;
begin

     FormStyle:=fsStayOnTop;
     Position:=poOwnerFormCenter;
     WindowState:=wsNormal;

     .........
     ..........

    Show;
    BringToFront;

end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    form2.release;    {release;  free;}
end;


ich gehe nun davon aus das ich irgendwo, an der falschen stelle, den code geschrieben habe, so das die for schleife in Form1 nicht durchgeführt wird weil sie kein MDIChild findet.
Die frage ist nun wo?????????

wer kann helfen

Gruss Alf


CenBells - Di 01.10.02 19:30

darf das fenster denn nur einmal starten?

dann mach doch im onclose von form 2 nicht (!!!) free oder release, sondern mache in unit1

Quelltext
1:
2:
3:
4:
5:
6:
if not Assigned(Form2) then 
  Form2:=TForm2.create(self)
else begin
  Form2.show; 
  Form2.bringtofront;
end;

Gruß
Ken


LCS - Mi 02.10.02 08:45

Hi
Ich denke das wird auch net viel bringen, da auch nach dem Release Form2 anscheinend <> nil ist. Ich bin da auch schon drüber gestolpert habe dann einfach folgendes gemacht:

Quelltext
1:
2:
3:
4:
procedure TForm2.FormDestroy(Sender: TObject);
begin
  Form2 := nil;
end;

Und damit funktioniert das. 8)

Gruss Lothar


ALF - Do 03.10.02 10:46

Hi Leute

Danke für die Info bin zum Glück noch selber dahinter gekommen
mit Form2:=nil;


Gruss Alf