![]() |
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:
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 :
xmlDatenF := TxmlDatenF.create(Application);
xmlDatenF.Show;
Delphi-Quellcode:
Da bekomme ich eine Fehlermeldung !!
if xmlDatenF = nil then
begin xmlDatenF := TxmlDatenF.create(Application); xmlDatenF.Show; end else begin xmlDatenF.Release; xmlDatenF := TxmlDatenF.create(Application); xmlDatenF.Show; end; wenn ich es auf diese Weise hier Probiere :
Delphi-Quellcode:
Bekomme ich auch eine Fehlermeldung ! Ist ja irgend wie der Gleiche vorgang nur anders Gelöst....
if xmlDatenF <> nil then
xmlDatenF.Release; xmlDatenF := TxmlDatenF.create(Application); xmlDatenF.Show; Wie kann man das Lösen ohne eine Fehlermeldung zu bekommen ? und vor allem auch das es Funktioniert.... Gruss Sascha |
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; |
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.... |
Re: Fenster erstellt bzw. sichtbar !?
Hast Du unter Projekt -> Optionen das Formular aus den automatisch erzeugten entfernt??
|
Re: Fenster erstellt bzw. sichtbar !?
Ja habe ich. Sonst kann ich sie ja nicht ohne Fehlermeldung Ein Formular mit Create erstellen oder ??
|
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?? |
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 |
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:
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 :
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;
Delphi-Quellcode:
wahlweise auch Destroy...
XMLDatenF.Release;
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 |
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:
Falls Du Daten aus dem Form auslesen möchtest, solltest Du es vor Release und NIL tun.
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; 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. |
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 04:37 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-2025 by Thomas Breitkreuz