Einzelnen Beitrag anzeigen

Benutzerbild von dor557
dor557

Registriert seit: 23. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Problem beim Starten von Externer Datei !!

  Alt 4. Apr 2007, 19:40
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
Sascha Nickel
  Mit Zitat antworten Zitat