AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit EnumProc

Ein Thema von Amateurprofi · begonnen am 17. Apr 2013 · letzter Beitrag vom 17. Apr 2013
Antwort Antwort
Amateurprofi

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

Probleme mit EnumProc

  Alt 17. Apr 2013, 17: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
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Probleme mit EnumProc

  Alt 17. Apr 2013, 17:28
So ganz schnell zwischen Tür und Angel:

Du prüfst in deiner SaveDlgEnumProc nicht, ob GetClassName in buf auch wirklich etwas hereingeschrieben hat. Schaue wenigstens auf den Rückgabewert der Funktion, wenn der False ist, wurde auch nichts dort hineingeschrieben.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Probleme mit EnumProc

  Alt 17. Apr 2013, 17:50
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 = 'TButtonthen // **
  begin
    SendMessage(win, WM_GETTEXT, 256, Integer(@buf));
    s := buf;
    if s = 'Speichernthen
      Tctrls(ctrls^)[1] := win;
  end
  else if s = 'TEditthen // **
  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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Amateurprofi

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

AW: Probleme mit EnumProc

  Alt 17. Apr 2013, 18:36
@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.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Probleme mit EnumProc

  Alt 17. Apr 2013, 18:43
@Amateurprofi OK, wusste ich nicht und zum testen war es mit "T" ohnehin einfacher
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 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