Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.064 Beiträge
 
Delphi XE2 Professional
 
#1

Probleme mit EnumProc

  Alt 17. Apr 2013, 18:25
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='Buttonthen begin
      SendMessage(win,WM_GETTEXT,256,Integer(@buf));
      s:=buf;
      if s='Speichernthen ctrls[1]:=win;
   end else if s='Editthen 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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat