![]() |
Re: Anstatt ID den Namen verwenden?
Moin Mirco,
wenn ich das richtig verstanden habe, so benötigtst Du doch eine bestimmte ComboBox. Wenn nun die ID nicht eindeutig ist, so könntest Du mittels EnumChildWindows durch alle Bestandteile des Formulares durchgehen, und die Klasse prüfen. Stimmt die Klasse überein, noch die Position des Controls prüfen. Stimmt die mit dem gesuchten überein, den Text auslesen. Evtl. genügt natürlich auch die Prüfung der Position. |
Re: Anstatt ID den Namen verwenden?
Hallo Christian,
ich hab schonmal folgendes gemacht, bekomme aber immer nur die erste Checkbox zurück. Bin ich mit dem Beispiel schon auf dem richtigen Weg? Grüsse Mirco
Delphi-Quellcode:
const
WinName = 'Fax 1.1'; WinClass = nil; implementation {$R *.dfm} function EnumProc(StHandle: HWND; lines: TStrings): boolean; stdcall; var buffer, desc: array[0..100] of char; // max. 101 Zeichen begin GetClassname(StHandle, buffer, 100); // 100 GetWindowText(StHandle, desc, 100); // 100 lines.add(format('ID: %d, Class: %s, Text: %s', [GetDlgCtrlID(StHandle), buffer, desc])); end; procedure TForm1.Button1Click(Sender: TObject); var hwnd: dword; begin Memo1.clear; hwnd := FindWindow(WinClass, WinName); if hwnd <> 0 then begin showmessage(IntToStr(hwnd)); if (hwnd = 0) then begin messagebox(0, 'Programm nicht im Speicher!', 'Warning!', 0); exit; end; EnumChildWindows(hwnd, @EnumProc, Integer(Memo1.Lines)); end; end; |
Re: Anstatt ID den Namen verwenden?
Hallo,
probier mal folgendes
Delphi-Quellcode:
function EnumProc(StHandle: HWND; lines: TStrings): boolean; stdcall;
var buffer, desc: array[0..100] of char; // max. 101 Zeichen begin GetClassname(StHandle, buffer, 100); // 100 GetWindowText(StHandle, desc, 100); // 100 lines.add(format('ID: %d, Class: %s, Text: %s', [GetDlgCtrlID(StHandle), buffer, desc])); EnumChildWindows(StHandle, @EnumProc, Integer(Lines)); end; |
Re: Anstatt ID den Namen verwenden?
Moin Mirco,
Du hast in der EnumProc eine wichtige Zeile vergessen:
Delphi-Quellcode:
Ich denke mal, dass Dir der Compiler auch ein Warning ausgegeben hat, dass der Rückgabewert unbestimmt ist.
Result := true;
Aller Voraussicht nach ist der Wert von Result gleich false, so dass nach dem ersten gefundenen Control abgebrochen wird. BTW: Korrekter als Boolean ist Longbool als Rückgabewert der Funktion. |
Re: Anstatt ID den Namen verwenden?
Zitat:
Wieso das? Wo liegt der Unterschied? |
Re: Anstatt ID den Namen verwenden?
Moin Markus,
BOOL ist ein 32 Bit grosser Rückgabewert, genauso wie Longbool, wohingegen boolean nur ein Byte gross ist. Ersatzweise kann man auch BOOL nehmen (in der Windows.pas ist BOOL als Longbool deklariert). Je nachdem, welche Windows-Headerdatei man heranzieht, ist BOOL als int (windef.h) oder long (wtypes.h) deklariert. Beide Typen entsprechen dem integer in Delphi. |
Re: Anstatt ID den Namen verwenden?
Ahja.
Danke, wieder was gelernt :) |
Re: Anstatt ID den Namen verwenden?
Hallo
Danke für eure Antworten. Ich hab nun folgendes übernommen, obwohl ich die Änderung nicht verstanden habe:
Delphi-Quellcode:
Damit bekomm ich nun die einzelnen Komponenten inkl. ID angezeigt, leider wird der Text meiner Combobox nicht ausgelesen, woran kann das liegen?
function EnumProc(StHandle: HWND; lines: TStrings): boolean; stdcall;
var buffer, desc: array[0..100] of char; // max. 101 Zeichen begin GetClassname(StHandle, buffer, 100); // 100 GetWindowText(StHandle, desc, 100); // 100 lines.add(format('ID: %d, Class: %s, Text: %s', [GetDlgCtrlID(StHandle), buffer, desc])); EnumChildWindows(StHandle, @EnumProc, Integer(Lines)); Result := true; end; Ist Result Longbool? Viele Grüsse Mirco |
Re: Anstatt ID den Namen verwenden?
Moin Mirco,
da es sich um ein Control handelt, dass zu einem anderen Prozess gehört, solltest Du mal
Delphi-Quellcode:
nehmen statt GetWindowText.
SendMessage(StHandle,WM_GETTEXT,101,lParam(@desc[1]);
Vielleicht hilft das schon. [EDIT] Zitat:
[/EDIT] |
Re: Anstatt ID den Namen verwenden?
Hallo Christian,
nun klappt es mit dem Text auslesen. Vielen Dank, ich werde mit Sicherheit noch einige Zeit brauchen bis ich das alles verstanden haben, aber es ist echt ein verdammt spannendes Thema. ich hab das jetzt so gemacht.
Delphi-Quellcode:
Viele Grüsse und vielen Dank an alle die mitgedacht haben.
var
Result:Longbool; Mirco |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 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 by Thomas Breitkreuz