![]() |
StringGrid
Здравствуйте. Подскажите идею! Есть форма на которую из excel импортируются данные в StringGrig. Далее нужно чтобы данные фильтровались и оставались определенные значения. Например:
в StringGrid попало 100 номеров и суммы, нужно чтобы из всех номеров остались 2224455, 6664443, 7775554 со значениями сумм. |
Как пример кода по кнопке
Код:
for j:= 1 to (Form1.StringGrid1.RowCount-1) do begin Вопрос условия удаления. |
просто может добавить какой то компонент, в котором перечислить нужные номера и сравнить их со stringGrid, которые совпадают посчитать сумму
просто вообще продвинуться не могу, по одному номеру получается for i := 1 to St1.RowCount-1 do if 777 = StrToint(St1.Cells[1, i]) then Summ := Summ + StrToint(St1.Cells[2, i]); Lbl1.Caption := intToStr(Summ); а как группу, что то ума не хватает т.е. мне важно посчитать сумму конкретных значений, а будут они удалятся из таблицы или останутся - это не имеет значения |
Валентин_Будэйко@vk, периодически перечитываю ваше сообщение и все равно не могу его понять :(
Приведите толковый пример. |
Хорошо, пробую.
Есть форма на ней компоненты StringGrid и 2 кнопки. При нажатии на одну кнопку в компонент StringGrid загружаются данные из таблицы excel с телефонами и суммами потраченными при разговоре с этим номером. По идее при нажатии на вторую кнопку, программа должна из всего списка номеров выбрать определенные номера телефонов и сложить их суммы переговоров и результат отобразить в label. Далее могу написать код всей программы: unit Unit1; interface uses Windows, Messages, Math, ComObj, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleServer, ExcelXP, StdCtrls, Buttons, Grids; type TForm1 = class(TForm) st1: TStringGrid; btn1: TBitBtn; lbl1: TLabel; btn2: TButton; lbl2: TLabel; procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormShow(Sender: TObject); procedure btn1Click(Sender: TObject); procedure btn2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Excel: Variant; implementation {$R *.dfm} procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin try Excel.Quit; Excel:=Unassigned; except end; CanClose:=True; end; procedure TForm1.FormShow(Sender: TObject); begin Excel:=CreateOleObject('Excel.Application'); Excel.Application.WorkBooks.Add('c:\Temp\1.xls'); st1.Cells [0,0]:= 'Телефон:'; st1.Cells [1,0]:= 'Сумма:'; end; procedure TForm1.btn1Click(Sender: TObject); var i,RowsCount : Integer; begin RowsCount := excel.ActiveSheet.UsedRange.Rows.Count; for i:= 4 to RowsCount do begin st1.RowCount := RowsCount+1; st1.Cells[0,i]:= Excel.cells[i,3].Value; st1.Cells[1,i]:= Excel.cells[i,8].Value; end; end; procedure TForm1.btn2Click(Sender: TObject); var summ: Real; i: Integer; begin for i := 4 to St1.RowCount-1 do begin Summ := summ + StrTofloat(St1.Cells[1, i]); end; summ:=RoundTo(summ,-2); lbl2.Visible := True; Lbl2.Caption := FloatToStr(Summ); end; end. так считает сумму по всем номерам |
Цитата:
Задаются и пишутся откуда куда? Сумма считается индивидуально по номеру или за все номера сразу? |
номера берутся из списка импортируемого из excel. просто там 100 номеров, а нам нужно заплатить за номера которые числятся за нами, сумма считается для каждого номера. приведу пример:
79231577684 3,540000 79243452345 14,160000 79234320014 1,770000 79005427338 4,720000 79345627338 146,320000 79145566518 4,720000 79157841543 3,540000 79152486253 33,040000 например мне надо суммы номеров на 79157481543 и 79152486253 вообще в идеале, есть список номеров которые надо сравнить со всеми номерами которые импортируются из excel и при совпадении сложить суммы совпавших значений |
Валентин_Будэйко@vk, честно говоря не хочется влезать в Delphi чтобы решать задачи подобного рода.
Попробуйте может использовать внутренние средства Excel для фильтрации необходимой информации. Правда я не знаю, насколько измениться процесс импорта, но ИМХО в Excel решение этой задачи будет более элегантно. http://www.planetaexcel.ru/techniques/3/137/ ---- Создайте еще один StringDrid в котором будут "лежать" все необходимые номера. Далее двойным вложенным циклом просматривать каждый заданный номер по всей выгрузке. Данных не так много, поэтому на прожорливый алгоритм можно прикрыть глаза. |
Спасибо за ценную мысль, все получилось
|
Цитата:
|
Время: 21:33. |
Время: 21:33.
© OSzone.net 2001-