[Delphi] Kontrolka opakowana w klasę

0

Witam.

Chcę stworzyć sobie od zera kontrolkę, która będzie listą kontaktów mojego klienta gg.
Nigdy nie używam VCL, jedynie czystego WinAPI oraz Winsock.
Tworząc tą kontrolkę chciałbym ją "opakować" w klasę.
Jednak kod który zamieszczam poniżej nie działa.
Tzn. - kompiluje się, ale kontrolka nie zostaje utworzona - FHandle ma wartość 0.
Problem zapewne sprawia funkcja Contacts_Proc.
Co nalezy zrobić aby to zadziałało?

unit C_Contacts;

interface

uses
  Windows, Messages;

type
  TContacts = class
  private
    FHandle, FParentHandle: HWND;
    FID: HMENU;
    function Contacts_Proc(H: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
    procedure SetParentWnd(hParentWnd: HWND);
  public
    function RegisterContacts: Boolean;
    procedure Create(hParentWnd: HWND; hMenu: Integer); overload;
    property Handle: HWND read FHandle;
    property ParentHandle: HWND read FParentHandle write SetParentWnd;
    property ID: HMENU read FID;
end;

implementation

function TContacts.Contacts_Proc(H: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
begin
  case uMsg of
    WM_CREATE: MessageBox(0, 'Dziala.', '', 0);
    else Result := DefWindowProc(H, uMsg, wPar, lPar);
  end;
end;

function TContacts.RegisterContacts: Boolean;
var
  WndClass: TWndClass;
begin
  Result := False;
  WndClass.style := CS_HREDRAW or CS_VREDRAW;
  WndClass.lpfnWndProc := @TContacts.Contacts_Proc;
  WndClass.cbClsExtra := 0;
  WndClass.cbWndExtra := 0;
  WndClass.hInstance := hInstance;
  WndClass.hIcon := 0;
  WndClass.hCursor := LoadCursor(0, IDC_ARROW);
  WndClass.hbrBackground := GetStockObject(NULL_BRUSH);
  WndClass.lpszMenuName := nil;
  WndClass.lpszClassName := 'Lista';
  if (RegisterClass(WndClass) <> 0) then Result := True;
end;

procedure TContacts.Create(hParentWnd: HWND; hMenu: Integer);
begin
  FParentHandle := hParentWnd;
  FID := hMenu;
  FHandle := CreateWindowEx(0, 'Lista', nil, WS_CHILD or WS_VISIBLE, 0, 0, 0, 0, FParentHandle, FID, hInstance, nil);
end;

procedure TContacts.SetParentWnd(hParentWnd : HWND);
begin
  FParentHandle := hParentWnd;
  SetParent(FHandle, FParentHandle);
end;

end.
0

Moze by tak to Create bylo jednak konstruktorem, a nie zwykla procedura?

0

proponowal bym dziedziczyc z TWinControl bedzie latwiej.

0

Moze by tak to Create bylo jednak konstruktorem, a nie zwykla procedura?

Czy ja wiem...
Może później tak zrobię :-)
Na razie kontrolkę tworzę tak:

var
  TLista: TContacts;
//(...)
TLista := TContacts.Create; //Utworzenie klasy
TLista.RegisterContacts; //zarejestrowanie klasy kontrolki
TLista.Create(H, 100); //i na końcu utworzenie kontrolki

Czyli tak po kolei :-)

proponowal bym dziedziczyc z TWinControl bedzie latwiej.

Dzięki za chęć pomocy, ale jak już pisałem wyżej - nie używam VCL, a TWinControl wchodzi w skład bodajże modułu Classes.
Wiem, że w C++ da się takie coś zrobić, ale czy w Delphi bez użycia VCL też?

0

TWinControl dlatego, ze nie poradziles sobie z linijka

 WndClass.lpfnWndProc := @TContacts.Contacts_Proc;

tak nie mozna, trzeba ominac opakowanie klasy, albo zdefiniowac funkcje do obslugi okna poza klasa (czy w delphi czy w c++).

Czemu nie uzywasz VCL ? skoro piszesz w delphi.

To co chcesz oczywiscie da sie zrobic pod warunkiem dobrej znajomosci (no powiedzymy bardzo dobrej)

  • WinAPI
  • zasad wywolywania funkcji (w obiektach, rodzaje wywolan etc.)

BTW takie zdanie po prostu mnie rozwala

Chudy napisał(a)

Moze by tak to Create bylo jednak konstruktorem, a nie zwykla procedura?

Czy ja wiem...

0

Czemu nie uzywasz VCL ? skoro piszesz w delphi.

Ano dlatego, że:
-WinAPI jest szybsze
-VCL zwiększa rozmiar kodu wynikowego (Pusty projekt mający ponad 300KB to po prostu żal...), a teraz wyobraźmy sobie, ze aplikacja ma mnóstwo okien, kontrolek i jak ten rozmiar się przez to drastycznie zwiększa... i na co to komu...
-Lubię wyzwania...

Ktoś mógłby jeszcze napisać "to czemu nie piszesz w C++?", a dlatego, że przyzwyczaiłem się do Delphi.
Do C++ przejdę może kiedyś, jak będę się czuł bardziej na siłach.

0

Ty piszesz kontrolkę windows dziedzicząc po Object? .. toż to jakiś koszmar - zacznij chociaż na "wyższy poziom" TComponent, a nawet TWinControl. Na tym polega programowanie obiektowe, to, że zaczniesz na niższym poziomie nie da specjalnie efektów, które chciałbyś uzyskać + będzie więcej problemów z samą kontrolką niż samym implementowaniem funkcji listy GG.

0

w ramach dobrego dnia

http://4programmers.net/Delphi/Artykuły/Wywołanie_funkcji_zwrotnych_z_klasy

Deti:
che che jak chce ... moze wymysli cos ekstra nowe VCL :).

Chudy:
piszesz, ze duzo zajmuje .... jak zrobisz tak jak powinno byc (obsluga bledow etc) to tez bedzie duzo zajmowalo

0

Wielkie dzięki reichel :-) Liczyłem na pomoc, ale nie spodziewałem się, ze napiszesz artykuł wraz z kodem! Toś mnie miło zaskoczył...

che che jak chce ... moze wymysli cos ekstra nowe VCL .

No nie przesadzaj :-D
po prostu chcę mieć w binarce tylko to co potrzebuję. Mam bzika na punkcie optymalizacji i dlatego nie lubię VCL. I nie czepiać się! ;-)

0

temat sie juz pare razy przewinal wiec stwierdzilem ze lepiej cos czytelnego zrobic.

ale jak napisalem to najprostsza metoda (i teoretycznie nie ladna), mozna jeszcze inaczej.

0

W sumie mi ta metoda wystarczy. Ale jakby Ci się chciało, to uzupełnij swój artykuł o pozostałe metody - na pewno jeszcze ktoś inny z tego skorzysta.

0

moj nie moj ... kazdy go moze rozwinac ... i do tego zachecam we wstepie wlasnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1