Toon posts:

[Delphi] 2e Control buiten het 1e control tekenen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig om een multi column combobox te maken (er zijn er wel een paar te downloaden maar die hebben niet alle eigenschappen die ik wil hebben).

Ik heb het als volgt gemaakt:

- een lege Editbox met een SpeedButtoon (met pijlte)

Als er op het pijlt gedrukt wordt zal er een ListView (met dus meerdere kolommen te voorschijn komen).

Alleen ik zit met het volgende probleem.

Mijn component is gebaseerd op de TEdit en heeft dus de grootte van die edit box. Als ik nu die ListView wil tonen precies onder de Edit box is die dus niet zichtbaar omdat het component daar stopt.

Weet iemand hoe ik dit moet oplossen?

(Ik vermoed dat het iets zal zijn met het canvas vergroten of met de functie SetWindowPos. Ik heb het een en ander geprobeerd met SetWindowsPos maar dat maakte niks uit.)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:45

Creepy

Tactical Espionage Splatterer

Waarom niet gebaseerd op een combobox? Dat is toch het object dat je qua functionaliteit wilt uitbreiden?

"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


Verwijderd

Topicstarter
Klopt, maar het probleem is bij die Combobox dat die altijd de omlijning van dropdownlist tekent, ook als je hem op OwnerDraw hebt staan.

Verwijderd

Verwijderd schreef op 08 augustus 2002 @ 19:17:
Mijn component is gebaseerd op de TEdit en heeft dus de grootte van die edit box. Als ik nu die ListView wil tonen precies onder de Edit box is die dus niet zichtbaar omdat het component daar stopt.
Laat je component dan ook de properties van TEdit overerven, dan kun je via de object inspector toch gewoon de size aanpassen van die box.

Verwijderd

Topicstarter
Nee ik denk dat je het niet helemaal begrijpt.

(Mijn component is gebaseerd op TEdit. Dus hij heeft de properties van de Edit)

De editbox is even hoog als de hoogte van het nieuwe component.

Maar die dropdownlist (in mijn geval dus die ListView) moet daar onder komen, dus dat wordt dan buiten het component en dat wordt niet weergeven.

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 31-08 21:58

Delphi32

Heading for the gates of Eden

Overerven van TCombobox, zou ik zeggen. Ik sluit me aan bij Creepy. Je hebt dan natuurlijk even niets te maken met de OwnerDraw property, want je gaat een nieuwe component maken en dus kan je in principe alles tekenen wat je wilt (als de VCL het toelaat tenminste). Tijd om te neuzen in je VCL source om te kijken wat je precies moet overriden.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Comboboxen krijgen dat voorelkaar door het uitklap gedeelt een TForm te maken.

Dat TForm wordt dus bestuurd door je TEdit en op dat TForm zet je dus je listbox.

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


Verwijderd

Topicstarter
Het probleem bij het baseren van een component op een TComboBox, is dus wat ik al zei, dat die altijd een gedeelte van de dropdownlist tekent.

Als je de functie AdjustDropDown van TCustomCombo override dan zie je nog 2 zwarte lijntjes als de combo uitklapt.

Zie ik wat over het hoofd? Want ik kan nergens vinden waar die getekent worden?

Is dat niet standaard vanwege dat het een windows component is?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:45

Creepy

Tactical Espionage Splatterer

Je kan meer, veel meer overriden van een TCOmboBox.... duik de VCL source eens in zoals Delphi32 al aangaf. Daar moet je volgens mij de complete draw of paint events kunnen afvangen, en kan je als je wilt elke pixel van je combobox aanpassen.
Dit is dus een verschil dan het afvangen van bijv de OnDrawItem!

"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


  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 27-07 15:54
TCombobox is gedeclareerd in StdCtrls.pas.
Een combobox tekend zelf een nieuw venster voor die lijst en heeft een eigen WndProc daarvoor.

Kijk eens naar:
procedure TCustomComboBox.WMPaint(var Message: TWMPaint);
Daar wordt alles getekend. Je kunt, denk ik, het beste overerven van TCustomComboBox en dan o.a. de paint overriden.

Verwijderd

Topicstarter
Ik heb van alles geprobeerd om die dropdownlist niet te laten tekenen, maar volgens mij is dat echt onmogelijk. Hij blijft een dunne zwarte lijn tekenen (ook als je de paint functie override).

Maar goed ik ben nu gewoon verder gegaan met een edit met daarin een speedbutton.

Dus als er gedrukt op de arrow zal er een extra form onder de edit box getoond worden met in die form een ListView.

Dit gaat allemaal nog gewoon goed.

Dat form met die listview wordt als volgt ingesteld:

code:
1
2
3
    SetWindowPos(FDropDownForm.Handle, HWND_TOPMOST, FDropDownForm.Left,
                 FDropDownForm.Top, FDropDownForm.Width,
                 FDropDownForm.Height, SWP_NOACTIVATE or SWP_SHOWWINDOW);


De dropdownlist (=form met listview) wordt netjes getekend en het form waarop de edit staat blijft actief (titel balk blijft actief).

Maar het probleem is nu dat ik de mouse-events van de listview moet opvangen. Maar die treden niet op, omdat het venster niet actief is. Maar als ik de focus op dit scherm toon, dan wordt het 1e scherm (waarop de edit staat) non-actief. Dat moet ik uiteraard niet hebben.

Weet iemand hoe ik dit kan oplossen?

(Dus form waarop de edit staat moet actief blijven maar ik moet wel de items in de listview in het 2e form van een focus balk kunnen voorzien)

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Kijk in de source van TDBComboBox.

De truuk is o.a. dat je er geen WM_Child window maakt en dat de eigenaar de desktop is, maar de parent je editbox (of anders om, vergeet ik steeds).

Voor een ander voorbeeld kan je kijken in
http://groups.yahoo.com/g...er_Stuff/DropDownForm.zip

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


Verwijderd

Topicstarter
Dit is precies wat ik nodig heb.

Bedankt.
Pagina: 1