![]() |
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 :). |
Schau dir mal die Messages WM_GETTEXTLENGTH und WM_GETTEXT an..
|
Zitat:
Zitat:
|
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: ![]() Zu WM_GETTEXT findest du auch was auf meiner Seite. |
.. ein paar dutzend Webseiten später ...
Delphi-Quellcode:
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?
var
ExEdit, Fenster : hwnd; begin Fenster := FindWindowEx(0,0,nil,PChar('Test-Fenster')); ExEdit := FindWindowEx(Fenster,0,nil,PChar('Test-Editfeld')); |
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. |
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"? |
Zitat:
Wann sollte denn Edit bzw wann TEdit als Klasse angegeben werden? |
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. |
Zitat:
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 :) |
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:
|
Zitat:
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. |
Mit der linken Maustaste auf das Fadenkreuz, gedrück halten und das gewünschte Fenster auswählen.
|
Zitat:
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? :) |
So lange du keine eindeutige ID hast, geht es erstmal nicht weiter.
|
Zitat:
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 ... |
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.
|
Die VCL macht sich das Leben da ganz einfach: Es lässt Windows eine eindeutige ID bestimmen, die dem Handle-Wert entspricht.
|
Also nicht zu gebrauchen. :x
|
Da die Daten nur beim Programmstart benötigt werden, könnte man auch Memory Mapped Files oder sogar eine Pipe einsetzen.
|
Zitat:
|
Ok, das mit dem Standard-Text kann ich bei mir leider nicht nutzen. Hat vielleicht sonst jemand noch eine Idee wie das funktionieren kann?
|
Falls das noch jemadn interessiert, ich arbeite mich gerade da durch:
![]() Damit sollte sich das Problem eigentlich in den Griff bekommen lassen, aber jetzt mach ich Feierabend :). |
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:
und in der dann gestarteten Anwendung:
ShellExecute(0, 'open',
PChar(ExtractFilePath(Application.ExeName)+'Reifenstart.exe'), // zu startende Anwendung PChar(txt), // Parameter (Text der Edit-Felder) '', SW_SHOW);
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