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 nonVCL-Klasse (https://www.delphipraxis.net/16496-nonvcl-klasse.html)

CalganX 17. Feb 2004 20:38


nonVCL-Klasse
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich versuche mir gerade die nonVCL-Programmierung zu vereinfach, darum schreibe ich gerade an einer Fensterklasse. Allerdings gibt es ein Problem: die im Demo-Projekt (siehe Anhang) vorhandene MessageBox wird zwar ausgegeben, allerdings bleibt das Fenster versteckt.

Ich habe das ganze mal angehängt, da das ganze zwei Units sind.

Chris

neolithos 17. Feb 2004 21:54

Re: nonVCL-Klasse
 
Fehler Nr. 1:

In der DPR-Datei
Delphi-Quellcode:
  aDP.dwWndHeight := 100;
  aDP.dwWndWidth := 100;
Fehler Nr. 2 und 3. :

Delphi-Quellcode:
function TcnvWindow.Init(aDsgnParams: TcnvDsgnParams; aClassname: PAnsiChar): boolean;
// init the Window with the given Designparameters
begin
  Result := true;
  fDsgnParams := aDsgnParams; // <- Hier
  try
    self.fDsgnParams.szClassname := aClassName;

    fWndClass.cbSize := sizeof(TWndClassEx);
    if aDsgnParams.dwStyles <> 0 then
      fWndClass.style := fDsgnParams.dwWndStyles // <- Hier
Ich glaubhier habe ich auch etwas geändert :gruebel:

Delphi-Quellcode:
begin
  fWnd := CreateWindowEx(fDsgnParams.dwExStyles, fDsgnParams.szClassname, fDsgnParams.szWindowTitle,
    fDsgnParams.dwStyles, fDsgnParams.dwWndX, fDsgnParams.dwWndY,
    fDsgnParams.dwWndWidth, fDsgnParams.dwWndHeight, GetDesktopWindow, 0, hInstance, nil);
Ich würde TcnvDsgnParams genauer Dokumentieren und Definieren.
Ich hab da noch nicht ganz durchgesehen, welcher Parameter für was ist.

NicoDE 18. Feb 2004 00:20

Re: nonVCL-Klasse
 
Du hast im Init() zwar den Klassennamen kopiert aber nicht den Rest (ist also nicht initialisiert).
Es fehlt also
Delphi-Quellcode:
self.fDsgnParams := aDsgnParams;
Off-Topic:
- Der Code-Style ist sehr gewöhnungsbedürftig.
- Warum steht dort 'do not use', wenn es in der Demo benutzt wird?
- Angeforderte Ressourcen werden nicht wieder freigegeben.
- Fehlerbehandlung fehlt fast komplett...
z.B. sollte bei GetMessage() der Rückgabewert -1 abgefangen werden!
Delphi-Quellcode:
  while True do
    case Integer(GetMessage(Msg, HWND(0), 0, 0)) of
      0: // WM_QUIT
        begin
//        ExitCode := Msg.wParam;
          Break;
        end;
      -1: // Error!
        begin
//        ExitCode := -1;
          Break;
        end;
    else
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
Gruss Nico

CalganX 18. Feb 2004 16:19

Re: nonVCL-Klasse
 
Hi,
@neolithos: okay. Danke.
Zitat:

Zitat von neolithos
Delphi-Quellcode:
    if aDsgnParams.dwStyles <> 0 then
      fWndClass.style := fDsgnParams.dwWndStyles // <- Hier

Nein, das war schon richtig so! dwWndStyles ist für das CreateWindow. Und dwStyles ist für die Fensterklasse. ;)

Zitat:

Ich würde TcnvDsgnParams genauer Dokumentieren und Definieren.
Ich hab da noch nicht ganz durchgesehen, welcher Parameter für was ist.
Klar, werde ich ja auch noch machen, aber ich habe gestern erst angefangen die Klasse zu schreiben. ;) Und da ich alles versucht habe, um ein Fenster anzuzeigen und es dennoch nicht geklappt hatte, habe ich halt gefragt. ;)

@Nico:
Zitat:

Zitat von NicoDE
Du hast im Init() zwar den Klassennamen kopiert aber nicht den Rest (ist also nicht initialisiert).
Es fehlt also
Delphi-Quellcode:
self.fDsgnParams := aDsgnParams;

Jo, stimmt. :oops: Hatte neolithos ja schon bereits geschrieben. Allerdings wird jetzt nichtmal mehr die MessageBox ausgegeben... :gruebel:

Zitat:

Off-Topic:
- Der Code-Style ist sehr gewöhnungsbedürftig.
In wie fern und was meinst soll ich besser machen? :shock: :gruebel:

Zitat:

- Warum steht dort 'do not use', wenn es in der Demo benutzt wird?
Weil ich einen kleinen Fehler gemacht hatte und ich somit den Klassennamen über das record zuweisen konnte. Deswegen auch der Parameter. Danach habe ich das geändert und jetzt habe ich es so verändert, dass das wieder über das record geht. Ich hatte jedoch noch nicht die Kommentare überarbeitet. ;) Zumal ich mit der Klasse erst gestern angefangen habe. ;)

Zitat:

- Angeforderte Ressourcen werden nicht wieder freigegeben.
Noch.

Zitat:

- Fehlerbehandlung fehlt fast komplett...
Bis jetzt. Wie gesagt: ich habe gestern damit angefangen die Klasse zu schreiben und habe erstmal ein grobes Gerüst erstellt und deswegen ist noch nix drin. Ich bin ja dabei. Aber erstmal will ich ein Fenster sehen, damit ich weiß, dass alles funktioniert.

Zitat:

z.B. sollte bei GetMessage() der Rückgabewert -1 abgefangen werden!
Delphi-Quellcode:
  while True do
    case Integer(GetMessage(Msg, HWND(0), 0, 0)) of
      0: // WM_QUIT
        begin
//        ExitCode := Msg.wParam;
          Break;
        end;
      -1: // Error!
        begin
//        ExitCode := -1;
          Break;
        end;
    else
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;

Okay, kann ich machen, aber das Problem wird damit ja nicht gelöst. ;)

Chris

neolithos 18. Feb 2004 16:27

Re: nonVCL-Klasse
 
Schau dir noch mal genau den Record an

denn mit all den Änderungen hat es bei mir Funktioniert.

Soll ich dir mal meine Änderungen zuschicken. Vielleicht habe ich ja was vergessen!

CalganX 18. Feb 2004 16:33

Re: nonVCL-Klasse
 
Hi,
jetzt gehts... :mrgreen:
Ich hatte in der DPR-Datei noch was geändert, deswegen starte das Programm überhaupt nicht. :duck: Aber mit den Änderungen klappt es wunderbar, danke... :)

@Nico: dennoch würde es mich interessiert, warum du meinst mein Source hätte einen schlechten, sorry..., gewöhnungsbedürftigen Stil... :gruebel:

Chris

NicoDE 18. Feb 2004 17:08

Re: nonVCL-Klasse
 
Zitat:

Zitat von Chakotay1308
dennoch würde es mich interessiert, warum du meinst mein Source hätte einen [...] gewöhnungsbedürftigen Stil

Ich hatte Mühe den Quelltext zu lesen.
Liegt wohl daran, dass sich viele an Borlands Object Pascal Style Guide orientieren. Hat den entscheidenden Vorteil, dass andere den Quelltext schneller lesen/verstehen können.


Gruss Nico


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz