![]() |
Probleme mit EnumProc
Ich arbeite zu Zeit viel mit einem Wave-Editor (WavePad) und habe einen häufig wiederkehrenden Vorgang abzuarbeiten, nämlich
1) Ab aktueller Position bis Dateianfang markieren. 2) Im Bearbeiten-Menu "Markierten Bereich speichern als" wählen. 3) Im dann erscheinenden SaveDialog den Dateinamen eingeben. 4) "Speichern"-Button drücken. Ich möchte das automatisieren. 1 und 2 habe ich bereits. Das Handle des SaveDialogs finde ich auch. Aber für das dann folgende macht mir die EnumProc, die ich zum suchen des Edits für den Dateinamen und des "Speichern"-Buttons verwende, Probleme. Die EnumProc läuft einmal fehlerfrei durch und beim zweiten Durchlauf krachts: Im Projekt Chat.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x005632cc: read of address 0x0c7164b0' aufgetreten. Das Ganze ist reproduzierbar. Hat jemand eine Idee, wo der Fehler liegt?
Delphi-Quellcode:
function SaveDlgEnumProc(win:HWND; ctrls:array of HWND): BOOL; stdcall;
var s:string; buf:array[0..255] of char; begin Result:=True; GetClassName(win,buf,256); s:=buf; if s='Button' then begin SendMessage(win,WM_GETTEXT,256,Integer(@buf)); s:=buf; if s='Speichern' then ctrls[1]:=win; end else if s='Edit' then begin ctrls[0]:=win; end; end;
Delphi-Quellcode:
PROCEDURE TMain.Test(win:HWND; const dsn:string);
var ctrls:Array of HWND; begin SetLength(ctrls,2); ctrls[0]:=0; // Edit ctrls[1]:=0; // Speichern-Button EnumChildWindows(Win,@SaveDlgEnumProc,NativeInt(ctrls)); if ctrls[0]<>0 then begin SendMessage(ctrls[0],WM_SETTEXT,0,Integer(PChar(dsn))); if Ctrls[1]<>0 then SendMessage(ctrls[1],BM_Click,0,0); end; end; |
AW: Probleme mit EnumProc
So ganz schnell zwischen Tür und Angel:
Du prüfst in deiner
Delphi-Quellcode:
nicht, ob
SaveDlgEnumProc
Delphi-Quellcode:
in
GetClassName
Delphi-Quellcode:
auch wirklich etwas hereingeschrieben hat. Schaue wenigstens auf den Rückgabewert der Funktion, wenn der False ist, wurde auch nichts dort hineingeschrieben.
buf
|
AW: Probleme mit EnumProc
Delphi-Quellcode:
// **
type Tctrls = Array of HWND; // ** function SaveDlgEnumProc(win: HWND; ctrls: Pointer): BOOL; stdcall; var s: string; buf: array [0 .. 255] of char; begin Result := True; GetClassName(win, buf, 256); s := buf; if s = 'TButton' then // ** begin SendMessage(win, WM_GETTEXT, 256, Integer(@buf)); s := buf; if s = 'Speichern' then Tctrls(ctrls^)[1] := win; end else if s = 'TEdit' then // ** begin Tctrls(ctrls^)[0] := win; end; end; procedure TForm3.Button1Click(Sender: TObject); begin Test(handle, 'test') end; procedure TForm3.Button3Click(Sender: TObject); begin Showmessage(TButton(Sender).Caption); end; PROCEDURE TForm3.Test(win: HWND; const dsn: string); var ctrls: Tctrls; // ** begin SetLength(ctrls, 2); ctrls[0] := 0; // Edit ctrls[1] := 0; // Speichern-Button EnumChildWindows(win, @SaveDlgEnumProc, NativeInt(@ctrls)); // ** if ctrls[0] <> 0 then begin SendMessage(ctrls[0], WM_SETTEXT, 0, Integer(PChar(dsn))); if ctrls[1] <> 0 then SendMessage(ctrls[1], BM_Click, 0, 0); end; end; |
AW: Probleme mit EnumProc
@Der schöne Günther:
Ja, das sollte man wohl machen, aber daran lag es nicht. @Bummi: Das hat geholfen. Übrigens die ClassNames sind tatsächlich "Button" und "Edit", beide ohne "T". Vielen Dank an beide von euch. |
AW: Probleme mit EnumProc
@Amateurprofi OK, wusste ich nicht und zum testen war es mit "T" ohnehin einfacher:angel2:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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