[Delphi] VCL control plaatsen op niet-VCL form

Pagina: 1
Acties:

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 03-04 15:12

Tomatoman

Fulltime prutser

Topicstarter
In Delphi heb ik een shell extensie geschreven. Het is een property sheet handler. Als je in de Explorer in het contextmenu van een bestand het menu-item Eigenschappen kiest, verschijnt mijn property sheet als een apart tabblad.

Van dit dialoogvenster heb ik een window handle - FDlg - die ik gebruik om een tree view op de sheet te zetten. Dat doe ik met low-level API calls:
code:
1
2
3
4
5
6
7
8
9
  InitCommonControl(ICC_TREEVIEW_CLASSES);
  GetClientRect(FDlg, AClientRect);
  FTreeView := CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, 'Tree View',
    WS_VISIBLE or WS_CHILD or WS_CLIPSIBLINGS or TVS_HASLINES or
    TVS_HASBUTTONS or TVS_NOTOOLTIPS,
    10, 28, AClientRect.Right - 10, AClientRect.Bottom - 60, FDlg, 0, HInstance,
    nil);

  // En dan een paar nodes toevoegen

Dat werkt prima, maar het is nogal omslachtig :Z. Ik heb ook geprobeerd een TTreeView op mijn sheet te zetten, maar ik zie niets verschijnen. Wat doe ik daarbij fout? Een probeersel dat niet werkt:
code:
1
2
3
4
5
6
7
  with TTreeView.CreateParentedControl(FDlg) do
  begin
    Left := 10;
    Top := 28;
    Width := AClientRect.Right - 10;
    Height := AClientRect.Bottom - 60;
  end;

Een goede grap mag vrienden kosten.


  • whoami
  • Registratie: December 2000
  • Laatst online: 03-04 23:35
Heb je de Parent en de Owner properties van die TTreeView goed gezet?

https://fgheysels.github.io/


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 12:12

Creepy

Tactical Espionage Splatterer

De parent wordt al gezet (CreateParentedCOntrol). Owner maakt niet uit, zolang je er dan maar zorg voor draagt dat je TTReeview ook weer wordt opgeruimd (mem leaks he).

Hmm... een .show erbij? Normaal gesproken is een parent zetten genoeg. Ik heb ook een keer wat problemen gehad met de CreateParentedControl. Heb toen de normale create(aowner) gebruikt, en daarna de parent gewoon gezet (parent:=FDld)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • whoami
  • Registratie: December 2000
  • Laatst online: 03-04 23:35
Creepy schreef op 12 augustus 2002 @ 08:23:
De parent wordt al gezet (CreateParentedCOntrol).

* whoami heeft niet goed gekeken. :+

https://fgheysels.github.io/


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 03-04 15:12

Tomatoman

Fulltime prutser

Topicstarter
Creepy schreef op 12 augustus 2002 @ 08:23:
Hmm... een .show erbij? Normaal gesproken is een parent zetten genoeg. Ik heb ook een keer wat problemen gehad met de CreateParentedControl. Heb toen de normale create(aowner) gebruikt, en daarna de parent gewoon gezet (parent:=FDld)
Bedankt, dat werkt inderdaad. Show is niet eens meer nodig.
code:
1
2
3
4
5
  with TTreeView.Create(nil) do
  begin
    ParentWindow := FDlg;
    ...
  end;

Een goede grap mag vrienden kosten.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 12:12

Creepy

Tactical Espionage Splatterer

Ik blijf het vaag vinden dat de CreateParentedControl toch niet werkt zoals ik (wij?) verwacht dat ie werkt... hmm..

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 12:09

Delphi32

Heading for the gates of Eden

Misschien omdat CreateParentedControl de ParentWindow alvast assignt voordat de Create wordt aangeroepen. Ook grappig: als je CreateParented(Control) gebruikt kan je geen owner meer opgeven, dat roept weer vragen op over wie de control dan beheert. Parent <> Owner.
Maar goed, het feit dat FParentWindow in TWinControl assigned wordt voordat Create(nil) wordt uitgevoerd, is het enige verschil dat ik kan vinden. En het zou zomaar kunnen dat dat niet zo lekker werkt.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 03-04 15:12

Tomatoman

Fulltime prutser

Topicstarter
Na nog een heleboel testen ben ik tot een interessante conclusie gekomen. CreateParentedControl/ CreateParented werkt niet bij een TTreeView. Als je een gewone Create doet zoals ik al eerder had aangegeven, krijg je een mooie TTreeView. Alleen... hij werkt maar half. Nodes worden niet goed weergegeven en geen enkele event werkt meer. :(

Met Create/ CreateParented/ CreateParentedControl een frame plaatsen op een niet-VCL form is helemaal treurig. ;( De applicatie crashst zodra ParentWindow een waarde krijgt (CreateParented en CreateParentedControl doen dat automatisch).

CreateParentedControl/ CreateParented werkt daarentegen prima met een TPanel. Vervolgens met Create een TTreeView op de panel plaatsen en de TTreeView werkt normaal, inclusief nodes en events.

Blijkbaar gebeuren er een hoop enge dingen achter de schermen. Maar zolang je alles op een panel zet, gaat het goed. >:)

Een goede grap mag vrienden kosten.

Pagina: 1