Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2016, 05:14   #1
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию TStringList в Delphi

Есть программа в Delphi,заносит таблицу Excel в массив и сортирует и фильтрует её,работает поиск по номеру документа и дате всё работает. Но понадобилась сделать фильтр,чтобы находились одинаковые пары по номеру и числу код тоже разработан,но проблема в том,что он не работает, проблема с локальной переменной наверное. Вот код
Код:
sl:TstringList; //переменные 
..
sl:=TstringList.Create;
 if sl.IndexOf(sheet.cells[j,i])>-1 then // увеличить на 1
 else sl.add(sheet.cells[j,i]) // добавили строку
А это полный код.
Код:
procedure Xls_Open_filter(XLSFile:string; Grid:TStringGrid; criterion1,criterion2:string);
 const
  xlCellTypeLastCell = $0000000B;
var
  ExlApp, Sheet: OLEVariant;
  i, j, r, sl,  c:integer;


begin

     //создаем объект Excel
  ExlApp := CreateOleObject('Excel.Application');

  //делаем окно Excel невидимым
  ExlApp.Visible := false;

  //открываем файл XLSFile
  ExlApp.Workbooks.Open(XLSFile);

  //создаем объект Sheet(страница) и указываем номер листа (1)
  //в книге, с которого будем осуществлять чтение
  Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];

  //активируем последнюю ячейку на листе
  Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

    // Возвращает номер последней строки
    r := ExlApp.ActiveCell.Row;

    // Возвращает номер последнего столбца
    c := ExlApp.ActiveCell.Column;

    //устанавливаем кол-во столбцов и строк в StringGrid

    Grid.RowCount:=2; //по умолчанию 2 строки
    Grid.ColCount:=c;

     //заполняем шапку таблицы (наименование полей)
    for i:= 1 to c do
          Grid.Cells[i-1,0]:= sheet.cells[1,i];


    //считываем значение из каждой ячейки и проверяем на совпадение по 3 столбцу (Номер документа)
     for j:= 1 to r do
        //собственно сравниваем наш критерий со значением в Excel
        //функция trim убирает все лишние пробелы в строке т.е. пробелы перед и после текста
        //функция lowercase возвращает строку в нижнем регистре. uppercase - в верхнем регистре

         if (trim (lowercase(sheet.cells[j,4]))=trim(lowercase(criterion1))) or (trim (lowercase(sheet.cells[j,8]))=trim(lowercase(criterion2))) then
            begin
            //если значения совпали то заносим его в таблицу grid. Не забываем что в объекте Excel нумерация строк и столбцов в Excel 1, в Grid c 0
               for i:= 1 to c do
                  Grid.Cells[i-1,grid.RowCount-1]:= sheet.cells[j,i];
 var sl:TStringList;
begin
sl:=TStringList.Create;
if sl.IndexOf(sheet.cells[j,i])>-1 then //увеличить на 1
else sl.add(sheet.cells[j,i])//добавили строку


            grid.RowCount:=grid.RowCount+1; //добавляем пустую строку в grid.
            end;

 //закрываем приложение Excel
 ExlApp.Quit;

 //очищаем выделенную память
 ExlApp := Unassigned;
 Sheet := Unassigned;

end;
Kostya12 вне форума Ответить с цитированием
Старый 29.09.2016, 09:06   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
, проблема с локальной переменной наверное.
чтоб не гадать, надо читать сообщения компилятора.
Error, Warining обязательно, да Hint желательно.
и принимать меры к их устранению.

Цитата:
но проблема в том,что он не работает,
Delphi достаточно "умная" программа. И для большинства "нерабочих" программ она дает подсказки, что и где может привести к неработающему коду.
Приведи ЗДЕСЬ сообщения компилятора. Error Warning с привязками (отметками к каким строкам они относятся). и тебе подскажут.
в противном случае нам придется самим выступать в роли такого компилятора, а наш процессор гораздо медленнее и больше загружен другими задачами.

Код:
sl:=TStringList.Create; // мы создали НОВЫЙ пустой список
if sl.IndexOf(sheet.cells[j,i])>-1 then //увеличить на 1 // поэтому там НИЧЕГО не найдем
else sl.add(sheet.cells[j,i])//добавили строку  // значит добавим ровно одну строку в наш список и.. 
 // "благополучно" забудем по САМ список, так как в следующий раз снова создадим новый список (см. выше).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.09.2016 в 09:15.
evg_m вне форума Ответить с цитированием
Старый 29.09.2016, 09:42   #3
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию TStringList в Delphi

Спасибо я уже многое исправил но теперь конфликтуют локальные переменные.Ошибку приложу на скриншоте. Вот код
Код:
procedure Xls_Open_filter(XLSFile:string; Grid:TStringGrid; criterion1,criterion2:string);
 const
  xlCellTypeLastCell = $0000000B;
var
  ExlApp, Sheet: OLEVariant;
  i, j, r, sl, c:integer;


begin

     //создаем объект Excel
  ExlApp := CreateOleObject('Excel.Application');

  //делаем окно Excel невидимым
  ExlApp.Visible := false;

  //открываем файл XLSFile
  ExlApp.Workbooks.Open(XLSFile);

  //создаем объект Sheet(страница) и указываем номер листа (1)
  //в книге, с которого будем осуществлять чтение
  Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];

  //активируем последнюю ячейку на листе
  Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

    // Возвращает номер последней строки
    r := ExlApp.ActiveCell.Row;

    // Возвращает номер последнего столбца
    c := ExlApp.ActiveCell.Column;

    //устанавливаем кол-во столбцов и строк в StringGrid

    Grid.RowCount:=2; //по умолчанию 2 строки
    Grid.ColCount:=c;
     sl:=TStringList.Create;
     //заполняем шапку таблицы (наименование полей)
    for i:= 1 to c do BEGIN
          Grid.Cells[i-1,0]:= sheet.cells[1,i];


    //считываем значение из каждой ячейки и проверяем на совпадение по 3 столбцу (Номер документа)
     for j:= 1 to r do
        //собственно сравниваем наш критерий со значением в Excel
        //функция trim убирает все лишние пробелы в строке т.е. пробелы перед и после текста
        //функция lowercase возвращает строку в нижнем регистре. uppercase - в верхнем регистре

         if (trim (lowercase(sheet.cells[j,4]))=trim(lowercase(criterion1))) or (trim (lowercase(sheet.cells[j,8]))=trim(lowercase(criterion2))) then
            begin
            //если значения совпали то заносим его в таблицу grid. Не забываем что в объекте Excel нумерация строк и столбцов в Excel 1, в Grid c 0
               for i:= 1 to c do
                  Grid.Cells[i-1,grid.RowCount-1]:= sheet.cells[j,i];
if sl.IndexOf(sheet.cells[j,i])>-1 then //увеличить на 1
else sl.add(sheet.cells[j,i])//добавили строку


            grid.RowCount:=grid.RowCount+1; //добавляем пустую строку в grid.
            end;
            END;
            sl.Free;
 //закрываем приложение Excel
 ExlApp.Quit;

 //очищаем выделенную память
 ExlApp := Unassigned;
 Sheet := Unassigned;

end;
Изображения
Тип файла: jpg Безымянный4.jpg (97.4 Кб, 118 просмотров)
Kostya12 вне форума Ответить с цитированием
Старый 29.09.2016, 10:02   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В сообщении и говорится, что s1 объявлен как Integer, а не TStringList
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.09.2016, 10:36   #5
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию TStringList в Delphi

Спасибо помогло,но возникла ещё одна проблема на скриншоте ниже можно посмотреть. Вот код
Код:
procedure Xls_Open_filter(XLSFile:string; Grid:TStringGrid; criterion1,criterion2:string);
 const
  xlCellTypeLastCell = $0000000B;
var
  ExlApp, Sheet: OLEVariant;
  i, j, r,  c:integer;
  sl:TStringlist;


begin

     //создаем объект Excel
  ExlApp := CreateOleObject('Excel.Application');

  //делаем окно Excel невидимым
  ExlApp.Visible := false;

  //открываем файл XLSFile
  ExlApp.Workbooks.Open(XLSFile);

  //создаем объект Sheet(страница) и указываем номер листа (1)
  //в книге, с которого будем осуществлять чтение
  Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];

  //активируем последнюю ячейку на листе
  Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

    // Возвращает номер последней строки
    r := ExlApp.ActiveCell.Row;

    // Возвращает номер последнего столбца
    c := ExlApp.ActiveCell.Column;

    //устанавливаем кол-во столбцов и строк в StringGrid

    Grid.RowCount:=2; //по умолчанию 2 строки
    Grid.ColCount:=c;
     sl:=TStringList.Create;
     //заполняем шапку таблицы (наименование полей)
    for i:= 1 to c do BEGIN
          Grid.Cells[i-1,0]:= sheet.cells[1,i];


    //считываем значение из каждой ячейки и проверяем на совпадение по 3 столбцу (Номер документа)
     for j:= 1 to r do
        //собственно сравниваем наш критерий со значением в Excel
        //функция trim убирает все лишние пробелы в строке т.е. пробелы перед и после текста
        //функция lowercase возвращает строку в нижнем регистре. uppercase - в верхнем регистре

         if (trim (lowercase(sheet.cells[j,4]))=trim(lowercase(criterion1))) or (trim (lowercase(sheet.cells[j,8]))=trim(lowercase(criterion2))) then
            begin
            //если значения совпали то заносим его в таблицу grid. Не забываем что в объекте Excel нумерация строк и столбцов в Excel 1, в Grid c 0
               for i:= 1 to c do
                  Grid.Cells[i-1,grid.RowCount-1]:= sheet.cells[j,i];
if sl.IndexOf(sheet.cells[j,i])>-1 then //увеличить на 1
else sl.add(sheet.cells[j,i])//добавили строку


            grid.RowCount:=grid.RowCount+1; //добавляем пустую строку в grid.
            end;
            END;
            sl.Free;
 //закрываем приложение Excel
 ExlApp.Quit;

 //очищаем выделенную память
 ExlApp := Unassigned;
 Sheet := Unassigned;

end;
Изображения
Тип файла: jpg Безымянный5.jpg (97.2 Кб, 125 просмотров)
Kostya12 вне форума Ответить с цитированием
Старый 29.09.2016, 10:46   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Код:
    //заполняем шапку таблицы (наименование полей)
    for i:= 1 to c do BEGIN
          Grid.Cells[i-1,0]:= sheet.cells[1,i];
.........
            //если значения совпали то заносим его в таблицу grid. Не забываем что в объекте Excel нумерация строк и столбцов в Excel 1, в Grid c 0
               for i:= 1 to c do
                  Grid.Cells[i-1,grid.RowCount-1]:= sheet.cells[j,i];
ну и как бедному компилятору разобраться КАКОЕ i надо использовать.
переменная УЖЕ занята.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.09.2016, 11:04   #7
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию

Да вы правы не заметил,и как думаете чем заменить i ?
Kostya12 вне форума Ответить с цитированием
Старый 29.09.2016, 11:06   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Замени на iiiiiiiii
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.09.2016, 11:15   #9
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию

Я додумался я i внутри цикла на k заменил и прописал в var ,но теперь другая проблема вот код ниже приложу скриншот.
Код:
If OpenDialog1.Execute then Xls_Open (OpenDialog1.FileName,  StringGrid1); //кнопка для выбора файла
end;

procedure Xls_Open_filter(XLSFile:string; Grid:TStringGrid; criterion1,criterion2:string);
 const
  xlCellTypeLastCell = $0000000B;
var
  ExlApp, Sheet: OLEVariant;
  i, j, r, k,  c:integer;
  sl:TStringlist;


begin

     //создаем объект Excel
  ExlApp := CreateOleObject('Excel.Application');

  //делаем окно Excel невидимым
  ExlApp.Visible := false;

  //открываем файл XLSFile
  ExlApp.Workbooks.Open(XLSFile);

  //создаем объект Sheet(страница) и указываем номер листа (1)
  //в книге, с которого будем осуществлять чтение
  Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];

  //активируем последнюю ячейку на листе
  Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

    // Возвращает номер последней строки
    r := ExlApp.ActiveCell.Row;

    // Возвращает номер последнего столбца
    c := ExlApp.ActiveCell.Column;

    //устанавливаем кол-во столбцов и строк в StringGrid

    Grid.RowCount:=2; //по умолчанию 2 строки
    Grid.ColCount:=c;
     sl:=TStringList.Create;
     //заполняем шапку таблицы (наименование полей)
    for i:= 1 to c do BEGIN
          Grid.Cells[i-1,0]:= sheet.cells[1,i];


    //считываем значение из каждой ячейки и проверяем на совпадение по 3 столбцу (Номер документа)
     for j:= 1 to r do
        //собственно сравниваем наш критерий со значением в Excel
        //функция trim убирает все лишние пробелы в строке т.е. пробелы перед и после текста
        //функция lowercase возвращает строку в нижнем регистре. uppercase - в верхнем регистре

         if (trim (lowercase(sheet.cells[j,4]))=trim(lowercase(criterion1))) or (trim (lowercase(sheet.cells[j,8]))=trim(lowercase(criterion2))) then
            begin
            //если значения совпали то заносим его в таблицу grid. Не забываем что в объекте Excel нумерация строк и столбцов в Excel 1, в Grid c 0
               for k:= i to c do
                  Grid.Cells[i-1,grid.RowCount-1]:= sheet.cells[j,i];
if sl.IndexOf(sheet.cells[j,i])>-1 then //увеличить на 1
else sl.add(sheet.cells[j,i])//добавили строку


            grid.RowCount:=grid.RowCount+1; //добавляем пустую строку в grid.
            end;
            END;
            sl.Free;
 //закрываем приложение Excel
 ExlApp.Quit;

 //очищаем выделенную память
 ExlApp := Unassigned;
 Sheet := Unassigned;

end;
Изображения
Тип файла: jpg Безымянный6.jpg (97.3 Кб, 123 просмотров)
Kostya12 вне форума Ответить с цитированием
Старый 29.09.2016, 11:40   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Попробуй сам читать сообщения об ошибках. Пишет же, что отсутствует разделитель ; . Смотри предыдущую команду
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
tstringlist sven4ik Общие вопросы Delphi 3 04.06.2013 14:01
Работа со TstringList в Delphi MaryJaneAlise Помощь студентам 4 02.12.2012 18:23
[Delphi] Считывания ID3v2 тегов из файлов хранящихся в TStringList Zilian Помощь студентам 0 22.10.2011 02:11
TStringList vasyaRyzhyi Общие вопросы Delphi 0 07.03.2011 11:01