PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zugriff auf Edit-Feld von einer anderen Anwendung


x-dragon
2003-03-24, 14:27:34
Ich weiß ja das hier nicht viele mit Delpi zu tun haben, aber diese Problem dürfte nicht nur Delphi-Programmierer betreffen :).

Also ich möchte gerne 2 meiner "Programme" vollständig trennen, da sie bisher in einem Projekt zusammengefaßt sind. Der einzige Haken an der Sache ist das ich aus der einen Anwendung ein paar Edit-Felder auslesen möchte, wenn die andere Anwendung und das richtige Fenster geöffnet sind.

Also die Überprüfung ob das Fenster der anderen Anwendung geöffnet ist hab ich mit FindWindowEx hinbekommen, allerdings kann ich dies nicht für die einzelnen Edit-Felder nutzen, da ich nicht weiß wie ich diese auseinanderhalten kann (zur Identifikation wird ja leider TControl.Text bzw TControl.Caption verwendet und das funktioniert bei Edit-Feldern leider normal nicht).

Zuerst wurde mir der Tip gegeben das ja jede Komponente eine eigene ID hat und ich diese vorher auslesen könnte (und dann per GetDlgItem das Edit-Feld finden), allerdings stellte sich dann heraus das Windows diese IDs bei jedem Start des Programms neu vergibt ... :(

Habt ihr sonst vielleicht eine Idee wie ich die einzelnen Edit-Felder gezielt ansprechen kann?

Demirug
2003-03-24, 14:40:16
Ich bin kein Delphi Experte aber Child Windows kann man bei Windows feste ID vergeben. Wie und ob das allerdings auch mit Delphi geht kann ich nicht sagen.

Was ich aber generell dazu sagen muss ist das es keine gute Idee ist zwei Anwendungen über die UI miteinader zu verzahnen. Da gibt es weitaus elegantere Lösungen.

x-dragon
2003-03-24, 15:06:46
Originally posted by Demirug
Ich bin kein Delphi Experte aber Child Windows kann man bei Windows feste ID vergeben. Wie und ob das allerdings auch mit Delphi geht kann ich nicht sagen.

Was ich aber generell dazu sagen muss ist das es keine gute Idee ist zwei Anwendungen über die UI miteinader zu verzahnen. Da gibt es weitaus elegantere Lösungen. Und welche? Bin erstmal für alle Lösungen offen :).

Die Befehle auf die bisher zurückgreife stammen von der Win32-API http://msdn.microsoft.com/library/default.asp und sind ja eigentlich unabhängig von Delphi.

Was ich bisher zu Child Window gelesen habe, läuft es wahrscheinlich darauf hinaus das ich die Komponenten selber erstellen muss, also ohne VCL ... naja ich schau mir das nochmal an.

Demirug
2003-03-24, 16:50:23
Abhängig von deinem genauen Anwendungsfall gibt es für die Process zu Process Kommunikation einige möglichkeiten:

Dort kannst du dir aussuchen was dir am besten passt:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ipc/base/interprocess_communications.asp

stabilo_boss13
2003-03-24, 16:56:40
Originally posted by X-Dragon
Und welche? Bin erstmal für alle Lösungen offen :).

Ich kann Demirug nur voll zustimmen. Programme sollten niemals Daten über die Oberfläche austauschen.

Stell dir einfach vor, deine beiden Programme würden auf 2 verschiedenen Rechnern laufen.

Aber ich habe natürlich auch einen Vorschlag für dich, den ich selber manchmal praktiziere:
Wenn die erste Anwendung gestartet ist (also die mit den Editfeldern), dann lass den Anwender doch einen Button 'Übernehmen' oder 'Speichern' oder 'OK' drücken. Dann schreibt deine Anwendung ein kleines Textfile auf die Festplatte. Deine zweite Anwendung macht nun nichts anderes, als regelmäßig die Existenz dieses Textfiles zu prüfen und liest die Daten dann aus. Zum Schluss löscht sie die Datei.
Greift kein Anwender in Applikation 1 ein, dann kannst du das Textfile ja auch zeitgesteuert schreiben.

Ein Anwendungsbeispiel von mir:
Applikation A liest von einer digitalen IO-Karte Werte ein und stellt sie in einem Grid dar. Einen der Werte schreibt sie dann in eine Datei.
Auf einem anderen Rechner läuft Applikation B. Sie testet, ob sich der Werte regelmäßig ändern. Wenn nicht, geht sie davon aus, dass Applikation A nicht mehr läuft und starten den Rechner neu.

x-dragon
2003-03-24, 16:57:19
Originally posted by Demirug
Abhängig von deinem genauen Anwendungsfall gibt es für die Process zu Process Kommunikation einige möglichkeiten:

Dort kannst du dir aussuchen was dir am besten passt:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ipc/base/interprocess_communications.asp Danke schön :scatter:

Englisch ist zwar nicht gerade meine Stärke, aber da hab ich ja auf jeden Fall schon mal einen guten Ansatz wo ich weiter machen kann.

Demirug
2003-03-24, 16:59:08
Sorry, einen deutsche übersicht habe ich leider nicht zur Hand. Es ist sowieso relative schwer was gutes zum Thema programmieren in Deutsch zu bekommen.

zeckensack
2003-03-24, 17:03:39
X-Dragon,

macht es ganz sicher Sinn, die beiden Teile zu trennen? Ist jedes für sich alleine irgendwie benutzbar, oder kann man die beiden nur zusammen gebrauchen?

Nur für den Fall daß, möchte ich nochmal auf die Möglichkeit hinweisen, mehrere Fenster in einer Applikation zu haben :naughty:

x-dragon
2003-03-24, 19:12:34
Originally posted by stabilo_boss13
Ich kann Demirug nur voll zustimmen. Programme sollten niemals Daten über die Oberfläche austauschen.

Stell dir einfach vor, deine beiden Programme würden auf 2 verschiedenen Rechnern laufen.

Aber ich habe natürlich auch einen Vorschlag für dich, den ich selber manchmal praktiziere:
Wenn die erste Anwendung gestartet ist (also die mit den Editfeldern), dann lass den Anwender doch einen Button 'Übernehmen' oder 'Speichern' oder 'OK' drücken. Dann schreibt deine Anwendung ein kleines Textfile auf die Festplatte. Deine zweite Anwendung macht nun nichts anderes, als regelmäßig die Existenz dieses Textfiles zu prüfen und liest die Daten dann aus. Zum Schluss löscht sie die Datei.
Greift kein Anwender in Applikation 1 ein, dann kannst du das Textfile ja auch zeitgesteuert schreiben.

Ein Anwendungsbeispiel von mir:
Applikation A liest von einer digitalen IO-Karte Werte ein und stellt sie in einem Grid dar. Einen der Werte schreibt sie dann in eine Datei.
Auf einem anderen Rechner läuft Applikation B. Sie testet, ob sich der Werte regelmäßig ändern. Wenn nicht, geht sie davon aus, dass Applikation A nicht mehr läuft und starten den Rechner neu. Super danke, so wie es aussieht ist das die simpelste und sicherste Methoden(zumindest so auf die schnelle) :). Originally posted by zeckensack
X-Dragon,

macht es ganz sicher Sinn, die beiden Teile zu trennen? Ist jedes für sich alleine irgendwie benutzbar, oder kann man die beiden nur zusammen gebrauchen?

Nur für den Fall daß, möchte ich nochmal auf die Möglichkeit hinweisen, mehrere Fenster in einer Applikation zu haben :naughty: Wie das geht wirklich? :D

Die beiden Programme, naja eigentlich sind es 3, haben jeder seinen eigenen Aufgabenbereich. Zum einen ein Werkstattplaner, eine Reifeneinlagerung und eine Zeiterfassung. Wobei in dem Fall (Kunden-)Daten aus dem Werkstattplaner direkt in die Reifeneinlagerung übernommen werden sollen, wenn sie von der Werkstattplaner-Eingabemaske aus gestartet wird. Aber da dies die einzige Gemeinsamkeit zwischen den Programmen ist wollte ich sie schon besser trennen.

Demirug
2003-03-24, 19:22:50
Originally posted by X-Dragon
Wie das geht wirklich? :D

Die beiden Programme, naja eigentlich sind es 3, haben jeder seinen eigenen Aufgabenbereich. Zum einen ein Werkstattplaner, eine Reifeneinlagerung und eine Zeiterfassung. Wobei in dem Fall (Kunden-)Daten aus dem Werkstattplaner direkt in die Reifeneinlagerung übernommen werden sollen, wenn sie von der Werkstattplaner-Eingabemaske aus gestartet wird. Aber da dies die einzige Gemeinsamkeit zwischen den Programmen ist wollte ich sie schon besser trennen.

Dann übergib dieses Daten doch über die Aufrufparameter.

stabilo_boss13
2003-03-24, 20:34:35
Originally posted by X-Dragon
Super danke, so wie es aussieht ist das die simpelste und sicherste Methoden(zumindest so auf die schnelle) :). Wie das geht wirklich? :D

Die beiden Programme, naja eigentlich sind es 3, haben jeder seinen eigenen Aufgabenbereich. Zum einen ein Werkstattplaner, eine Reifeneinlagerung und eine Zeiterfassung. Wobei in dem Fall (Kunden-)Daten aus dem Werkstattplaner direkt in die Reifeneinlagerung übernommen werden sollen, wenn sie von der Werkstattplaner-Eingabemaske aus gestartet wird. Aber da dies die einzige Gemeinsamkeit zwischen den Programmen ist wollte ich sie schon besser trennen. Dann solltest du dich aber wirklich ein wenig mit Netzwerk- und Datenbankprogrammierung beschäftigen.
Das ist nicht soooo schwer.
Die Daten sollten in deinem Fall in einer Datenbank (Access reicht völlig) liegen.
Und die Zugriffe der einzelnen Programme sollten geregelt werden.
Bin jetzt schon zu Hause. Morgen kann ich dir noch ein paar Links geben.

x-dragon
2003-03-24, 23:32:22
Originally posted by Demirug Dann übergib dieses Daten doch über die Aufrufparameter. Die EXE-Datei dann mit Aufrufparameter starten? Ich weiß nicht ob das so praktisch ist, da ich die Daten aus insgesamt 7 Edit-Feldern brauche (hab nochmal nachgezählt :))

Originally posted by stabilo_boss13
Dann solltest du dich aber wirklich ein wenig mit Netzwerk- und Datenbankprogrammierung beschäftigen.
Das ist nicht soooo schwer.
Die Daten sollten in deinem Fall in einer Datenbank (Access reicht völlig) liegen.
Und die Zugriffe der einzelnen Programme sollten geregelt werden.
Bin jetzt schon zu Hause. Morgen kann ich dir noch ein paar Links geben. Die Programme an sich laufen schon per BDE über Paradox-Datenbanken, sonst wär das ja auch wirklich blöd so als reine Einzelplatzversion :).

Ok speziell Netzwerkfunktionen wollte ich mir auf jeden Fall demnächst noch mal genauer anschauen, was man da noch so für Möglichkeiten hat. Aber meine Programme laufen ja und jetzt werden erstmal ältere Programmteile überarbeitet und etwas sicherer gemacht (try...finally...http://mysmilies.no-ip.com/mysmilies/5.gif).

Das eigentliche Problem war ja nur das die Programmmodule ursprünglich in einem Programm zusammengefaßt waren, und da dachte ich mir das es ist ja schon sinnvoll ist, diese auch einzeln anbieten zu können.

Demirug
2003-03-25, 07:12:30
Originally posted by X-Dragon
Die EXE-Datei dann mit Aufrufparameter starten? Ich weiß nicht ob das so praktisch ist, da ich die Daten aus insgesamt 7 Edit-Feldern brauche (hab nochmal nachgezählt :))


Und? 7 Felder sind doch nicht viel. Ist auf jeden Fall der einfachste und schnellste weg.

x-dragon
2003-03-25, 11:03:46
Originally posted by Demirug


Und? 7 Felder sind doch nicht viel. Ist auf jeden Fall der einfachste und schnellste weg. Stimmt, aber seit DOS(ich hab schon ne zeitlang XP) hab ich mit Parametern nur noch wenig am Hut gehabt, aber funktioniert trotzdem super danke :).

Hier ist der Aufruf der Anwendung mit Übergabe der Parameter:
procedure TFmEingabe.BtReifenClick(Sender: TObject);
{**************************************************}
var
para : String;
begin
if EdName.Text <> '' then
para := ' "'+EdName.Text+'"'
else para := ' "@"'; // als Platzhalter um die Parameter nicht zu vertauschen

if EdTyp.Text <> '' then
para := para+' "'+EdTyp.Text+'"'
else para := para+' "@"';

if (EdKennz1.Text <> '') or (EdKennz2.Text <> '') or (EdKennz3.Text <> '') then
para := para+' "'+EdKennz1.Text+'-'+EdKennz2.Text+' '+EdKennz3.Text+'"'
else para := para+' "@"';

ShellExecute(0, 'open',
PChar(ExtractFilePath(Application.ExeName)+'Reifenstart.exe'),
PChar(para), '', SW_SHOW);
end; Und hier wird im OnCreate-Ereignis des Hauptformulars der gestarteten Anwendung kontrolliert ob die Paramter vorhanden sind und wenn eingefügt: if ParamCount = 3 then
begin
for i := 1 to 3 do
if ParamStr(i) <> '@' then
case i of
1 : EdNameA.Text := ParamStr(1);
2 : EdTypA.Text := ParamStr(2);
3 : EdKennzA.Text := ParamStr(3);
end;

BtNeu.Click;
end;