Ich habe Folgende situation :
Ein Process Formular mit dem Krafischen startbild welches in der
dpr wie folgt aufgerufen wird :
Delphi-Quellcode:
Application.Initialize;
Startprocess := TStartprocess.Create(Application);
try
Application.Title := 'Programmname';
StartProcess.Show;
StartProcess.Refresh;
finally
StartProcess.hide;
StartProcess.Free;
Application.Run;
end;
Dann habe ich bei der OnHide Procedure folgenden Code eingefügt :
Delphi-Quellcode:
procedure TstartProcess.FormHide(Sender: TObject);
begin
Reg := TRegistry.Create;
with Reg
do
begin
// Lesen der Registry
end;
StartProcess.Refresh;
StartProcess.ProcessLabel.Caption := '
Programm wird gestartet...';
StartProcess.ProcessLabel.Caption := '
Configuration wird gelesen...';
try
Ini:= TIniFile.Create(copy(Paramstr(0),1,length(Paramstr(0))-23)+'
\programm.ini');
binpath := Ini.readString('
PATHS','
bindir',copy(Paramstr(0),1,length(Paramstr(0))-20));
dbserver := Ini.ReadString('
DB','
server','
');
dbpath := Ini.readString('
DB','
dir',copy(Paramstr(0),1,length(Paramstr(0))-23)+'
db');
bdename := Ini.readString('
DB','
file','
DB.FDB');
finally
Ini.Free;
end;
StartProcess.ProcessLabel.Caption := '
Verbindung zu Datenbank "'+bdename+'
" wird hergestellt.';
Application.CreateForm(TDaten, Daten);
with Daten
do
begin
if dbserver <> '
'
then
IBDatabase1.DatabaseName := dbserver + '
:' + dbpath + '
\' + bdename
else IBDatabase1.DatabaseName := dbpath + '
\' + bdename;
IBDatabase.open;
end;
StartProcess.ProcessLabel.Caption := '
Verbindung zu Datenbank "'+bdename+'
" wurde hergestellt.';
Application.CreateForm(TMainForm, MainForm);
MainForm.Show;
if (length(MainForm.RichEdit1.Lines[0]) > 1)
then
begin
MainForm.XMLopenF.FileName := MainForm.RichEdit1.Lines[0];
if not (FrachtbriefDrucken =
nil)
then
try
if Assigned(FrachtbriefDrucken)
then
FrachtbriefDrucken.Release;
except
on E:
Exception do MessageDlg(E.
Message, mtError, [mbOK],0);
end;
xmlDatenF := TxmlDatenF.create(Application);
xmlDatenF.Show;
end else
begin
AuswahlForm := TAuswahlForm.Create(Application);
AuswahlForm.Show;
end;
if not (AuswahlForm =
nil)
then
try
if Assigned(AuswahlForm)
then
AuswahlForm.Release;
except
on E:
Exception do MessageDlg(E.
Message, mtError, [mbOK],0);
end;
end;
Nun in der AuswahlForm.FormShow ist folgender Code :
Delphi-Quellcode:
if (length(MainForm.RichEdit1.lines[0]) > 2)
then
begin
MainForm.XMLopenF.FileName := MainForm.RichEdit1.Lines[0];
if not (FrachtbriefDrucken =
nil)
then
try
if Assigned(FrachtbriefDrucken)
then
FrachtbriefDrucken.Release;
except
on E:
Exception do MessageDlg(E.
Message, mtError, [mbOK],0);
end;
xmlDatenF := TxmlDatenF.create(MainForm);
xmlDatenF.Show;
AuswahlForm.Release;
end;
In dem main Formular was Oben bei der StartProcess.FormHide wird ja das Haupt Formular erstellt was ein fsMDI formular ist erstellt und angezeigt.
Bei der Main.FormShow procedure steht folgendes :
Delphi-Quellcode:
procedure TMainForm.FormShow(Sender: TObject);
var
lpData: Pointer;
cbData: DWORD;
begin
lpData := ParamStrToBlob(cbData);
try
ProcessCommandline(lpData);
finally
FreeMemory(lpData);
end;
end;
in der Gleichen
Unit noch folgende Funktionen die dazu gebraucht werden damit ich auch Extern die Datei öffnen kann :
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];
if not (FrachtbriefDrucken =
nil)
then
try
if Assigned(FrachtbriefDrucken)
then
FrachtbriefDrucken.Release;
except
on E:
Exception do MessageDlg(E.
Message, mtError, [mbOK],0);
end;
xmlDatenF := TxmlDatenF.create(Application);
xmlDatenF.Show;
end;
end;
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;
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;
Das ergebnis ist das ich Wenn das Programm schon läuft nicht wirklich ein Problem habe. Er erstellt das XMLDatenF Formular und liesst die daten ein wie er soll.
Nun wenn das Prgramm erst gestartet wird macht er das auch aber das Formular wird nicht in der Mitte wie im ObjectInspector (ScreenCenter) dargestellt sondern einfach links oben in der ecke.
das ist der Erste Fehler.
Der Zweite ist das das AuswahlForm nicht geschlossen wird sondern Trotzdessen angezeigt wird.
Sobald ich mit ShowModal das xmlDatenF öffnen will bekomme ich eine Fehlermeldung!!
das xmlDatenF ist ein MDIChild
das auswahlF auch.
Wie kann ich aus der Procedure den besten und einfachsten weg nehmen das er Egal ob das Programm läuft oder nicht das xmlDatenF erstellt und das AsuwahlForm schlisst....
Habe es in der FormShow procedure versucht unterzubringen nur da bekomme ich wieder einen Fehler...
Die Info wie ich Dateien öffnen kann habe ich aus dem OneInst Projekt.
http://www.michael-puff.de/dirindex..../Importe/Nico/ -> oneinst.zip
wie gesagt wenn das Programm läuft ist das super... nur wie bekomme ich Meine Oben beschriebenen Fehler weg.
Hat da jemand eine Lösung ????
Gruss Sascha