Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Edit-Feld aus einem anderen Programm auslesen? (https://www.delphipraxis.net/3571-edit-feld-aus-einem-anderen-programm-auslesen.html)

X-Dragon 19. Mär 2003 09:53


Edit-Feld aus einem anderen Programm auslesen?
 
Hi Leute

ich hab ein kleines Problem (ach nee wirklich?) :)

Also ich habe 2 Programme und es besteht die Möglichkeit von einem Programm das andere Programm zu starten, wobei dann auch gleich von dem neu gestarteten Programm 3 Edit-Felder aus dem vorherigen Programm ausgelesen werden.

Bisher läuft das ganze allerdings eigentlich in einem Programm ab (hab auch beide Projekte in einem Verzeichnis). Das möchte ich jetzt aber endlich nicht mehr und beide als komplett einzelne Programme handhaben.

Dafür müsste ich doch eigentlich nur beim Programmstart direkt kontrollieren ob das Fenster des anderen Programms geöffnet ist und dann die Werte aus den Feldern auslesen.

Und jetzt die Frage wie kann man das am sinnvollsten umsetzen?

Ein paar Sachen hab ich dazu zwar schon gefunden, aber bisher nur wie ich ein Knopf drücken kann oder ein andere Programm schliessen oder ähnliches.

Also wenn möglich eine kurze, einfach und sichere Lösung, vielen dank schon mal im voraus :).

Motzi 19. Mär 2003 09:56

Schau dir mal die Messages WM_GETTEXTLENGTH und WM_GETTEXT an..

X-Dragon 19. Mär 2003 10:28

Zitat:

Zitat von Motzi
Schau dir mal die Messages WM_GETTEXTLENGTH und WM_GETTEXT an..

Das ist das einzige was die Hilfe dazu sagt und das hilft mir leider nicht weiter :(
Zitat:

Die Methode DefaultHandler ermöglicht die Bearbeitung aller Botschaften, für die keine spezielle Behandlungsroutine vorhanden sind.

procedure DefaultHandler(var Message); override;

Beschreibung

Durch Überschreiben von DefaultHandler können Sie die Standardbearbeitung von Botschaften erweitern. DefaultHandler ist für Komponentenentwicklern die letzte Möglichkeit, Botschaften an Steuerelemente zu behandeln. Die von WndProc referenzierte Methode stellt die erste Gelegenheit dar. Zusätzliche Möglichkeiten werden von Methoden wie Click bereitgestellt.

DefaultHandler behandelt die Windows-Botschaften, die sich auf den Text des Steuerelements beziehen: nämlich WM_GETTEXT, WM_SETTEXT und WM_GETTEXTLENGTH.
Und bei den "Lösungen" hier im Forum heißt es meistens "danke hat sch erledigt" aber wie es jetzt wirklich funktioniert hab ich nirgenswo gefunden :(.

Luckie 19. Mär 2003 10:32

Mit FindWindow Handle des hauptfensters holen, mit FindWindowEx handle des Edits holen und mit WM_GETTEXT den Inhalt holen.
Bei Fragen zu den Funktionen und der Message bitte hier Informieren: www.msdn.microsoft.com
Zu WM_GETTEXT findest du auch was auf meiner Seite.

X-Dragon 20. Mär 2003 12:05

.. ein paar dutzend Webseiten später ...
 
Delphi-Quellcode:
var
  ExEdit,
  Fenster : hwnd;
begin
  Fenster := FindWindowEx(0,0,nil,PChar('Test-Fenster'));
  ExEdit := FindWindowEx(Fenster,0,nil,PChar('Test-Editfeld'));
Da ich die Daten aus einem untergeordneten Fenster auslesen will, sollte das ja mit FindWindowEx funktionieren. Naja zumindest findet er dort was. Allerdings das Edit-Feld will er nicht finden. Wisst ihr vielleicht woran das liegen könnte?

X-Dragon 21. Mär 2003 10:49

Das hat doch bestimmt schon mal jemand gemacht, oder bin ich der einzige der auf so eine "tolle" Idee kommt?

Da ja beide Programme von mir sind, mir also alle Bezeichnungen etc. bekannt sind, kann das doch nicht so schwer sein?

Ich hab inzwischen dutzende Webseiten abgegrast, aber irgendwie nichts passendes gefunden bzw mit keiner (verständlichen) Erläuterung dabei.

Luckie 21. Mär 2003 11:02

Die Parameter von FindWondowEx sind:
1. Handle vom Elternfenster.
2. Mit welchen Kindfenster die Suche beginnen soll (0: es wird beim ersten angefangen).
3. Fensterklasse des zu findeden Fensters. Sollte EDIT oder TEdit sein, jenachdem.
4. Text der im Fenster steht.

Jetzt die Frage: Steht in dem zu findeden Edit der Text: "Test-Editfeld"?

X-Dragon 21. Mär 2003 11:07

Zitat:

Zitat von Luckie
Die Parameter von FindWondowEx sind:
1. Handle vom Elternfenster.
2. Mit welchen Kindfenster die Suche beginnen soll (0: es wird beim ersten angefangen).
3. Fensterklasse des zu findeden Fensters. Sollte EDIT oder TEdit sein, jenachdem.
4. Text der im Fenster steht.

Jetzt die Frage: Steht in dem zu findeden Edit der Text: "Test-Editfeld"?

Das ist die Bezeichnung des Edit-Feldes, ist doch richtig so oder? (habs vorläufig umbenannt um es übersichtlicher zu machen)

Wann sollte denn Edit bzw wann TEdit als Klasse angegeben werden?

Luckie 21. Mär 2003 11:21

Meinst du mit Name die Eigenschaft Name vom TEdit? Der letzte Parameter ist der Text, de rim Edit drinsteht!

Muttu kucken. Ist es eine WinAPI-Anwendung ist die Fensterklasse EDIT. Wurde die Anwendung mit der VCL erstellt ist es TEdit. Mit dem Programm WindowInfo von meiner Seite kannst du die Klasse auslesen. Aber ich würde die ID nehmen (sofern eine vergeben wurde) und das Handel dann mit GetDlgItem(hParent, ID) holen.

X-Dragon 21. Mär 2003 11:42

Zitat:

Zitat von Luckie
Meinst du mit Name die Eigenschaft Name vom TEdit? Der letzte Parameter ist der Text, de rim Edit drinsteht!

Muttu kucken. Ist es eine WinAPI-Anwendung ist die Fensterklasse EDIT. Wurde die Anwendung mit der VCL erstellt ist es TEdit. Mit dem Programm WindowInfo von meiner Seite kannst du die Klasse auslesen. Aber ich würde die ID nehmen (sofern eine vergeben wurde) und das Handel dann mit GetDlgItem(hParent, ID) holen.

Ah danke, dann kann das natürlich nicht funktonieren. Aber was macht das eigentlich für ein Sinn dort den Text des Edit-Feldes einzutragen, da dies ja selten ein fester Wert ist?

Wenn das nur so funktioniert muss ich ja schon auf die ID des Edit-Feldes zurückgreifen, um gezielt eines ansprechen zu können (sind ja mehrere in einem Fenster), oder?

Werd mich wohl nochmal auf deiner Webseite umschauen :)

Luckie 21. Mär 2003 11:51

Bei Edits ist es natürlich etwas blöd, aber es gibt ja noch Statics und Buttons usw., da macht es natürlich mehr Sinn oder? :wink:

X-Dragon 21. Mär 2003 12:15

Zitat:

Zitat von Luckie
Bei Edits ist es natürlich etwas blöd, aber es gibt ja noch Statics und Buttons usw., da macht es natürlich mehr Sinn oder? :wink:

Ok, das stimmt natürlich. Und für Edits eine extra Funktion zur Verfügung zu stellen, würde die Sache wahrscheinlich auch zu einfach machen :).

Hab gerade mal dein Programm WindowInfo getestet und festgestellt, das eine ganz kurze Anleitung nicht schlecht wäre. Hab mich zuerst schon gewundert warum er immer die selben Werte anzeigt und immer Static als Klasse, da ich davon ausgegangen ist das er das er die Komponente selbst findet wenn man sie markiert hat und dann auf das Ziel-Feld drückt :) Aber jetzt funktionierts.

Luckie 21. Mär 2003 12:19

Mit der linken Maustaste auf das Fadenkreuz, gedrück halten und das gewünschte Fenster auswählen.

X-Dragon 21. Mär 2003 12:51

Zitat:

Zitat von Luckie
Mit der linken Maustaste auf das Fadenkreuz, gedrück halten und das gewünschte Fenster auswählen.

Ja das war mir inzwischen schon klar, aber jetzt zeigt er mir zum einen das Handel und die ID die gleichen Werte haben und wenn ich das Programm starte sind es andere Werte als vorher, ist das normal?

Solange ich mein Programm nicht starte, findet dein Programm wie auch WinSight die gleichen IDs, aber wenn es gestartet ist findet WinSight fast gar kein IDs mehr!?

Kannst du mir das vielleicht doch nochmal ausführlicher erklären? :)

Luckie 21. Mär 2003 15:38

So lange du keine eindeutige ID hast, geht es erstmal nicht weiter.

X-Dragon 23. Mär 2003 17:33

Zitat:

Zitat von Luckie
So lange du keine eindeutige ID hast, geht es erstmal nicht weiter.

Wie ich dachte das wäre eine sichere Lösung? :shock:

Naja dann muss ich wohl einen anderen Weg gehen und in meinem Edit-Felder einen Standard-Text reinschreiben um sie klar zu identifizieren, hoffentlich klappt das wenigstens ...

Luckie 23. Mär 2003 18:20

Wenn die Edit eine eindeutige ID haben ist es ja auch sicher. Wenn ich meiune Dialoge mit dem VC erstelle haben sie alle eine eindeutige ID. Allerdings habe ich noch die geprüft wie die VCL das macht mit den ID's, ob überhaupt eine vergeben wird und wenn ja ob für jedes Edit eine eindeutige oder nicht.

jbg 23. Mär 2003 18:48

Die VCL macht sich das Leben da ganz einfach: Es lässt Windows eine eindeutige ID bestimmen, die dem Handle-Wert entspricht.

Luckie 23. Mär 2003 18:52

Also nicht zu gebrauchen. :x

jbg 23. Mär 2003 18:55

Da die Daten nur beim Programmstart benötigt werden, könnte man auch Memory Mapped Files oder sogar eine Pipe einsetzen.

X-Dragon 23. Mär 2003 21:36

Zitat:

Zitat von jbg
Da die Daten nur beim Programmstart benötigt werden, könnte man auch Memory Mapped Files oder sogar eine Pipe einsetzen.

Könntest du das noch etwas näher erläutern, im Zusammenhang mit Delphi sagt mir das überhaupt nichts :roll: .

X-Dragon 24. Mär 2003 07:45

Ok, das mit dem Standard-Text kann ich bei mir leider nicht nutzen. Hat vielleicht sonst jemand noch eine Idee wie das funktionieren kann?

X-Dragon 24. Mär 2003 16:04

Falls das noch jemadn interessiert, ich arbeite mich gerade da durch:
http://msdn.microsoft.com/library/de...unications.asp

Damit sollte sich das Problem eigentlich in den Griff bekommen lassen, aber jetzt mach ich Feierabend :).

X-Dragon 25. Mär 2003 09:23

Wie schön das man auf die einfachsten Sachen einfach nicht kommt, wenn man sie braucht :).

Also ich hab jetzt erstmal 2 einfache Möglichkeiten gefunden die ich, zumindest in meinem Fall, nutzen kann. Zum einen werden die Daten in einer Temporären-Datei gespeichert und die andere Anwendung kontrolliert beim Start ob diese vorhanden ist und liest diese dann aus.

Und die andere Möglichkeit ist eigentlich genauso einfach, und zwar übergebe ich die Daten einfach als Parameter beim Aufruf der anderen Anwendung, per ShellExecute :).

[edit]
und so sieht jetzt meine Lösung aus:

Delphi-Quellcode:
  ShellExecute(0, 'open',
               PChar(ExtractFilePath(Application.ExeName)+'Reifenstart.exe'), // zu startende Anwendung
               PChar(txt), // Parameter (Text der Edit-Felder)
               '', SW_SHOW);
und in der dann gestarteten Anwendung:
Delphi-Quellcode:
  if ParamCount = 3 then // es sollten 3 Parameter übergeben werden, wenn nicht dann eben nicht :)
  begin
    EdNameA.Text := ParamStr(1);
    EdKennzA.Text := ParamStr(2);
    EdTypA.Text := ParamStr(3);
    BtNeu.Click;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz