ValueListEditor - суммировать Value совпадающих Name

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Аватара пользователя
Сейчас_не_спящий
Сообщения: 45
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

22 мар 2007, 14:18

Всем доброго времени суток!
Проблема такая:
Есть 2 ValueListEditor, строки из 1го добовляются во 2й.
Что должно происходить:
Если Name из 1го совпадёт с Name из 2го, Name(string) во 2м остаётся, а Values(integer) во втором суммируется с Values(integer) из первого.
В чём главная проблема:
Всё это я сделать могу, только в результате получается что вместо того что бы заменять Values в ValueListEditor2 (т.е. в строке меняется только Values) оно добавляет ещё одно строку где Name = Name из 2, Values = Values(1) + Values(2).
Как решить эту проблему? плиз хэлп.
Всё не знает никто, но важно найти того кто знает нужное...
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

22 мар 2007, 15:02

Если я не ошибаюсь, values у этого компонента имеет тип "строка". Может, ошибка связана с тем, что надо ее преобразовать в число?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Сейчас_не_спящий
Сообщения: 45
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

22 мар 2007, 15:45

&quot писал(а):Если я не ошибаюсь, values у этого компонента имеет тип "строка". Может, ошибка связана с тем, что надо ее преобразовать в число?
нет, не в этом ошибка, я делаю преобразования
Всё не знает никто, но важно найти того кто знает нужное...
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

22 мар 2007, 16:05

&quot писал(а):нет, не в этом ошибка, я делаю преобразования
Ну что пустословить, код выкладывайте - сами все увидим...
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Сейчас_не_спящий
Сообщения: 45
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

22 мар 2007, 16:17

&quot писал(а):Ну что пустословить, код выкладывайте - сами все увидим...
будь добр, сделать и вылажи...
Я преверженец поговорки "в споре рождается истина"
Всё не знает никто, но важно найти того кто знает нужное...
Лелик_1044
Сообщения: 339
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

22 мар 2007, 16:25

Может ты добовляешь а не изменяешь?
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
Сейчас_не_спящий
Сообщения: 45
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

22 мар 2007, 16:35

Всё люди, у самого идея пришла, реализовал вреде получилось. счас на баги проверю, если нормально, то вылажу код
Всё не знает никто, но важно найти того кто знает нужное...
Лелик_1044
Сообщения: 339
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

22 мар 2007, 16:49

Может ты добовляешь а не изменяешь?
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
Сейчас_не_спящий
Сообщения: 45
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

22 мар 2007, 21:09

Получилось, но не то что хотел :(
Пробовал отладить, не получается, помогите найти ошибку(хотя может я вообще не правильно делаю...).
На форме два ValueListEditor и кнопка, ValueListEditor1 надо сразу набить текстом, хотя бы несколько строк. Вот листинг:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
a : TStringList;
s, s1, s2, s3, sv1 : string;
i, j : integer;
begin
  if ValueListEditor1.RowCount > 1 then
  begin
    a := TStringList.Create;
    for i := 1 to ValueListEditor1.RowCount -1 do
    begin
      s := ValueListEditor1.Cells[0,i];
      s1 := ValueListEditor1.Cells[1,i];
      if ValueListEditor2.RowCount > 2 then
      for j := 1 to ValueListEditor2.RowCount -1 do
      begin
        s2 := ValueListEditor2.Cells[0,j];
        s3 := ValueListEditor2.Cells[1,j];
        if s = s2 then
        begin
          ValueListEditor2.Cells[1,j] := IntToStr(StrToInt(s1) + StrToInt(s3));
        end
        else
        begin
          a.Add(ValueListEditor1.Cells[0,i] + '=' + ValueListEditor1.Cells[1,i]);
        end
      end
      else
      sv1 := s + '=' + s1;
      if not (sv1 = '') then
      a.Add(sv1);
    end;
    ValueListEditor2.Strings.AddStrings(a);
  end;
end;
Заранее спасибо
Всё не знает никто, но важно найти того кто знает нужное...
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

23 мар 2007, 09:25

Вот сразу бы выложил, я ведь об о твоем коде говорил.
Во первых, непонятно
&quot писал(а):if ValueListEditor2.RowCount > 2 then
Почему именно > 2, если есть хотя бы один ключ и значение, тогда > 0. Попрошу не путать с гридами.
Во-вторых, проверка не имеет смысла, т.к. sv1 никогда не будет пустым.
&quot писал(а):sv1 := s + '=' + s1;
if not (sv1 = '') then
a.Add(sv1);
В-третьих, найдя ключ, дальше его искать не надо, иначе они будут дублироваться.
В-четвертых, есть прекрасный метод FindRow, который ищет по ключу номер Row, где он его нашел. Вообщем выкидываем все лишнее, и получаем примерно это:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
a : TStringList;
s, s1 : string;
i, r : integer;
begin
  if ValueListEditor1.RowCount > 0 then
  begin
    a := TStringList.Create;
    for i := 1 to ValueListEditor1.RowCount -1 do
    begin
      s := ValueListEditor1.Cells[0,i];
      s1 := ValueListEditor1.Cells[1,i];
      if ValueListEditor2.FindRow(s, r)
        then ValueListEditor2.Cells[1, r] := IntToStr(StrToInt(s1) + StrToInt(ValueListEditor2.Cells[1, r]))
        else a.Add(ValueListEditor1.Cells[0,i] + '=' + ValueListEditor1.Cells[1,i]);
    end;
    ValueListEditor2.Strings.AddStrings(a);
  end;
end;
It's a long way to the top if you wanna rock'n'roll
Ответить