![]() |
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:
Gruß
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. Neutral General |
Re: Non-VCL Fensterklasse
Mh nonVCL und SysUtils .. irgendwie nicht so effektiv .. :D
|
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? |
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: ![]() |
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.
|
Re: Non-VCL Fensterklasse
Du musst für jede Objetkinstanz eine Funkktion in den Hauptspeicher zu Laufzeit implementieren (so wie
![]() Edit: Für die VCL macht das übrigens die Classes.MakeObjectinstance. |
Re: Non-VCL Fensterklasse
Zitat:
|
Re: Non-VCL Fensterklasse
Hi,
Danke es hat funktioniert :) Werde morgen mal gucken das ich verstehe wies funktioniert. Gruß Neutral General |
Re: Non-VCL Fensterklasse
Aber interessantes Konzept. Würde mich freuen, wenn du deine Unit irgendwann hier vorstellen würdest. :)
|
Re: Non-VCL Fensterklasse
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 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