AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem beim Starten von Externer Datei !!
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim Starten von Externer Datei !!

Ein Thema von dor557 · begonnen am 4. Apr 2007 · letzter Beitrag vom 12. Apr 2007
Antwort Antwort
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
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Problem beim Starten von Externer Datei !!

  Alt 4. Apr 2007, 19:41
Laß mal die namen der Instanz in den Methoden weg.
Markus Kinzler
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#3

Re: Problem beim Starten von Externer Datei !!

  Alt 5. Apr 2007, 02:28
1. Programmierleitfaden: "Never repeat yourself".

2. ExtractFilePath

3. Wenn dein Form oben links angezeigt wird statt in der Mitte: Im Objektinspektor FormPosition vlt. auf "poDesigned" statt auf "poScreenCenter" stehen?

4. Deinen Code habe ich jetzt nur überflogen und eigentlich fast nur Bahnhof verstanden - schaut sehr unsauber aus.

Aber so wie es ausschaut willst du, dass wenn deine Anwendung startet ein (sog.) "Splash-Screen" ("Krafisches startbild") angezeigt wird und während dessen einige Aktionen passieren.
Dazu "hackst" du scheinbar die DPR und den "OnHide"-Event der Splash-Form, um das zu erreichen. Du brichst sozusagen ein Loch in die Wand, obwohl die Tür gleich daneben ist. Das kann zu unschönen Problemen und Frickeleien führen (füge z.B. einfach mal eine neue Form zu deinem Projekt hinzu). Naja, zumindest weißt du dir zu helfen.

Einen Splash-Screen (Forum-Suche nach "Hier im Forum suchenSplash Screen Tutorial") erzeugt man in der DPR und zeigt ihn an (StartProcess.Show; Application.ProcessMessages). Vom Rest lässt man die Finger - wenn man nicht weiß, was man tut (und scheinbar weißt du das nicht ^^).
In deiner Hauptform in "OnFormCreate" kannst du nun einfach einen Aufruf an eine Funktion machen, die die nötigen Sachen erledigt:
Delphi-Quellcode:
procedure THauptform.DoStartProcess;
begin
  MacheSache1;
  Application.ProcessMessages; // um den Splash-Screen evtl. zu updaten
  MacheSache2;
  Application.ProcessMessages;
  {...}
end;
Und nach dem Aufruf dieser Funktion gibst du den Splash-Screen einfach wieder frei. Aber so wie du's löst ist es ganz schön brachial.

Und 5. Wo startest du denn eine externe Datei in deinem Code?
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

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

Re: Problem beim Starten von Externer Datei !!

  Alt 12. Apr 2007, 02:47
Die Externe datei wird bei der Folgenden Funktion gestartet :

TMainForm.FormShow(Sender: TObject); Was allerdings (Wo ich warscheinlich sagen sollte Logischerweise) nur funktioniert wenn das Programm läuft.

Läuft das Programm nicht geht nix !

Ich werde mal versuchen den weg mit dem SplashScreen versuchen (Tutorial)

und dann sehen ob sich das Problem von alleine erledigt wenn ich das von neunem versuche....

wenn nicht melde ich mich noch mal mit dem Neuen Code...

Gruss Sascha


Danke für die Hilfe.

(Ich weiss... habe nicht die Komplette Unit genommen sondern nur einen Teil rauskopiert.)
Sascha Nickel
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

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

Re: Problem beim Starten von Externer Datei !!

  Alt 12. Apr 2007, 04:18
Ich habe jetzt mal das so weit gemacht. Muss noch das Integrieren vom Öffnen der Dateien machen.

gelöst habe ich mein Problem mit der Position noch immer nicht !

Da ich das Formular nur dann in die Mitte des MDIForm setzen kann wenn es sichtbar ist geht das mit dem OnShow nicht.

erst wenn das Formular Angezeigt wird. Das wird aber dann erst angezeigt wenn das Splash-Screen verschwindet und Application.Run aufgerufen wird.


Somit stehe ich wieder vor dem Gleichen Problem....
Sascha Nickel
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 Uhr.
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