Перейти к содержанию
Fire Monkey от А до Я

Kikoma

Пользователи
  • Постов

    31
  • Зарегистрирован

  • Посещение

  • Победитель дней

    2

Сообщения, опубликованные Kikoma

  1. Здравствуйте.

    Стоит задача: Кастомизированный 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;
    
  2.  

    Ох, обалдеть =))) Вы прикинули сколько машинного времени на это уходит ? =))) ... Но то, что Вы написали - жестко =)

    :D :D

    Я не то что прикинул, я на своем довольно шустром Galaxy Note 2 заметил торможение при прокрутке.

    Была мысль через tag сделать, но решил что это както примитивно и есть способ лучше.

    Но видимо через tag пока само лучше.

  3. После многих эксперементов вопрос решен следующим кодом:

    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 все стало работать.

     

    Коментарии приветствуются.

    Вопрос решен

  4. 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;
    
  5. Здравствуйте, подскажите направление решения следующей проблемы:

     

    Есть стилизовнный ListBoxItem, содержащий два поля:

    1. TText: [styleName = 'TextPrice' и 'TextSum']
    2. TSpinBox: [styleName = 'Count']

    Каким образом:

    1. Можно повесить обработчик на SpinBox.OnChange, чтобы рассчитывать Sum?
    2. И как обратиться к значению 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
    

    Подскажите, пожалуйста, а то только туманные решения

×
×
  • Создать...