HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Többsoros elemeket tároló ComboBox komponens készítése


Példaprogram letöltése

4473 bájt

A Delphi komponensei rendelkeznek azzal az előnyös tulajdonsággal, hogy amennyiben funkcionalitásuk nem megfelelő, vagy tulajdonságaik nem elegendőek, akkor képesek vagyunk arra, hogy újabbakkal ruházzuk fel őket. A TComboBox komponens például alapértelmezésben nem tud többsoros szövegeket több sorban megjeleníteni. Ezt a hiányosságát a cikkünkben elkészítendő komponensben orvosoljuk.

A mellékelt példaprogram megnyitása előtt a MRCombo.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component – Install Component menüpontot.
A komponens úgy működik, hogy az Items kollekcióban megtalálható elemeket úgy rajzolja ki, hogy a hosszú karakterláncokat több sorban jeleníti meg. Ennek eléréséhez a komponens létrehozásakor meg kel adnunk a rajzolás stílusát.
constructor TMRCombo.Create(AOwner: TComponent);
begin
  inherited;
  Style := csOwnerDrawVariable;
end;
A rajzolás egyedi lesz, elemenként történik meg, így van lehetőségünk annak módját befolyásolni. Egyedi metódusokkal oldjuk meg a komponens DrawItem és MeasureItem eseményeinek kezelését. A MeasureItem metódusban határozzuk meg, hogy melyik elemnek mekkora lesz az aktuális magassága.
Először lekérdezzük minden elem esetében, hogy milyen hosszú az adott karakterlánc. Amennyiben 20 karakternél hosszabb, akkor a karakterláncba szúrjuk a soremelés konstanst.
strval := Items[Index];
strtmp := WrapText(strval, 20);
Majd egy ciklussal megvizsgáljuk az imént létrejött ideiglenes karakterláncot, és megállapítjuk a kirajzolás magasságát.
i := 1;
while Pos(#$D#$A, strtmp) > 0 do begin
  i := i + 1;
  strtmp := Copy(strtmp, Pos(#13#10, strtmp) + 2, Length(strtmp));
end;
Height := i * ItemHeight;
A DrawItem metódusban történik meg az egyes elemek kirajzolása. A metódusban is úgy járunk el, hogy megvizsgáljuk egy ciklussal az adott elem karakterláncát, hogy hányszor fordul elő a soremelés konstans.
while Pos(#$D#$A, strval) > 0 do begin
  p := Pos(#$D#$A, strval);
  if p > 0 then
    strtmp := Copy(strval, 1, p - 1)
  else
    strtmp := strval;
A konstans pozíciójának meghatározása után az adott pozíció előtti karakterlánc-szakasz kirajzolása történik meg a Canvas objektum TextRect metódusával.
    rc := Rect;
    rc.Top := Rect.Top + i * ItemHeight;
    Canvas.TextRect(rc, Rect.Left, Rect.Top + i * ItemHeight, strtmp);
    strval := Copy(strval, p + 2, Length(strval));
    Inc(i);
  end;
Amennyiben a karakterlánc nem tartalmaz soremelés karaktert, akkor az egész szöveget kiírjuk a téglalapba.
  rc := Rect;
  rc.Top := Rect.Top + i * ItemHeight;
  Canvas.TextRect(rc, Rect.Left, Rect.Top + i * ItemHeight, strVal);
  Canvas.Brush.Style := bsClear;
  Canvas.Rectangle(Rect);
A komponenst a Form létrejöttekor töltjük fel elemekkel.
with MRCombo1.Items do begin
  Add('Alma');
  Add('Hosszú szöveg... Két sorban fér el...');
  Add('Körte');
  Add('Barack');
end;
MRCombo1.ItemIndex := 0;

Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2003 évkönyv 747. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |