Autor Beitrag
LarsBeuth
Hält's aus hier
Beiträge: 2

Win 2000, Win XP
Delphi v5
BeitragVerfasst: Fr 03.02.06 18:26 
Hallo,

ich bruete seit heute Morgen ueber der Implementierung eines TCommonDialog Dialogs.

Das Problem ist folgendes:
Ich habe eine Klasse von TCommonDialog abgeleitet und ein TForm (TTntForm) eingefuegt, welches lediglich eine ListBox (TTntExtListView) enthaelt. Wenn man auf einen Listeintrag doppelklickt, soll der Dialog mit IDOK geschlossen werden.
Die 'OnDoppelClick'-Methode enthaelt folgenden Code:
ausblenden Delphi-Quelltext
1:
2:
if elvStepList.Selected <> nil then
   EndDialog(GetParent(Handle), IDOK);


Soviel ich weiss passiert danach folgendes:
Der Handle des TTntForm wird auf 0 gesetzt. Anscheinend ist dieses TTntForm dann der Meinung, sich neu erstellen zu muessen, was in der Methode "TTntForm.CreateWindowHandle" schief geht.

Ergebnis ist ein: "EWin32Error 'Win32 Error Code: 1400. Invalid window handle.' ". Der Debugger landet in der SysUtils-Methode: RaiseLastWin32Error.

Sowohl der TCommonDialog Dialog, als auch das TTntForm Object sind globale Variables. Die TTntForm wird in der ExplorerHook Methode erstellt.

Mir erscheint das Arbeiten mit dieser TCommonDialog Klasse recht umstaendlich. Sicherlich kann da 'ne ganze Menge falsch sein. Allerdings muesste ich ziemlich viel Code in diesen Text einfuegen, um alle Informationen zu geben.

Es wuerde mich sehr freuen, wenn jemand mir einen Tip geben koennte, wo das Problem liegen koennte.

Vielen Dank im voraus

Lars Beuth

Moderiert von user profile iconChristian S.: Quote- durch Delphi-Tags ersetzt
LarsBeuth Threadstarter
Hält's aus hier
Beiträge: 2

Win 2000, Win XP
Delphi v5
BeitragVerfasst: Mi 22.02.06 14:47 
Ich habe selbst eine Loesung fuer dieses Problem gefunden - vielleicht stoesst ja mal jemand auf ein vergleichbares Problem:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function ExplorerHook(Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): UINT; stdcall;
{-----------------------------------------------------------------------------
  Descr:  Open and Save dialog routines.
  Args:   Wnd: HWnd; Msg: UINT; WParam: WPARAM; LParam: LPARAM
  Result: UINT
 -----------------------------------------------------------------------------}

var
  DlgHandle: THandle;
begin
  Result := 0;

  DlgHandle := GetParent(Wnd);

  case Msg of
    WM_Notify:
      case (POFNotify(LParam)^.HDR.Code) of
        CDN_INITDONE: InitializeDialog(Wnd, DlgHandle);
        CDN_SELCHANGE: SelectionChange(DlgHandle);
        CDN_TYPECHANGE: TypeChange(DlgHandle);
      end;
    WM_DESTROY: {This message is received before WM_NCDESTROY}
      {Do something with the components of the dialog - here they can still be accessed}  
    WM_NCDESTROY: {This message is received after WM_DESTROY}
      FreeAndNil(FileStepList);
  end;
end;


Zuerst wird WM_DESTROY aufgerufen, dann WM_NCDESTROY. In WM_DESTROY kann man noch auf die (selbst erstellten) Komponenten des Dialogs zugreifen. Bei Aufruf der WM_NCDESTROY message werden die selbst erstellten Komponenten entfernt.

Moderiert von user profile iconraziel: Quote- durch Delphi-Tags ersetzt