Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Fenster erstellt bzw. sichtbar !? (https://www.delphipraxis.net/90549-fenster-erstellt-bzw-sichtbar.html)

dor557 19. Apr 2007 12:09


Fenster erstellt bzw. sichtbar !?
 
Ich habe folgendes vor :

Wenn das Prg. Gestartet wird und eine Externe Datei als Parameter übergeben wurde dann soll er ein Form öffnen.

Das geht auch so weit.

Jetzt habe ich mit Hilfe von OneInst es geschafft das er auch während das Programm läuft die Datei geöffnet werden kann, ohne das Programm neu zu starten.

Nun möchte ich aber das wenn Jemand eine Datei öffnet und das Form schon erstellt wurde ert das alte geschlossen wird und dann das neue Generiert wird.

Mein problem ist Folgendes :

Delphi-Quellcode:
      xmlDatenF := TxmlDatenF.create(Application);
      xmlDatenF.Show;
Code geht. Jedes mal wenn man eine Externe datei aufruft wird das Form erstellt. So weit so gut !! Aber nun meine versuche das Form zu schliessen wenn es noch Existiert :

Delphi-Quellcode:
     if xmlDatenF = nil then
     begin
       xmlDatenF := TxmlDatenF.create(Application);
       xmlDatenF.Show;
    end else
    begin
      xmlDatenF.Release;
      xmlDatenF := TxmlDatenF.create(Application);
      xmlDatenF.Show;
    end;
Da bekomme ich eine Fehlermeldung !!

wenn ich es auf diese Weise hier Probiere :

Delphi-Quellcode:
     if xmlDatenF <> nil then
      xmlDatenF.Release;
      xmlDatenF := TxmlDatenF.create(Application);
      xmlDatenF.Show;
Bekomme ich auch eine Fehlermeldung ! Ist ja irgend wie der Gleiche vorgang nur anders Gelöst....

Wie kann man das Lösen ohne eine Fehlermeldung zu bekommen ? und vor allem auch das es Funktioniert....

Gruss Sascha

uwewo 19. Apr 2007 12:33

Re: Fenster erstellt bzw. sichtbar !?
 
Versuche es mal hiermit

Delphi-Quellcode:
 if xmlDatenF = nil then
     begin
       xmlDatenF := TxmlDatenF.create(Application);
       xmlDatenF.Show;
    end
 else
    begin
      xmlDatenF.Release;
      xmlDatenF := nil;
      xmlDatenF := TxmlDatenF.create(Application);
      xmlDatenF.Show;
    end;

dor557 19. Apr 2007 12:45

Re: Fenster erstellt bzw. sichtbar !?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nach diesem versuch wie du mir geraten hast bekomme ich meldungen (siehe Anhang)

in etwa oder sogar Genau die gleichen....

uwewo 19. Apr 2007 13:06

Re: Fenster erstellt bzw. sichtbar !?
 
Hast Du unter Projekt -> Optionen das Formular aus den automatisch erzeugten entfernt??

dor557 19. Apr 2007 13:31

Re: Fenster erstellt bzw. sichtbar !?
 
Ja habe ich. Sonst kann ich sie ja nicht ohne Fehlermeldung Ein Formular mit Create erstellen oder ??

uwewo 19. Apr 2007 14:25

Re: Fenster erstellt bzw. sichtbar !?
 
Ich kenne ja Deinen Code nicht komplett, ausserdem wäre es auch möglich diesen mit dem Debugger zu überwachen um zu sehen in welcher Zeile er den Fehler ausgibt, und warum!

Hast Du das schon ausprobiert??

dataspider 19. Apr 2007 14:37

Re: Fenster erstellt bzw. sichtbar !?
 
Hi,

man muss schon sicherstellen, dass die Formularvariable xmlDatenF beim Freigeben des Forms auch auf nil gesetzt wird.
Somit auch dann, wenn ich das Formular über das x schliesse.
Das kann man dann z.B. im OnDestroy erledigen.

Cu, Frank

dor557 20. Apr 2007 04:17

Re: Fenster erstellt bzw. sichtbar !?
 
Ich denke ich habe das Problem Gefunden.

Ich kann ja nicht auf die Variablen in der ersten instanz zugreifen richtig ??

Falls ja dann müsste ich wissen wie !!

die momentane basis ist folgender Code :

Delphi-Quellcode:
procedure ProcessCommandline(lpData: Pointer);
begin
   MainForm.RichEdit1.Lines.Clear;
   MainForm.RichEdit1.text := ParamBlobToStr(lpData);
   if not (length(MainForm.RichEdit1.Lines[0]) > 1) then
   begin
     MainForm.RichEdit1.Lines.Add(ParamStr(1));
   end;
   if (length(MainForm.RichEdit1.lines[0]) > 2) then
   begin
     MainForm.XMLopenF.FileName := MainForm.RichEdit1.Lines[0];
     MainForm.AuswahlPanel.Visible := false;
if xmlDatenF = nil then
     begin
       xmlDatenF := TxmlDatenF.create(Application);
       xmlDatenF.Show;
    end
else
    begin
      MessageDlg('xmlDatenF ist nicht nil',mtInformation , [mbOK],0);
      xmlDatenF := TxmlDatenF.create(Application);
      xmlDatenF.Show;
    end;
   end;
end;

{ Eine zweite Instanz hat uns ihre Kommandozeilenparameter geschickt }
procedure TMainForm.WMCopyData(var Msg: TWMCopyData);
begin
  if (Msg.CopyDataStruct.dwData = SecondInstMsgId) and (SecondInstMsgId <> 0) then
    ProcessCommandline(Msg.CopyDataStruct.lpData)
  else
    { Tcha wohl doch nicht ID - stimmte nicht }
    inherited;
end;

{----------------------------------------------------------------------------}
{ Wir überschreiben den DefaultHandler, der alle Nachrichten zuerst bekommt, }
{ damit wir auf die Nachricht mit der ID SecondInstMsgId reagieren können.  }
{ (Dies ist notwendig, da wir jetzt noch nicht wissen welchen Wert          }
{  die ID haben wird, weswegen wir keine statische Message-Prozedure,       }
{  so wie bei WM_COPYDATA, schreiben können.)                               }
{----------------------------------------------------------------------------}
procedure TMainForm.DefaultHandler(var Message);
begin
  if TMessage(Message).Msg = SecondInstMsgId then
    { Eine zweite Instanz hat uns nach dem Handle gefragt }
    { Es wird in die Message-Queue des Threads gepostet. }
    PostThreadMessage(TMessage(Message).WParam, SecondInstMsgId, Handle, 0)
  else
    { Ansonsten rufen wir die geerbte Methode auf }
    inherited;
end;

procedure TMainForm.FormShow(Sender: TObject);
var
  lpData: Pointer;
  cbData: DWORD;
begin
  lpData := ParamStrToBlob(cbData);
  try
    ProcessCommandline(lpData);
  finally
    FreeMemory(lpData);
  end;
end;
Der Fehler passiert wenn das XMLDatenF mit release geschlossen werden soll und nicht nil ist ! also im klartext mit folgendem code bekomme ich die meldung :

Delphi-Quellcode:
  XMLDatenF.Release;
wahlweise auch Destroy...

das ist egal.....

Bekomme die meldung dann immer wenn ich XMLDatenF.Release schreibe.

in der OnClick anweisung muss ich ohne XMLDatenF den befehl Release machen ansonsten bekomme ich die gleiche Fehlermeldung.

Anscheinend muss die Frage also lauten wie kann ich ein Fenster mit Release schliessen ohne das XMLDatenF bzw. den Formularnamen zu benutzen !?

Gruss Sascha

uwewo 20. Apr 2007 06:34

Re: Fenster erstellt bzw. sichtbar !?
 
So ganz verstehe ich das letzte Posting nicht, aber hier mal einen Code der funktioniert zu deiner ersten Frage.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Form2 = nil then Form2 := TForm2.Create(Application)
    else
      begin
       Form2.Release;
       Form2 := nil;
       Form2 := TForm2.Create(Application)
      end;
  Form2.Show
end;
Falls Du Daten aus dem Form auslesen möchtest, solltest Du es vor Release und NIL tun.

Wenn es Dir um verschiedene Instanzen der Form geht, verwende doch einfach MDIChilds!
Damit könntest Du ein zweites Form öffnen und nach dem auslesen das erste schliessen.

dor557 21. Apr 2007 02:03

Re: Fenster erstellt bzw. sichtbar !?
 
Kann es denn sein das die Fehler meldung entsteht da ich das Formular als MDIChild deklariert habe ??? und es daher nicht erkennen kann... ???

und wenn nicht wie kann ich denn die Anderen geöffneten Formulare schliessen ???


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:17 Uhr.
Seite 1 von 2  1 2      

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