-
Постов
31 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Сообщения, опубликованные Kikoma
-
-
Здравствуйте.
Стоит задача: Кастомизированный TListBoxItem содержит TText.Price, TSpinBox.SBCount, TText.Sum.
т.е. есть цена, изменяем кол-во получаем сумму и все это в TListBoxItem.
Вешаем обработчик на TSpinBox.SBCountChange, но встает вопрос, каким образом узнать в каком TListBoxItem произошло событие?
procedure TForm2.SBCountChange(Sender: TObject); var Item: TListBoxItem; SB: TSpinBox; s1, s2: string; begin SB := Sender as TSpinBox; // Получили Sender из TSpinBox if Assigned(SB) and (SB is TSpinBox) then begin Item := ?????? //Узнаем из какого итема была вызван эта процедура s1 := StringReplace(Item.StylesData['TextPrice'].ToString,'.',',',[rfReplaceAll, rfIgnoreCase]); //Тут обертка точку на запятую меняю s2 := StringReplace(Item.StylesData['SBCount.Text'].ToString,'.',',',[rfReplaceAll, rfIgnoreCase]); Item.StylesData['TextSum.Text'] := IntToStr(Round(StrToFloat(s1) * StrToInt(s2))); end; end;
-
Ох, обалдеть =))) Вы прикинули сколько машинного времени на это уходит ? =))) ... Но то, что Вы написали - жестко =)
:D
Я не то что прикинул, я на своем довольно шустром Galaxy Note 2 заметил торможение при прокрутке.
Была мысль через tag сделать, но решил что это както примитивно и есть способ лучше.
Но видимо через tag пока само лучше.
-
После многих эксперементов вопрос решен следующим кодом:
procedure TForm2.SBCountChange(Sender: TObject); var Item: TListBoxItem; SB: TSpinBox; s1, s2: string; begin SB := Sender as TSpinBox; // Получили Sender из TSpinBox if Assigned(SB) and (SB is TSpinBox) then begin Item := (((((SB.Parent).Parent).Parent).Parent).Parent) as TListBoxItem; //Соответствует структуре стиля s1 := StringReplace(Item.StylesData['TextPrice'].ToString,'.',',',[rfReplaceAll, rfIgnoreCase]); //Тут обертка точку на запятую меняю s2 := StringReplace(Item.StylesData['SBCount.Text'].ToString,'.',',',[rfReplaceAll, rfIgnoreCase]); Item.StylesData['TextSum.Text'] := IntToStr(Round(StrToFloat(s1) * StrToInt(s2))); end; end;
По поводу (((((SB.Parent).Parent).Parent).Parent).Parent) as TListBoxItem; у меня структура Стиля несколько вложенных TRectangle для автоматического выравнивания, поэтому пришлось из каждого идти выше аж 5 раз.
Не претендую на идеальное решение, но работает отлично
Кстати, в стиле при использовании TPanel вместо TRectangle StyleData['StyleName'] не работало. Поменяв TPanel на TRectangle все стало работать.
Коментарии приветствуются.
Вопрос решен
-
1. Обработчик заработал, спасибо.
единственной загадкой остался синтаксис '<TNotifyEvent>' из
ListBoxItem1.StylesData['spinbox.OnChange'] := TValue.From<TNotifyEvent>(SBCountChange);
2. Как определить Item, из которого был вызван обработчик?
Как в самом Item добраться до объектов заданными по стилю - я понял, а сам Item как определить?
procedure TForm2.SBCountChange(Sender: TObject); var Item: TListBoxItem; begin Item:= ???????????; //Определяем Item, в котором есть SpinBox, который в свою очередь вызвал эту обработку //Получив Item делаем с ним что захотим, в том числе и обращаемся к объектам под StyleData ShowMessage('Item.tag='+IntToStr(Item.tag)); end;
-
Здравствуйте, подскажите направление решения следующей проблемы:
Есть стилизовнный ListBoxItem, содержащий два поля:
- TText: [styleName = 'TextPrice' и 'TextSum']
- TSpinBox: [styleName = 'Count']
Каким образом:
- Можно повесить обработчик на SpinBox.OnChange, чтобы рассчитывать Sum?
- И как обратиться к значению SpinBox.Text?
Код обработчика события изменения SpinBox:
procedure TFormMain.SBCountChange(Sender: TObject); // Какой вызов и где его назначить? var Item: TListBoxItem; begin Item:= ??? //Определение того итема, в котором был изменен TListBox [Name=StyleName='SBCount'] Item.StylesData['TextSum'] := StrToInt( Item.StylesData['TextPrice'] ) * StrToInt( ??? SBCount.Text ); end
Подскажите, пожалуйста, а то только туманные решения
Как получить доступ к свойству объекта в стиле и как повесить свой обработчик на его события?
в StylesData
Опубликовано
Создал новую тему. Интересен, коментарий Brovin Yaroslav.