Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Non-VCL Fensterklasse (https://www.delphipraxis.net/100761-non-vcl-fensterklasse.html)

Neutral General 3. Okt 2007 15:44


Non-VCL Fensterklasse
 
Hi,

Ich versuche mir grad eine Klasse zu bauen die mir das erstellen von Fenstern ohne die VCL vereinfachen soll.
Das Problem ist das ich das Fenster nicht zu Gesicht bekomme. Beim WndProc kommt auch soweit ich das nachverfolgen konnte nie ein WM_CREATE an.

Delphi-Quellcode:
unit uNCVLClasses;

interface

uses Windows, Messages, SysUtils;

type
  TWndProc = function (wnd: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): LRESULT of Object; stdcall;

  TNVCLControl = class
  private
    FHandle: THandle;
    FID: HMENU;
  public
    property Handle: THandle read FHandle;
    property ID: HMENU read FID;
  end;

  TNVCLForm = class(TNVCLControl)
  private
    wc: TWndClassEx;
    FWndProc: TWndProc;
    function WndProc(wnd: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): LRESULT; stdcall;
  public
    constructor Create(x,y,width,height: Cardinal);
  end;

var
  frmCount: Integer = 1;

implementation

{ TNVCLForm }

constructor TNVCLForm.Create(x, y, width, height: Cardinal);
begin
  FWndProc := WndProc;
  with wc do
  begin
    cbSize := SizeOf(TWndClassEx);
    lpfnWndProc := @FWndProc;
    hInstance := SysInit.hInstance;
    hbrBackground := COLOR_APPWORKSPACE;
    lpszClassName := Pchar('wnd' + IntToStr(frmCount));
  end;
  RegisterClassEx(wc);
  inc(frmCount);
  FHandle := CreateWindowEx(0,wc.lpszClassName,'Test',
                            WS_VISIBLE or WS_CAPTION or WS_SYSMENU or WS_SIZEBOX,
                            x,y,width,height,0,FID,hInstance,nil);
end;



function TNVCLForm.WndProc(wnd: HWND; uMsg: UINT; wp: WPARAM;
  lp: LPARAM): LRESULT;
begin
  Result := 0;
  case uMsg of
    WM_CREATE: begin
                  // nix
                end;
    WM_DESTROY: begin
                 PostQuitMessage(0);
                end;
    else Result := DefWindowProc(wnd, uMsg, wp, lp);
  end;
end;

end.
Gruß
Neutral General

Zacherl 3. Okt 2007 17:18

Re: Non-VCL Fensterklasse
 
Mh nonVCL und SysUtils .. irgendwie nicht so effektiv .. :D

Neutral General 3. Okt 2007 18:45

Re: Non-VCL Fensterklasse
 
Mh ok das ist vielleicht ein Argument aber es hilft nichts wenn ich die SysUtils aus den Uses nehme.

Andere Vorschläge?

Luckie 3. Okt 2007 18:45

Re: Non-VCL Fensterklasse
 
Wie soll er da auch ankommen? Du rufst sie ja nie auf bzw. du gibst in der Fensterklassenstruktur nur eine Variable vom Typ TWndProc an aber nicht die Funktion. Btw wird das auc nicht so eiinfach gehen. Eine Methode hat immer noch den unichtbaren Self-Parameter, aber die WndProc erwartet die Parameter wnd: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM und der zusätzliche Self-Parameter von der Methode zerschiesst dir jetzt deine WndProc.

So was habe ich übrigens schon gemacht für Dialog-Ressourcen: http://www.delphipraxis.net/internal...ghlight=dialog

Neutral General 3. Okt 2007 19:08

Re: Non-VCL Fensterklasse
 
Mh hab mir den Dialog runtergeladen, werde aber nicht schlauer. Das Problem ist halt das ich en Methodenpointer habe. Wie wandel ich das jetzt um, bzw. was soll ich machen? Konnte aus deinen Hinweisen leider nichts machen.

sirius 3. Okt 2007 19:14

Re: Non-VCL Fensterklasse
 
Du musst für jede Objetkinstanz eine Funkktion in den Hauptspeicher zu Laufzeit implementieren (so wie hier)

Edit: Für die VCL macht das übrigens die Classes.MakeObjectinstance.

Luckie 3. Okt 2007 19:27

Re: Non-VCL Fensterklasse
 
Zitat:

Zitat von Neutral General
Mh hab mir den Dialog runtergeladen, werde aber nicht schlauer.

Dann solltest du dir auch mal den Sourceode angucken. Und in der Readme befindet sich ein Link, wie es funktioniert.

Neutral General 3. Okt 2007 19:48

Re: Non-VCL Fensterklasse
 
Hi,

Danke es hat funktioniert :) Werde morgen mal gucken das ich verstehe wies funktioniert.

Gruß
Neutral General

Zacherl 3. Okt 2007 22:02

Re: Non-VCL Fensterklasse
 
Aber interessantes Konzept. Würde mich freuen, wenn du deine Unit irgendwann hier vorstellen würdest. :)

jbg 3. Okt 2007 23:11

Re: Non-VCL Fensterklasse
 
Zitat:

Zitat von Zacherl
Mh nonVCL und SysUtils .. irgendwie nicht so effektiv .. :D

Wieso? Er will ja kein nonRTL Programm, sondern ein nonVCL Programm.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr.
Seite 1 von 2  1 2      

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