AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Nicht modales Fenster reagiert nicht mehr
Thema durchsuchen
Ansicht
Themen-Optionen

Nicht modales Fenster reagiert nicht mehr

Ein Thema von Luckie · begonnen am 27. Mai 2006 · letzter Beitrag vom 28. Mai 2006
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Nicht modales Fenster reagiert nicht mehr

  Alt 27. Mai 2006, 14:06
Ich zeige in einem Thread ein nicht modales Fenster an:

Delphi-Quellcode:
function Thread(p: PThreadParams): Integer;
var
  Info : PWaitInfo;
  hDlg : THandle;
begin

  New(Info);
  Info.hParent := p.hParent;
  Info.InfoText := rsWaitPrivileges;

  EnableWindow(p.hParent, False);
  hDlg := CreateDialogParam(hInstance, MAKEINTRESOURCE(500), p.hParent, @waitdlgproc, Integer(Info));
  try
    FillLVGroups(p.hParent, hDlg, ID_LV_GROUPS);
    FillLVPrivileges(p.hParent, hDlg, ID_LV_PRIVILEGES);
  except
    on E: Exception do
      DisplayExceptionMsg(p.hParent, E.Errorcode, E.Message, rsErrorGetPrivilegesCap);
  end;

  sleep(5000);
  EnableWindow(p.hParent, True);
  DestroyWindow(hDlg);
  Dispose(Info);

  Dispose(p);
  result := 0;
end;
Der Code zu CreateDialogParam sieht so aus:
Delphi-Quellcode:
(******************************************************************************
*                                                                            *
*  Usermanager                                                              *
*  WaitDlg -- WaitDialog                                                    *
*                                                                            *
*  Copyright (c) 2006 Michael Puff  [url]http://www.michael-puff.de[/url]              *
*                                                                            *
******************************************************************************)


unit WaitDlg;

interface

uses
  Windows,
  Messages;

const
  ID_STC_INFO = 501;

type
  TWaitInfo = record
    hParent: THandle;
    InfoText: WideString;
  end;
  PWaitInfo = ^TWaitInfo;

function waitdlgproc(hDlg: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): bool; stdcall;

implementation

function waitdlgproc(hDlg: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): bool; stdcall;
var
  rect, rect1 : TRect;
  x, y : Cardinal;
  hParent : THandle;
  Text : WideString;
begin
  Result := true;

  case uMsg of
    WM_INITDIALOG:
      begin
        hParent := PWaitInfo(lParam)^.hParent;
        Text := PWaitInfo(lParam)^.InfoText;
        GetWindowRect(hParent, rect);
        GetWindowRect(hDlg, rect1);
        x := rect.Left - ((rect.Left - rect.Right) div 2) - ((rect1.Right - rect1.Left) div 2);
        y := rect.Top - ((rect.Top - rect.Bottom) div 2) - ((rect1.Bottom - rect1.Top) div 2);
        SetWindowPos(hDlg, 0, x, y, 0, 0, SWP_NOSIZE);
        SetWindowPos(GetDlgItem(hDlg, 299), 0, 0, 0, 305, 2, SWP_NOMOVE or SWP_SHOWWINDOW);
        SetDlgItemTextW(hDlg, ID_STC_INFO, PWideChar(Text));
      end;
  else
    Result := false;
  end;
end;

end.
Jetzt habe ich aber festgestellt, dass es, trotz dass es nicht modal, ist einfriert. Woran liegt das? Oder anderes gefargt, was mache ich falsch?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Nicht modales Fenster reagiert nicht mehr

  Alt 27. Mai 2006, 15:13
Ich denke, ich habe da Problem erkannt: Der Dialog hat keine Nachrichtenschleife. In einer dpr-Datei steht die Nachrichtenschleife im Hauptprogramm, dort habe ich auch eine für das Hauptfenster. Nur wo bringe ich die Nachrichtenchleife in einer Unit unter?

Zur Zeit sieht es so aus: Hauptfenster wird erzeugt mit CreateDialog und einer Nachrichtenschleife. Dann wird ein weiteres Fenster mit DialogBoxParam modal erzeugt und dann eben das besagte Fenster nicht modal mit CreateDialogParam. Also drei Fenster übereinander. Ich habe auch schon versucht, das zweite, modale Fenster, nicht modal zu erzeugen, so dass die Nachrichtenschleife vom Hauptfenster noch arbeitet, aber das hat auch nichts geholfen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#3

Re: Nicht modales Fenster reagiert nicht mehr

  Alt 27. Mai 2006, 15:22
Zitat von Luckie:
Nur wo bringe ich die Nachrichtenchleife in einer Unit unter?
Ist doch deine Sache, oder?

Manchmal frage ich mich wo die Grundlagen bleiben

Jeder Thread hat kann eine Nachrichtenschleife haben. Und wo ist der Startpunkt des Hauptthreads üblicherweise? Genau. Und wo ist dann der Startpunkt deines neuen Threads in dem jetzt der Dialog angezeigt werden soll? Genau. Siehste, jetzt haste es doch schon .... Grundlagen, Luckie. Grundlagen!

Übrigens: ob der nun modal oder nicht-modal ist, ist solange egal, wie nicht ein weiterer Dialog (auch Messageboxen) im selben Thread angezeigt wird.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Nicht modales Fenster reagiert nicht mehr

  Alt 27. Mai 2006, 15:54
Der letzte Satz war der entscheidende, denke ich.

Delphi-Quellcode:
        EnableWindow(hDlg, False);
        New(Info);
        Info.hParent := hDlg;
        Info.InfoText := rsWaitPrivileges;
        hWaitDlg := CreateDialogParam(hInstance, MAKEINTRESOURCE(500), hDlg, @waitdlgproc, Integer(Info));
        //Dispose(Info);

        New(ThreadParams);
        ThreadParams.hParent := hDlg;
        ThreadParams.hWaitDlg := hWaitDlg;
        CloseHandle(BeginThread(nil, 0, @Thread, ThreadParams, 0, ThreadID));
Jetzt erstelle ich das Fenster außerhalb des Threads. Allerdings klappt das Zerstören innerhalb des Threads nicht mehr:

Delphi-Quellcode:
function Thread(p: PThreadParams): Integer;
begin
  try
    FillLVGroups(p.hParent, ID_LV_GROUPS);
    FillLVPrivileges(p.hParent, ID_LV_PRIVILEGES);
  except
    on E: Exception do
      DisplayExceptionMsg(p.hParent, E.Errorcode, E.Message, rsErrorGetPrivilegesCap);
  end;

  sleep(5000);
  DestroyWindow(p.hWaitDlg);
  EnableWindow(p.hParent, True);

  Dispose(p);
  result := 0;
end;
GetLastError liefert mir "Zugriff verweigert". Darf ich DestroyWindow nicht in einem anderen Thread aufrufen?

Da hebn wirs:
Zitat:
A thread cannot use DestroyWindow to destroy a window created by a different thread.
Und nu?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Nicht modales Fenster reagiert nicht mehr

  Alt 27. Mai 2006, 16:59
Habe eine Lösung gefunden:
Delphi-Quellcode:
procedure WaitThread(ThreadFunc: TThreadFunc; Params: Pointer; Info: TWaitInfo);
var
  hWaitDlg : THandle;
  hThread : THandle;
  ThreadID : Cardinal;
  ExitCode : DWORD;
begin
  EnableWindow(Info.hParent, False);
  hWaitDlg := CreateDialogParam(hInstance, MAKEINTRESOURCE(500), Info.hParent, @waitdlgproc, Integer(@Info));

  hThread := BeginThread(nil, 0, @ThreadFunc, Params, 0, ThreadID);
  repeat
    GetExitCodeThread(hThread, ExitCode);
    ProcessMessages(hWaitDlg);
    ProcessMessages(info.hParent);
    sleep(1);
  until ExitCode = 0;
  DestroyWindow(hWaitDlg);
  EnableWindow(info.hParent, True);
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#6

Re: Nicht modales Fenster reagiert nicht mehr

  Alt 27. Mai 2006, 18:25
Sind Parent und Child in verschiedenen Threads? Bin nicht sicher, daß das so gut ist ...
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#7

Re: Nicht modales Fenster reagiert nicht mehr

  Alt 27. Mai 2006, 18:43
Ui, eine solche Frage hätte ich von einem Luckie nicht erwartet.

Implementiere doch eine temporäre nachrichtenschleife in den Thread, die solange läuft, wie das Fenster / der Thread existiert.

Und denke bitte immer daran deine Nachrichten an die DefWindowProc weiterzuleiten. Bill Gates wird es dir danken
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#8

Re: Nicht modales Fenster reagiert nicht mehr

  Alt 27. Mai 2006, 20:20
Zitat von Vjay:
Ui, eine solche Frage hätte ich von einem Luckie nicht erwartet.
Erwähnte ich ja schon. Aber tun wir mal so, als hätte er nur nen schwachen Moment gehabt ...

Zitat von Vjay:
Bill Gates wird es dir danken
Echt? Hat der nen weltweiten Message-Hook installiert? Und wie heißt die Konstante zum Installieren? WH_...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Nicht modales Fenster reagiert nicht mehr

  Alt 28. Mai 2006, 01:13
Zitat von Olli:
Sind Parent und Child in verschiedenen Threads? Bin nicht sicher, daß das so gut ist ...
hWaitDlg ist dieses Fenster mit der Animation und hParent ist zum Beispiel das Hauptfenster.


Zitat von Vjay:
Ui, eine solche Frage hätte ich von einem Luckie nicht erwartet.
Ich hatte echt einen Blackout.

Zitat:
Implementiere doch eine temporäre nachrichtenschleife in den Thread, die solange läuft, wie das Fenster / der Thread existiert.
Das macht ja ProcessMessages.

Zitat:
Und denke bitte immer daran deine Nachrichten an die DefWindowProc weiterzuleiten. Bill Gates wird es dir danken
Bei einem Dialog gibt man in diesem Fall als Result False zurück.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 04:58 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