zub писал(а):>>что-бы ее было интересно писать "просто так".
а мы не просто так, мы чтобы уяснить разницу в подходах - "создать контрол ради надписи" vs "нарисовать надпись"
вот что получилось у меня.
Добавлено спустя 14 минут 34 секунды:
Если убрать затраты на "тупой" массив то заполнение-удаление листбокса займет
0.137sec
0.241sec
к таким циферкам и надо стремиться
Только что посмотрел код . Снимаю шляпу ....
Это труд ! Признаю себя халтурщиком и лентяем ...
Но я признаться думал, что и намека будет достаточно .
Хорошо завтра выложу свой аналог "полного кода" ... Сразу говорю, что мой код скорее всего будет "одноразовым" .
Вся суть того что я доказывал, в возможной простой замены прорисовки через канвас на несколько стандартных компонентов .
(причем не "на все случаи жизни", а только для самых простейших )
Ну сам посуди...
Вот твой код
- Код: Выделить всё
procedure TSuperListBoxHelper.DrawItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState);
var
rx,ry:integer;
CRect:TRect;
ts:TTextStyle;
fs:TFontStyles;
begin
//if not ({odSelected}{odComboBoxEdit}odDisabled in state) then
//if (state<>[])and(state<>[odHotLight])and(state<>[odPainted]) then
rx:=ARect.Right-ARect.Left;
ry:=ARect.Bottom-ARect.Top;
ts:=TListBox(Control).canvas.TextStyle;
ts.Alignment:=taLeftJustify;
ts.Layout:=tlCenter;
ts.Clipping:=true;
fs:=TListBox(Control).canvas.Font.Style;
TListBox(Control).canvas.FillRect(ARect);
CRect:=ARect;
CRect.Right:=CRect.Left+(rx div 2);
CRect.Bottom:=CRect.Top+(ry div 2);
TListBox(Control).canvas.Font.Style:=fs+[fsBold];
TListBox(Control).canvas.TextRect(CRect,0,0,ItemDataArray[Index].str1,ts);
CRect.Bottom:=ARect.Bottom;
CRect.Top:=CRect.Bottom-(ry div 2);
TListBox(Control).canvas.Font.Style:=fs+[];
TListBox(Control).canvas.TextRect(CRect,0,0,ItemDataArray[Index].str2,ts);
ts.Alignment:=taCenter;
CRect:=ARect;
CRect.Right:=CRect.Right+(rx div 4);
CRect.Left:=CRect.Left-(rx div 4);
TListBox(Control).canvas.Font.Style:=fs+[fsBold];
TListBox(Control).canvas.TextRect(CRect,0,0,ItemDataArray[Index].str3,ts);
ts.Alignment:=taRightJustify;
CRect:=ARect;
CRect.Left:=CRect.Right-(rx div 2);
TListBox(Control).canvas.Font.Color:=clGreen;
TListBox(Control).canvas.Font.Style:=fs+[fsBold,fsItalic];
TListBox(Control).canvas.TextRect(CRect,0,0,ItemDataArray[Index].str4,ts);
end;
А вот мой ....
- Код: Выделить всё
Function TF1.NewItemSList(Stol,Zall,Cena,Sost:String; Sel:Boolean):TPanel;
var
PL,PL1,PL2:TPanel;
begin
PL:=TPanel.Create(f1);pl.Align:=alTop; PL.Height:=82;
if sel then pl.Color:=clRed;
PL.Caption:=Cena;
PL1:=TPanel.Create(pl); PL1.Width:=80; pl1.Align:=alLeft;
PL.InsertControl(PL1);
PL2:=TPanel.Create(pl1); PL2.Height:=40; pl2.Align:=alTop;
PL2.Caption:=Zall;
PL1.InsertControl(PL2);
PL2:=TPanel.Create(pl1); PL2.Height:=40; pl2.Align:=alTop;
PL2.Caption:=Stol;
PL1.InsertControl(PL2);
PL1:=TPanel.Create(pl); PL1.Width:=60; pl1.Align:=alRight; pl1.Font.Color:=clGreen;
PL1.Caption:=Sost;
PL.InsertControl(PL1);
pl.OnClick:=@Panel1Click;
Result:=PL;
end;
Что бы заменить твой код своим ( в твоей же версии программы) мне понадобится практически ОДНА дополнительная строчка ...
Что-то вроде:
pl:= NewItemSList(...); TListBox(Control).canvas.CopyRect(ARect,PL.Canvas,pl.BoundsRect);pl.free;Коментарии практически излишни ... (Особенно при учете того, что мой код можно еще чуть подсократить )