AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
Thema durchsuchen
Ansicht
Themen-Optionen

Win32 non-Vcl ein zweites Window Modal und Umlaute Frage

Ein Thema von KodeZwerg · begonnen am 25. Mai 2018 · letzter Beitrag vom 26. Mai 2018
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#21

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage

  Alt 26. Mai 2018, 03:21
So ist es dann der letzte Vorgang im alten Fenster danach passiert ja nichts mehr und du hast alles abgearbeitet.
Ich habe da so eine berühmte Vcl Weisheit im Kopf "ein deaktiviertes Fenster kann nicht den Fokus erhalten".
Von daher glaube ich schon das im WM_CREATE des zweiten Window das erste Window erst deaktiviert werden müsste oder irre ich mich da? Das war es als ich meinte das es Sinn ergibt, nun machst Du meine heile Welt kaputt *schmunzel*


Das ist jetzt mein momenter Template Hauptteil, muss nur noch Positionen der Buttons anpassen.
Delphi-Quellcode:
{Fensterfunktion für Fenster 1}
function Wnd1Proc(hWnd1: HWND; uMsg: UINT; wParam: wParam; lParam: LParam):
  lresult; stdcall;
var
  x, y : integer;
begin
  Result := 0;
  case uMsg of
    WM_CREATE:
      begin
        {Fenster zentrieren}
        x := GetSystemMetrics(SM_CXSCREEN);
        y := GetSystemMetrics(SM_CYSCREEN);
        MoveWindow(hWnd1, (x div 2) - (Window1Width div 2),
          (y div 2) - (Window1Height div 2),
          Window1Width, Window1Height, true);

        hwndBtnExit := CreateWindowEx(0, 'BUTTON', 'Beenden',
          WS_CHILD or WS_VISIBLE, 200, 300,
          100, 25, hWnd1, IDC_BTNEXIT, hInstance, nil);
        hwndBtnAbout := CreateWindowEx(0, 'BUTTON', 'Über',
          WS_CHILD or WS_VISIBLE, 200, 160,
          100, 25, hWnd1, IDC_BTNABOUT, hInstance, nil);
      end;
    WM_COMMAND:
      begin
        if HiWord(wParam) = BN_CLICKED then
          case LoWord(wParam) of
            IDC_BTNEXIT: SendMessage(hWnd1, WM_CLOSE, 0, 0);
            IDC_BTNABOUT:
              {Fenster 2 erzeugen und anzeigen}
              begin
                hWndAbout := CreateWindowEx(0, ClassName2, Window2Name,
                  WS_OVERLAPPEDWINDOW or WS_VISIBLE, 40, 10,
                  300, 200, hWnd1, 0, hInstance, nil);
              end;
          end;
      end;
    WM_DESTROY:
      begin
        PostQuitMessage(0);
      end;
  else
    Result := DefWindowProc(hWnd1, uMsg, wParam, lParam);
  end;
end;

{Fensterfunktion für Fenster 2}
function Wnd2Proc(hWnd2: HWND; iMsg: UINT; wParam: wParam; lParam: LParam):
  lresult; stdcall;
var
  x, y : integer;
begin
  Result := 0;
  case iMsg of
    WM_CREATE:
      begin
        EnableWindow(hWndMain, false);
        {Fenster zentrieren}
        x := GetSystemMetrics(SM_CXSCREEN);
        y := GetSystemMetrics(SM_CYSCREEN);
        MoveWindow(hWnd2, (x div 2) - (Window2Width div 2),
          (y div 2) - (Window2Height div 2),
          Window2Width, Window2Height, true);
        hwndBtnExit := CreateWindowEx(0, 'BUTTON', 'Beenden',
          WS_CHILD or WS_VISIBLE, 100, 100,
          100, 25, hWnd2, IDC_BTNEXIT, hInstance, nil);
      end;
    WM_COMMAND:
      begin
        if HiWord(wParam) = BN_CLICKED then
          case LoWord(wParam) of
            IDC_BTNEXIT: SendMessage(hWnd2, WM_CLOSE, 0, 0);
          end;
      end;
    WM_CLOSE:
      begin
        EnableWindow(hWndMain, True);
        DestroyWindow(hWnd2);
      end;
    else
      Result := DefWindowProc(hWnd2, iMsg, wParam, lParam);
  end;
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#22

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage

  Alt 26. Mai 2018, 08:58
Zitat:
Ich habe da so eine berühmte Vcl Weisheit im Kopf "ein deaktiviertes Fenster kann nicht den Fokus erhalten".
Was hat das damit zu tun?
Und wo bekommt beim erstellen des neuen Fensters das alte den Focus wenn es sich erst danach selbst deaktiviert?
Es hat diesen bereits (Dein Button auf dem du klickst) und zwar solange bis das neue erstellt wird\wurde.

Du must das eigene Fenster aus der Funktion deaktivieren wo du das neue Window erstellst aber nicht vorher (vorher = Deadlock) je nach dem
was du danach noch tun willst und das Fenster es nicht kann weil deaktiviert

sondern nach dem erstellen und EnableWindow die letzte Aktion ist die im ButtonClick Event ausgeführt wird.
...
Ok mach wie du es willst.

EDIT:
Beispiel.

Du klickst auf Button und erstellst ein neues Fenster.
In dem Fenster das erstellt wird deaktivierst du das ParentWindow.
Jetzt möchte ich aber im ParentWindow was das neue Fenster erstellt noch etwas zeichnen nach dem das neue Fenster erstellt wurde.
Nun.. Was denkst du zeichnet sich dann noch nachdem du das Fenster von außerhalb deaktiviert hast? Klassischer Todesstoß

gruss

Geändert von EWeiss (26. Mai 2018 um 10:16 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#23

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage

  Alt 26. Mai 2018, 10:36
Nebenbei.. das ist auch nicht richtig.

Delphi-Quellcode:
   {Fenste 1 erzeugen und hWnd1 zuweisen}
   hWnd1 := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or
     WS_OVERLAPPEDWINDOW,
     CW_USEDEFAULT, CW_USEDEFAULT, WindowWidth1, WindowHeight1, 0, 0, hInstance,
     nil);
CW_USEDEFAULT.. DWORD <> Integer. Du verletzt die untere Grenze.

entweder die Konstanten ganz weg lassen also mit 0 ersetzen oder aber zu integer konvertieren.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage

  Alt 26. Mai 2018, 10:46
CW_USEDEFAULT.. DWORD <> Integer. Du verletzt die untere Grenze.
Delphi-Quellcode:
  {Fenste 1 erzeugen und hWnd1 zuweisen}
  hWndMain := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or
    WS_OVERLAPPEDWINDOW,
    Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Window1Width, Window1Height, 0, 0, hInstance,
    nil);
Habe das so abgeändert, korrekt oder völlig falsch?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#25

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage

  Alt 26. Mai 2018, 10:52
CW_USEDEFAULT.. DWORD <> Integer. Du verletzt die untere Grenze.
Delphi-Quellcode:
  {Fenste 1 erzeugen und hWnd1 zuweisen}
  hWndMain := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or
    WS_OVERLAPPEDWINDOW,
    Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Window1Width, Window1Height, 0, 0, hInstance,
    nil);
Habe das so abgeändert, korrekt oder völlig falsch?
Ist ok.. wobei du auch LPARAM dafür hättest nutzen können.
Ja, ja der EWeiss ist mit nichts zugfrieden.

Delphi-Quellcode:
   {Fenste 1 erzeugen und hWnd1 zuweisen}
   hWnd1 := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or
     WS_OVERLAPPEDWINDOW,
     LPARAM(CW_USEDEFAULT), LPARAM(CW_USEDEFAULT), WindowWidth1, WindowHeight1, 0, 0, hInstance,
     nil);
LOL

gruss

Geändert von EWeiss (26. Mai 2018 um 10:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage

  Alt 26. Mai 2018, 10:53
Danke fürs Aufpassen und Deine Hilfe dabei!

Nachtrag, Integer() mit LPARARM() ersetzt, kannst Du mir auch den Unterschied dabei sagen, das Versteh ich gerade irgendwie nicht so ganz?
Als Du sagtest "Du verletzt die untere Grenze." weil Integer gefordert wird, dachte ich, naiv wie ich bin, Caste ich mir den als Integer. LPARARM ist für mich gleichzusetzen wie ein LongWord also ein cast ala LongWord(CW_USEDEFAULT)
Gruß vom KodeZwerg

Geändert von KodeZwerg (26. Mai 2018 um 11:07 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#27

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage

  Alt 26. Mai 2018, 11:21
Danke fürs Aufpassen und Deine Hilfe dabei!

Nachtrag, Integer() mit LPARARM() ersetzt, kannst Du mir auch den Unterschied dabei sagen, das Versteh ich gerade irgendwie nicht so ganz?
Als Du sagtest "Du verletzt die untere Grenze." weil Integer gefordert wird, dachte ich, naiv wie ich bin, Caste ich mir den als Integer. LPARARM ist für mich gleichzusetzen wie ein LongWord also ein cast ala LongWord(CW_USEDEFAULT)
Seit wann ?
LPARAM ist bei mir immer noch INT_PTR.
INT_PTR = Integer;

LongWord := 0..4294967295; Minus Bereiche ausgeschlossen deshalb Verletzung der Untergrenze.
Integer := -2147483648..2147483647

gruss

Geändert von EWeiss (26. Mai 2018 um 11:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#28

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage

  Alt 26. Mai 2018, 11:41
Vielleicht bringe ich da auch etwas durcheinander. War nicht LParam = 32bit LongWord und wParam = 16bit Word. Ich bin da bestimmt nicht auf dem aktuellen Stand der Dinge.

Hab gerade mal in Delphi geschaut, LParam ergibt ein Interger, jupp!

Deine Erklärung reicht mir völlig aus, Vielen Dank dafür, ich aktualisiere mich mal selbst ^_^

edit
Ps: Deswegen hatte ich es ja Gedanklich erst nicht Verstanden, weil ich da LParam mit LongWord irgendwie verankert hatte was ja keinen Negativ-Wert zulässt wo ich dann wieder bei "Du verletzt die untere Grenze." wäre.
Gruß vom KodeZwerg

Geändert von KodeZwerg (26. Mai 2018 um 11:53 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 18:14 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