[Delphi] Overerving van ComboBox

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

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik ben bezig met een eigen ComboBox. Deze heeft een eigen Items property. Alleen moet de huidige Items property vervangen worden door die van mij, zodat deze items worden weer gegeven in de lijst.

Ik heb hem afgeleid van een TCustomComboBox, zodat ik kan bepalen welke property's wel of niet zichtbaar zijn. Zo moet de huidige Items van TComboBox niet meer zichtbaar zijn, net als Style.
Style kan ik prima standaard zetten op csOwnerDrawFixed, dit is geen probleem.

Maar nu moet mijn component de items uit mijn eigen lijst halen. Ik teken de items zelf in DrawItem procedure. Maar hoe zorg ik ervoor dat hij mijn lijst pakt voor de items.

Ik heb momenteel een proptery gemaakt die ComboItems heet. Dit is een TCollection. Daar zitten weer TCollectionItems in natuurlijk. Hier zit dan weer een string die moet worden gebruikt als item in de lijst. Bij het tekenen van een item moet hij hier de data uithalen. Hoe?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:51

Creepy

Tactical Espionage Splatterer

Hoe wat??

Je .items laten verdwijnen of je gegevens uit je TComboBox halen??

Het eerste is geen probleem. Als je je .comboitems var.items noemt, dan is .items automatisch je TMyComboBox.items i.p.v. de TComboBox.items (als var een instantie is van TMyComboBox natuurlijk).

Je kan ook de .items "unplublishen" (lees: een nieuwe property .items aanmaken die readonly is). Maar dit is wel heel vies.

En je eigen .items gebruiken om gegevens op te halen lijkt me geen probleem toch????

Ik zelf heb eens zitten spelen met een StringGrid om hierin zelf alle items te tekenen.. je krijgt dan een mooi een TRect door voor 1 items waar je dat item op mag tekenen (ben het event ff kwijt...), ik neem aan dat de TComboBox ook wel zoiets heeft..

"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


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Het is me nu gelukt, maar ik denk niet dat dit goed is.

Ik heb dit gedaan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
constructor TComboItem.Create(Collection: TCollection);
begin
  inherited;
  FData := TStringList.Create;
  (Collection.Owner as TColumnCombo).Items.Append('');
end;

destructor TComboItem.Destroy;
begin
  (Collection.Owner as TColumnCombo).Items.Delete(0);
  FData.Free;
  inherited;
end;

ComboItem is een TCollectionItem. Welke weer zit in ComboItems wat een TCollectionItems is.

Door mijn ComboBox van TCustomComboBox af te leiden en dan NIET de item property publishen is dat probleem verholpen.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Uhmz, hij leek goed te werken, maar valt weer tegen.

Het is ook niet zo'n nette oplossing. Heeft iemand misschien een goede oplossing hoe ik er voor zorg dat ik niet meer afhankelijk ben van Items (TStrings)?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:51

Creepy

Tactical Espionage Splatterer

Of ik begrijp je niet, of je kan in je eigen classe de items property OPNIEUW publishen, en dan laten verwijzen naar je eigen soort items.
code:
1
2
3
4
5
6
7
8
9
10
TMyComboBox = class(TComboBox)
private
   FItems: TCollectionItems;
protected
   procedure SetItem(index: integer; const value: TCollectionItem);
   function GetItem(index: integer): TCOllectionItem;
published
   { Hoppa.. Items is nu ineens een TCollectionItem! }
   Items: TCollectionItem read SetItem write GetItem;
end;

Zoiets dus...dan in de create van je je TMyCombobox natuurlijk de FItems aanmaken, en in de destroy weer destroyen.
SetItem en GetItem gebruiken dan rechtstreeks de TCollectionItems.
Geen idee of dat SetItem en GetItem ook zo werkt met TCollectionItem(s), maar met een afgeleide van TList werkt dat prima.

Als je de originele TComboBOx.items nog wilt benaderen kan je in een method van je TMyComboBox inherited.items gebruiken.

"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