
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;