Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Win32 non-Vcl ein zweites Window Modal und Umlaute Frage (https://www.delphipraxis.net/196500-win32-non-vcl-ein-zweites-window-modal-und-umlaute-frage.html)

KodeZwerg 25. Mai 2018 19:09

Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe eine Demo gefunden was es einem sehr einfach macht "schnell mal" eine non-Vcl zu basteln, ein gutes Template hier aus dem Forum.
Was in dem Source steht ist für mich auch alles nachvollziehbar, soweit so gut.

Nun wollte ich den Source erweitern, mit einem "Über" Knopf und demzufolge auch einem zweiten Window.
Hierzu habe ich noch gar keine Erfahrung sammeln können.

Nach dem kompilieren stellte ich fest das der Source noch nicht deutsch kompatibel ist, das "Ü" von "Über" wird falsch dargestellt.

Kann mir jemand der sich damit auskennt helfen diese zwei Sachen zu erledigen?

Im Anhang ist der komplette Source und ein Kompilat.

Ps: Dieses non-Vcl basiert auf Code und nicht auf einen Resource Dialog.

EWeiss 25. Mai 2018 20:18

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Also wenn du mit WideChars arbeiten willst solltest du es auch verwenden.
CreateWindowEx zu CreateWindowExW

Das!
Delphi-Quellcode:
WinMain(hInstance, System.hPrevInst, System.CmdLine, System.CmdShow);


ist veraltet verwende statt dessen

Delphi-Quellcode:
WinMain(hInstance, 0, nil, 0);


gruss

Fritzew 25. Mai 2018 20:21

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
2 Anmerkungen
Ist D2009 die Delphi Version die du einsetzt?
Der Source von uMain ist als UTF8 gespeichert. Ändere das auf Ansi dann kommt auch Dein Ü
Alte Delphi Versionen hatten da öfter Schluckauf.
Und überprüfe mal Deine wItems......

Du produzierst ein Speicherleck und die Font Zuweisung funktioniert so auch nicht .....

EWeiss 25. Mai 2018 20:24

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

Zitat von Fritzew (Beitrag 1403009)
2 Anmerkungen
Ist D2009 die Delphi Version die du einsetzt?
Der Source von uMain ist als UTF8 gespeichert. Ändere das auf Ansi dann kommt auch Dein Ü
Alte Delphi Versionen hatten da öfter Schluckauf.
Und überprüfe mal Deine wItems......

Du produzierst ein Speicherleck und die Font Zuweisung funktioniert so auch nicht .....

Ein CreateWindowExW reicht.

Zitat:

Ist D2009 die Delphi Version die du einsetzt?
nö Tokyo sieht man am icon

gruss

mjustin 25. Mai 2018 20:32

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Könnte es daran liegen dass der Sourcecode als Kodierung UTF-8 verwendet (laut Notepad++), und der Compiler den UTF-8 kodierten Windownamen dann vermutlich so wie er ist in der EXE Datei ablegt? Dann wird zur Laufzeit ein UTF-8 kodierter Text übergeben, wo LPCTSTR erwartet wird.

Fritzew 25. Mai 2018 20:37

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

Zitat von EWeiss (Beitrag 1403010)
nö Tokyo sieht man am icon
gruss

Nur das er das als Resource einbindet das sagt mal gar nix aus

KodeZwerg 25. Mai 2018 21:06

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

Zitat von EWeiss (Beitrag 1403008)
CreateWindowEx zu CreateWindowExW

Klappt einwandfrei, Umlaut wird dargestellt, Danke!!
Zitat:

Zitat von EWeiss (Beitrag 1403008)
Delphi-Quellcode:
WinMain(hInstance, 0, nil, 0);

Ich habe das in .dpr auch verbessert, Danke!!
Zitat:

Zitat von Fritzew (Beitrag 1403009)
Und überprüfe mal Deine wItems......
Du produzierst ein Speicherleck und die Font Zuweisung funktioniert so auch nicht .....

Erledigt und Danke!!
Delphi-Quellcode:
        wItems[0] := CreateWindowEx(0, 'BUTTON', 'Beenden', WS_VISIBLE or WS_CHILD, 220, 130, 75, 25, hWnd, IDC_BTN_EXIT, hInstance, nil);
        wItems[1] := CreateWindowEx(0, 'BUTTON', 'Über', WS_VISIBLE or WS_CHILD, 220, 100, 75, 25, hWnd, IDC_BTN_ABOUT, hInstance, nil);
        wItems[2] := CreateWindowEx(0, 'STATIC', '', WS_VISIBLE or WS_CHILD or SS_BITMAP, 20, 20, 32, 32, hWnd, IDC_STC_BMP, hInstance, nil);

        SendMessage(wItems[2], STM_SETIMAGE, IMAGE_BITMAP, INTEGER(

Umlautproblem gelöst!:thumb::thumb::thumb:

Zu meinem Delphi, ich nutze Version 2009, die Resourcen lagen dem Beispiel bei.

Wenn mir jemand bitte noch helfen kann das ich mit diesem Code noch ein zweites Modalfenster öffnen kann, das wäre sehr hilfreich!

KodeZwerg 25. Mai 2018 21:48

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Liste der Anhänge anzeigen (Anzahl: 1)
Damit ihr seht woran es bei mir scheitert, hier mein 2 Fenster Kompilat plus Source.

Problem: Zweites Fenster ist nicht Modal. Beendet man zweites Fenster stirbt erstes Fenster und Programm ist Tot, nurnoch über Taskmanager zu beenden. Das ich Sachen total falsch mache ist mir schon klar, nur weiß ich noch nicht wie es korrekt sein müsste.

EWeiss 25. Mai 2018 22:05

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

Zitat von KodeZwerg (Beitrag 1403017)
Damit ihr seht woran es bei mir scheitert, hier mein 2 Fenster Kompilat plus Source.

Problem: Zweites Fenster ist nicht Modal. Beendet man zweites Fenster stirbt erstes Fenster und Programm ist Tot, nurnoch über Taskmanager zu beenden. Das ich Sachen total falsch mache ist mir schon klar, nur weiß ich noch nicht wie es korrekt sein müsste.

Kann nur wieder auf Luckies Samples verweisen.. ;)
Da ist doch alles was du begehrst.
Warum das Rad neu erfinden.

Da du so gut in Englisch bist hier eine extra Ressource für dich.

gruss

Luckie 25. Mai 2018 22:24

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Ich meine, ich habe das mit zwei Fenstern in meinen Tutorials abgehandelt.

EWeiss 25. Mai 2018 22:28

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

Zitat von Luckie (Beitrag 1403019)
Ich meine, ich habe das mit zwei Fenstern in meinen Tutorials abgehandelt.

Jo! ;)
1.1.7. Zwei Fenster erzeugen
Zitat:

Das komplette Beispiel für zwei Fenster finden Sie bei den Demos.
Nochmal der link
http://www.michael-puff.de/Programmi...lphi_Demos.zip
Das in dem Archiv enthaltende Demo
Win32API_Delphi_Demos\Samples\WindowsUI\Window\Two Windows.dproj

Noch einfacher geht es nicht.

@Luckie Ich mache Reklame für dich ;)

gruss

Luckie 25. Mai 2018 22:36

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Die Frage ist nur, ob auch modal. Da bin ich mir nicht mehr sicher. Aber im XP Usermanger habe ich modale Fenster/Dialoge benutzt. Und der ist Opensource. Vielleicht da mal gucken.

EWeiss 25. Mai 2018 22:37

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

Zitat von Luckie (Beitrag 1403021)
Die Frage ist nur, ob auch modal. Da bin ich mir nicht mehr sicher. Abe rim XP Usermanger hab eich modale Fenster benutzt. Und der ist Opensource.

Doch ist modal ;)

Nun der ist wohl zu kompliziert für ihn im Moment.
Artet nur in einer Copy\Paste Orgie aus.

gruss

KodeZwerg 25. Mai 2018 23:22

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage <GELÖST>
 
Das Example was Du da sagst ist auf jeden Fall besser als nichts!
Es erstellt kein Modal Fenster, man kann jederzeit zum Hauptfenster um noch eins und noch eins und noch eins zu erstellen.
Ich lese mich da mal rein da es zumindest mehr als ein Fenster kann :thumb:

Das PDF habe ich von diesem Server aber mit den Erklärungen darin für Fenster, um ein zweites zu erstellen fehlt da was bzw konnte ich es alleine nicht hinbiegen, man siehts ja im Zip.

Vielen Dank an EWeiss für den "mit den Gesicht ins Ziel drücken" Link, das tat gut!!!
Und logischerweise auch an Luckie für die Arbeit und das bereitstellen mit all den Dingen, das ist nicht selbstverständlich!!

Ich verdaue das alles erst mal, wenn ich mehr Hilfe brauche lasse ich es Euch Wissen, Danke an alle!

KodeZwerg 25. Mai 2018 23:26

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

Zitat von Luckie (Beitrag 1403021)
Die Frage ist nur, ob auch modal. Da bin ich mir nicht mehr sicher. Aber im XP Usermanger habe ich modale Fenster/Dialoge benutzt. Und der ist Opensource. Vielleicht da mal gucken.

Jetzt habe ich Dich glatt überlesen, Danke, den hab ich auch schon irgendwo gesehn bestimmt auch geladen.
Das ist eine Super Idee da mal reinzuschaun, Danke!

EWeiss 25. Mai 2018 23:47

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

Es erstellt kein Modal Fenster
Wenn das dein einziges Problem ist?
Verhindere einfach dass das darunter liegende Fenster aktiv ist.

Also ein einfaches
Delphi-Quellcode:
EnableWindow(ParentWindow, false);


aber vergesse nicht es wieder einzuschalten wenn du das 2 Window schließt.

Delphi-Quellcode:
EnableWindow(ParentHandle, True);


bzw. Das Sample ist modal denn das zweite Fenster liegt über dem Parent und bleibt auch drüber.
Du musst halt nur dafür sorgen das dein Parent nicht aktiviert werden kann.
Zitat:

Vielen Dank an EWeiss für den "mit den Gesicht ins Ziel drücken" Link, das tat gut!!!
Na ja ist für mich einfacher als dir alles vorzukauen ;)
Zumal da ich ganz andere Wege beschreite als das Luckie tut.

gruss

KodeZwerg 26. Mai 2018 00:25

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
So hab ich es jetzt momentan, es macht genau das was ich wollte.
Vielen Dank nochmal!!

Ist DestroyWindow() das richtige Mittel um das Fenster zu schließen oder sollte da ein anderer Befehl hin?

Delphi-Quellcode:
{******************************************************************************}
{                                                                              }
{                                TwoWindows                                   }
{                                                                              }
{                    Copyright (c) 2001 Michael Puff                          }
{                            www.luckie-online.de                             }
{                           mpuff@luckie-online.de                            }
{                                                                              }
{******************************************************************************}
program TwoWindows;

{$R resource.res}

uses
  Windows,
  Messages;

const
  ClassName1 = 'Wnd1Class';
  ClassName2 = 'Wnd2Class';
  Window1Name = 'Window 1';
  Window2Name = 'Window 2';
  WindowWidth1 = 500;
  WindowHeight1 = 400;
  WindowWidth2 = 300;
  WindowHeight2 = 200;

  IDC_BUTTON1 = 1;

var
  hWnd1: DWORD;
  hWnd2: DWORD;

  hwndButton1: DWORD;

{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) - (WindowWidth1 div 2),
          (y div 2) - (WindowHeight1 div 2),
          WindowWidth1, WindowHeight1, true);

        hwndButton1 := CreateWindowEx(0, 'BUTTON', 'Klick mich',
          WS_CHILD or WS_VISIBLE, 200, 160,
          100, 25, _hWnd1, IDC_BUTTON1, hInstance, nil);
      end;
    WM_COMMAND:
      begin
        if hiword(wParam) = BN_CLICKED then
          case loword(wParam) of
            IDC_BUTTON1:
              {Fenster 2 erzeugen und anzeigen}
              begin
                EnableWindow(_hWnd1, false);
                hwnd2 := 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
        {Fenster zentrieren}
        x := GetSystemMetrics(SM_CXSCREEN);
        y := GetSystemMetrics(SM_CYSCREEN);
        MoveWindow(_hWnd2, (x div 2) - (WindowWidth2 div 2),
          (y div 2) - (WindowHeight2 div 2),
          WindowWidth2, WindowHeight2, true);
      end;
    WM_CLOSE:
      begin
        EnableWindow(hWnd1, True);
        DestroyWindow( _hWnd2 );
      end;
    else
      Result := DefWindowProc(_hWnd2, iMsg, wParam, lParam);
  end;
end;

{WindowStruktur für beide Fenster}
var
  wc: TWndClassEx = (
    cbSize         : SizeOf(TWndClassEx);
    Style          : CS_HREDRAW or CS_VREDRAW;
    lpfnWndProc    : @Wnd1Proc;   //Fensterfunktion für Fenster 1
    cbClsExtra     : 0;
    cbWndExtra     : 0;
    hbrBackground  : COLOR_APPWORKSPACE;
    lpszMenuName   : nil;
    lpszClassName  : ClassName1;  //Klassenname für Fenster 1
    hIconSm        : 0;
  );
  msg: TMsg;

begin
  {Struktur mit Infos für Fenster 1 füllen}
  wc.hInstance := hInstance;
  wc.hIcon     := LoadIcon(hInstance,MAKEINTRESOURCE(100));
  wc.hCursor   := LoadCursor(0, IDC_ARROW);

  {Fenster 1 registrieren}
  RegisterClassEx(wc);

  {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);

  {Struktur mit Infos für Fenster 2 füllen}
  wc.hInstance := hInstance;
  wc.lpfnWndProc := @Wnd2Proc; //Fensterfunktion für Fenster 2
  wc.hIcon     := LoadIcon(0, IDI_INFORMATION);
  wc.hCursor   := LoadCursor(0, IDC_ARROW);
  wc.lpszClassName := ClassName2;  //Klassenname für Fenster 2

  {Fenster 2 registrieren}
  RegisterClassEx(wc);

  while GetMessage(msg,0,0,0) do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;
  ExitCode := msg.wParam;
end.

EWeiss 26. Mai 2018 01:13

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

Ist DestroyWindow() das richtige Mittel um das Fenster zu schließen oder sollte da ein anderer Befehl hin?
Ist ok.. kommt halt auf das Fenster an das man erstellt ;)
Bei Dialogen zum Beispiel würde ich EndDialog verwenden.
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Aber nicht verwechseln mit CreateDialogIndirectParam
dieser Dialog ist nicht MODAL deshalb musst du auch hier DestroyWindow verwenden.
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

Das hier
Delphi-Quellcode:
EnableWindow(_hWnd1, false);


besser hier hin.
in WM_CREATE der zweiten Winproc besser noch in der Funktion wo das neue Window erstellt wird.
anstelle das..
Delphi-Quellcode:
                EnableWindow(_hWnd1, false);
                 hwnd2 := CreateWindowEx(0, ClassName2, Window2Name,
                   WS_OVERLAPPEDWINDOW or WS_VISIBLE, 40, 10,
                   300, 200, _hWnd1, 0, hInstance, nil);
Delphi-Quellcode:
                 hwnd2 := CreateWindowEx(0, ClassName2, Window2Name,
                   WS_OVERLAPPEDWINDOW or WS_VISIBLE, 40, 10,
                   300, 200, _hWnd1, 0, hInstance, nil); // erste erstellen
                 EnableWindow(_hWnd1, false); // dann deaktivieren
erstelle zuerst das zweite Fenster dann deaktiviere das erste.
So wie du es machst könnte es zu einem Deadlock führen.. (Muss nicht, je nach dem was man im alten Fenster dann noch abarbeiten muss)

gruss

KodeZwerg 26. Mai 2018 01:36

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

Zitat von EWeiss (Beitrag 1403031)
Bei Dialogen zum Beispiel würde ich EndDialog verwenden.

Hey, das ist ein toller Tipp wenn ich Dialoge aus Resource nutze, Danke!
Zitat:

Zitat von EWeiss (Beitrag 1403031)
in WM_CREATE der zweiten Winproc
erstelle zuerst das zweite Fenster dann deaktiviere das erste.

Jetzt wo Du es sagst, das ergibt mehr Sinn, Danke!


Damit ist für mich ein cooles Template entstanden für zwei Hobbyprojekte, bei einem weiß ich nicht ob ichs verteilen darf beim anderen handelt es sich um eine detailierte WhoIs Abfrage, das stelle ich bald vor da ich in DP irgendwie nur nicht funktionierende Programme dazu hier fand.

Vielen Dank an alle die sich die Zeit zum helfen nahmen!

EWeiss 26. Mai 2018 01:41

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

Jetzt wo Du es sagst, das ergibt mehr Sinn, Danke!
Habe es nochmal aktualisiert.
So ist es dann der letzte Vorgang im alten Fenster danach passiert ja nichts mehr und du hast alles abgearbeitet.

gruss

KodeZwerg 26. Mai 2018 02:21

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

Zitat von EWeiss (Beitrag 1403034)
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;

EWeiss 26. Mai 2018 07:58

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
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

EWeiss 26. Mai 2018 09:36

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
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

KodeZwerg 26. Mai 2018 09:46

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

Zitat von EWeiss (Beitrag 1403047)
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?

EWeiss 26. Mai 2018 09:52

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

Zitat von KodeZwerg (Beitrag 1403049)
Zitat:

Zitat von EWeiss (Beitrag 1403047)
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

KodeZwerg 26. Mai 2018 09:53

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
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)

EWeiss 26. Mai 2018 10:21

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

Zitat von KodeZwerg (Beitrag 1403052)
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

KodeZwerg 26. Mai 2018 10:41

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 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