Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Probleme mit EnumProc (https://www.delphipraxis.net/174330-probleme-mit-enumproc.html)

Amateurprofi 17. Apr 2013 17:25

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;

Der schöne Günther 17. Apr 2013 17:28

AW: Probleme mit EnumProc
 
So ganz schnell zwischen Tür und Angel:

Du prüfst in deiner
Delphi-Quellcode:
SaveDlgEnumProc
nicht, ob
Delphi-Quellcode:
GetClassName
in
Delphi-Quellcode:
buf
auch wirklich etwas hereingeschrieben hat. Schaue wenigstens auf den Rückgabewert der Funktion, wenn der False ist, wurde auch nichts dort hineingeschrieben.

Bummi 17. Apr 2013 17:50

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;

Amateurprofi 17. Apr 2013 18:36

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.

Bummi 17. Apr 2013 18:43

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 03:46 Uhr.

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