[Delphi] Geen popupmenu door bug in Delphi

Pagina: 1
Acties:
  • 181 views sinds 30-01-2008
  • Reageer

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-08 22:26

Tomatoman

Fulltime prutser

Topicstarter
Door een bug in TWinControl.SetFocus (getest met Delphi 7) werken sommige controls niet goed als op een VCL-control staan die op zijn beurt op een niet-VCL window is gezet. In mijn geval staat een TEdit op een TFrame die op een TPanel staat. De TPanel is op een niet-VCL window gezet met behulp van de ParentWindow property.

Bij een TCustomEdit geeft dit een probleem met popupmenu's. Bij iedere keer rechtsklikken op een TCustomEdit, popupmenu toegekend of niet, treedt een EInvalidOperation op in WMContextMenu :(. Dit is de relevante code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type
  TCustomEdit = class(TWinControl)
  private
    ...
    procedure WMContextMenu(var Message: TWMContextMenu);
      message WM_CONTEXTMENU;
    ...
  end;

procedure TCustomEdit.WMContextMenu(var Message: TWMContextMenu);
begin
  SetFocus;  // veroorzaakt een EInvalidOperation
  inherited;
end;
Hoe voorkom ik dit probleem zonder de VCL te hercompileren?

Een goede grap mag vrienden kosten.


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

misschien kun je dit verhelpen door het TPanel weg te laten. Waarom zou je een frame op een panel zetten. Kun je het panel niet op het frame zetten om toch hetzelfde (visuele) resultaat te bereiken?

Misschien heeft de plaats waar je de events programmeert of properties toewijst (zoals een popup menu) ook nog invloed. Persoonlijk vind ik het gebruik van frames in zekere zin gevaarlijk om dat je events kun invullen in de unit van het frame en in de unit waarin je het frame gebruikt. Ik bedoel hiermee dat als het frame (met een buttun) op form1 wordt gebruikt, je in de unit van form1 de onClick kunt programmeren. Gebruik je hetzelfde frame ook op from23 dan heb je deze onClick niet. Het heeft zo z'n voor en tegens, maar misschien is dit ook wel de reden van de fout.

www.fendt.com | Nikon D7100 | PS5


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Wat is de melding bij de EInvalidOperation?

VCL controls houden er over het algemeen niet zo erg van als ze een parent hebben die niet VCL is. En ik wil je niet ontmoedigen, maar ik heb nog nooit gehoord van iemand die het lukte om Delphi forms goed in een property sheet of wizard te krijgen. Vooral het feit dat de VCL niet thread-safe is geeft veel problemen. Je zit dus vast aan de dialog resouces. Ik ken wel een 3rd party leverancier die het wel lukt op 1 of andere manier (http://www.shellplus.com/...operty-sheet-example.html), dus misschien is er nog een beetje hoop :)

We adore chaos because we like to restore order - M.C. Escher


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-08 22:26

Tomatoman

Fulltime prutser

Topicstarter
misschien kun je dit verhelpen door het TPanel weg te laten. Waarom zou je een frame op een panel zetten. Kun je het panel niet op het frame zetten om toch hetzelfde (visuele) resultaat te bereiken?
Helaas lukt het niet om een TFrame direct op een niet-VCL form te zetten. Daarom knal ik er een TPanel tussen. Mijn control zet ik op een TFrame omdat je die in design-time kunt ontwerpen. Dat werkt uitstekend, behalve als er een call naar GetParentForm() of ValidParentForm() wordt gemaakt. De problemen worden daar veroorzaakt door bugs in de VCL.
Wat is de melding bij de EInvalidOperation?
De melding is Control ''%s'' has no parent window en die komt uit TWinControl.SetFocus() door een call naar ValidParentForm():
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TWinControl.SetFocus;
var
  Parent: TCustomForm;
begin
  Parent := GetParentForm(Self); // retourneert nil (er is
                                 // immers geen TCustomForm)
  if Parent <> nil then
    Parent.FocusControl(Self)
  else if ParentWindow <> 0 then // bug! --> ParentWindow is 0
                                 // Moet echter True zijn, want alle
                                 // controls staan op een TFrame
    Windows.SetFocus(Handle)
  else
    ValidParentForm(Self);       // raiset EInvalidOperation
end;
Die foutmelding is natuurlijk onzin, want er is wel degelijk een (niet-VCL) parent window, alleen staan de controls daar niet direct bovenop, maar zitten er nog een TPanel en een TFrame tussen.

Een goede grap mag vrienden kosten.


Verwijderd

LordLarry schreef op 23 March 2003 @ 13:49:

maar ik heb nog nooit gehoord van iemand die het lukte om Delphi forms goed in een property sheet te krijgen.
Vreemd, het werkt prima hier.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-08 22:26

Tomatoman

Fulltime prutser

Topicstarter
LordLarry schreef op 23 March 2003 @ 13:49:
Ik ken wel een 3rd party leverancier die het wel lukt op 1 of andere manier (http://www.shellplus.com/...operty-sheet-example.html), dus misschien is er nog een beetje hoop :)
Mooie controls zijn dat, maar helaas niet gratis en (belangrijker) er zit geen wizard bij. Daarom heb ik die wizard zelf maar gemaakt :)

Een goede grap mag vrienden kosten.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-08 22:26

Tomatoman

Fulltime prutser

Topicstarter
Na al heel veel frustrerende uren heb ik mijn panel toch nog maar eens vervangen door een TCustomForm. Het probleem was tot dusverre dat er dan simpelweg niets verscheen. Wat blijkt: in de constructor van TCustomForm staat Visible := False 8)7

Het frame staat sinds vijf minuten niet meer op een TPanel maar op een TCustomForm. Alle problemen opgelost, inclusief weerbarstige popup menu's. Hij's mooi! :9~

Een goede grap mag vrienden kosten.


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 00:00
screenshottie?? ( als het zo mooi is geworden) :)

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 23 March 2003 @ 15:44:
[...]


Vreemd, het werkt prima hier.
Ook als je er snel meerdere tegelijk opend?

We adore chaos because we like to restore order - M.C. Escher


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-08 22:26

Tomatoman

Fulltime prutser

Topicstarter
Just_a_Gamer schreef op 23 March 2003 @ 20:21:
screenshottie?? ( als het zo mooi is geworden) :)
Geen rare fratsen, meer wel helemaal volgens de Windows-look. En het is voor zover ik op internet kon vinden de eerste wizard die objectgeoriënteerd in Delphi is gebouwd.

Afbeeldingslocatie: http://home.planet.nl/~robin.gerrets/linked/wizard_screenie1.gif

Afbeeldingslocatie: http://home.planet.nl/~robin.gerrets/linked/wizard_screenie2.gif

[ Voor 2% gewijzigd door Tomatoman op 23-03-2003 21:21 . Reden: bijzonder kromme zinnen rechtgebogen ]

Een goede grap mag vrienden kosten.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Er zijn meerdere VCL Wizard pakketten te vinden voor Delphi, maar bij mijn weten idd niet via de property sheet wizards van Windows. Ziet er netjes uit. Misschien een idee om het opensource te maken om het te delen met meerdere mensen? :)

We adore chaos because we like to restore order - M.C. Escher


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-08 22:26

Tomatoman

Fulltime prutser

Topicstarter
LordLarry schreef op 23 March 2003 @ 22:00:
Er zijn meerdere VCL Wizard pakketten te vinden voor Delphi, maar bij mijn weten idd niet via de property sheet wizards van Windows. Ziet er netjes uit. Misschien een idee om het opensource te maken om het te delen met meerdere mensen? :)
Dankjewel. Ik zal er eens serieus over nadenken.

Een goede grap mag vrienden kosten.

Pagina: 1