Autor Beitrag
daywalker0086
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Do 22.05.14 22:44 
Moin Moin,
Ich habe eine Frage zur Vorgehensweise.
Ich habe ein erstes Programm geschrieben, anschließend ein zweites.
Nun möchte ich das zweite irgendwie in dem ersten integrieren und das Hauptformular der zweiten Anwendung über einen Button in der ersten Anwendung aufrufen.
Hintergrund der ganzen Sache: Am Anfang sollte ein Programm zum programmieren von Geräten programmiert werden. Später sollte ein Programm geschrieben werden mit welchem man die Geräte testen kann. Nun könnte ich einfach die Units des zweiten in das erste integrieren aber in Zukunft soll es Gerätespezifisch jeweils eine neue Testsoftware geben und ich will ungern immer das komplette Programm austauschen. Ich stelle mir das eher so vor, dass das Programm in einen Ordner nach den Unterprogrammen schaut und dann quasi dynamisch jeweils einen Button für das Programm anzeigt, quasi wie Apps auf dem Handy ;).
Wie kann man das am besten mit delphi umsetzen? noch kann ich beide Programme ohne Aufwand umstricken.

Habt ihr da Vorschläge?

Grüße Christian
ChrisCross
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 124
Erhaltene Danke: 12

Windows 10 64 bit
Delphi XE6 Starter
BeitragVerfasst: Fr 23.05.14 06:54 
Hallo,

wenn ich dich richtig verstanden habe, nimm doch einfach die .exe Datei deiner Testsoftware und packe sie in einen Unterordner von deinem anderen Programm. Folgenden Code fügst du bei deinem Button ein:

ShellExecute(Application.Handle, 'open', PChar('Verzeichnis\Testsoftware.exe'), nilnil, SW_NORMAL); und passt den Pfad an. Bei Buttonklick sollte sich das andere Programm öffnen.

_________________
Christoph
Unser Mathelehrer: Das ist der letzte Matheblock in dieser Woche … Er hat aber gerade erst angefangen. Was die gute und was die schlechte Nachricht ist, kann sich jeder selbst aussuchen.
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Fr 23.05.14 07:17 
Hallo,

eine einfache Lösung wäre z.B. mit CreateProcess.

Hier ein Beispiel:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
function ExecAndWait(const FileName: stringconst CmdShow: Integer): Longword;
var { by Pat Ritchey }
  zAppName: array[0..512of Char;
  zCurDir: array[0..255of Char;
  WorkDir: string;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  AppIsRunning: DWORD;
begin
  StrPCopy(zAppName, FileName);
  GetDir(0, WorkDir);
  StrPCopy(zCurDir, WorkDir);
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb          := SizeOf(StartupInfo);
  StartupInfo.dwFlags     := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := CmdShow;
  if not CreateProcess(nil,
    zAppName, // pointer to command line string
    nil// pointer to process security attributes
    nil// pointer to thread security attributes
    False, // handle inheritance flag
    CREATE_NEW_CONSOLE or // creation flags
    NORMAL_PRIORITY_CLASS,
    nil//pointer to new environment block
    nil// pointer to current directory name
    StartupInfo, // pointer to STARTUPINFO
    ProcessInfo) // pointer to PROCESS_INF
    then Result := WAIT_FAILED
  else
  begin
    while WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_TIMEOUT do
    begin
      Application.ProcessMessages;
      Sleep(50);
    end;

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, Result);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
  end;
end{ WinExecAndWait32 }

Es wird solange gewartet, bis Du die entsprechende Anwendung wieder schließt.

... oder einfach hier im Forum nach CreateProcess suchen. ShellExecute sollte man zum Starten von exe-Dateien eigentlich nicht verwenden, auch wenn es funktioniert.

Eine weitere Möglichkeit wäre über eine Art Plugin System mit DLL's.

Hier mal ein Beispiel, wie man Formulare in DLL's nutzt.
www.michael-puff.de/...pets/FormInDLL.shtml

Letzteres hab ich selbst jedoch noch nie ausprobiert.
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Fr 23.05.14 09:16 
Guten morgen und danke für die Anregungen.
Kann ich beim Create Prozess noch variablen übergeben?
Geht das nur über ParamStr oder auch anders? Kann man auch Variablen aus dem Unterprogramm an das Hauptprogramm übergeben?
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Fr 23.05.14 16:59 
Ich selbst nutze zum Datenaustausch Memory Mapped Files (MMF). Damit kannst Du auch größere Datenmenge problemlos zwischen den Programmen austauschen. Einfach mal danach suchen. Das Erstellen, Lesen und Schreiben von MMF ist sehr einfach. Du musst nur darauf achten, dass nicht gleichzeitig ein Programm liest und das andere schreibt. Natürlich kannst Du auch die Variablen als Parameter übergeben (einfach an FileName dranhängen).

Viele Grüße