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

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

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

Восстановить пароль

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

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

Всё исправил подучилось вот так
Код:
var
  ExlApp, Sheet: OLEVariant;
 i, j,  jjjjjjj, r, c : integer;
 v1, v2  : string;
 rowisfind: integer;
Но потом с точками возникла проблема.
[Error] Unit5.pas(182): Statement expected but '..' found
Изображения
Тип файла: jpg Безымянный12.jpg (93.4 Кб, 151 просмотров)
Kostya12 вне форума Ответить с цитированием
Старый 10.10.2016, 10:55   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

это шутка?
а что такое за команда из точек?!
Код:
....
туда же надо вписать свой код вместо многоточия.
или убрать совсем, если ничего делать не надо.

а вот это ... ставит компилятор (и справедливо ставит) в тупик.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.10.2016, 10:59   #13
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

... а здесь НАДО написать то, что вы хотите Сделать
Цитата:
begin //в случае найденного дубля на rowisfind строке grid
Цитата:
begin // и что если такой строки не нашли
если ничего не хотим делать, значит ничего и не пишем.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 10.10.2016, 11:16   #14
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию

Ах да,я же чувствую ,что код недоделанный. Нужно вывести найденный совпадения в string grid,чтобы их можно было посматривать.
Kostya12 вне форума Ответить с цитированием
Старый 10.10.2016, 11:45   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Kostya12 Посмотреть сообщение
Ах да,я же чувствую ,что код недоделанный. Нужно вывести найденный совпадения в string grid,чтобы их можно было посматривать.
Ну это Вам виднее, что должен делать ваш код!
Нужно выводить в StringGrid - так выводите.
А компьютер угадывать ваши желания по трём точкам ещё не научился.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.10.2016, 04:40   #16
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию

Это понятно,как думаете как лучше написать?
Kostya12 вне форума Ответить с цитированием
Старый 12.10.2016, 06:10   #17
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию String list в Delphi.

Здравствуйте у меня есть программа ищет более двух совпадения номера и даты в таблице Excel через Delphi. Deplhi открывает Excel как массив типа varian и работает с ним,но проблема в том,что программа не запускается. Может вы увидите в чём проблема. Ниже будет код+скриншот с ошибкой.
Код:
unit Unit5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls, ComObj;

type
  TForm1 = class(TForm)
    Button3: TButton;
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    Label2: TLabel;
    StringGrid1: TStringGrid;
    Label3: TLabel;
    Edit2: TEdit;
    procedure OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
   Excel: Variant;
implementation
procedure Xls_Open(XLSFile:string; Grid:TStringGrid);
 const
  xlCellTypeLastCell = $0000000B;
var
  ExlApp, Sheet: OLEVariant;
  i, j, r, 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];


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


            begin
            //если значения совпали то заносим его в таблицу grid. Не забываем что в объекте Excel нумерация строк и столбцов с 1, в Grid c 0
               for i:= 1 to c do
                  Grid.Cells[i-1,grid.RowCount-1]:= sheet.cells[j,i];


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

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

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

end;
{$R *.dfm}

procedure TForm1.OpenDialog1CanClose(Sender: TObject;
  var CanClose: Boolean); //основа программы
begin
with OpenDialog1 do  //для выбора файла
  if Execute then
    Excel.Application.WorkBooks.Add(FileName);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
try
  Excel.Quit;
except
end;
CanClose:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
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,  jjjjjjj, r, c : integer;
 v1, v2  : string;
 rowisfind: 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 BEGIN
          Grid.Cells[i-1,0]:= sheet.cells[1,i];


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

          v1:=trim (lowercase(sheet.cells[j,4]));
        v2:=trim (lowercase(sheet.cells[j,8])); // Excel  проверяет величины
// И ищем нужные нам величины (v1, v2) в нашей таблице Grid

  for jjjjjjj:=0 to grid.rowcount-1 do //  Пройдём по всем заполненым строкам grid чтобы узнать, а нет ли там нужных значений
    if (grid.cells[jjjjjjj,1]=v1) and (grid.cells[jjjjjjj,2]=v2) then begin //находим их
     rowisfind:=jjjjjjj;// запомним на какой строке
     break;// дальше искать незачем
    end;

  // а теперь зная результат поиска (rowisfind)
  if rowisfind >=0 then begin //в случае найденного дубля на rowisfind строке grid
  begin //в случае найденного дубля на rowisfind строке grid
  end
  end
  else begin // и что если такой строки не нашли
  begin // и что если такой строки не нашли
  end;


            END;


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

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

end;
procedure TForm1.Button3Click(Sender: TObject);
begin
If OpenDialog1.Execute then Xls_Open_filter (OpenDialog1.FileName, StringGrid1, Edit1.Text, Edit2.Text);
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const //здесь определяем ваш цвет. Так же можно использовать цвета по умолчанию.
  clPaleGreen = TColor($CCFFCC);
  clPaleRed = TColor($CCCCFF);
begin
  //Если ячейка получает фокус,то нам надо закрасить её другими цветами
  if (gdFocused in State) then
  begin
    StringGrid1.Canvas.Brush.Color := clBlack;
    StringGrid1.Canvas.Font.Color := clWhite;
  end
  else //Если же ячейка теряет фокус,то закрашиваем её коасным и зелёным.
    if (ACol=7) or(ACol=3)  then //Восьмая ячейка будет зелёной,другие - ячейки красные
      StringGrid1.Canvas.Brush.color := clPaleGreen
    else
      StringGrid1.canvas.brush.Color := clPaleRed;

  //Теперь закрвсим ячйки,но только,если ячейка не Title- Row/Column
  //Естественно это зависит от того,есть у вас title-Row/Columns ??? ???.

  if (ACol > 0) and (ARow > 0) then
  begin
    //Закрашиваем бэкграунд
    StringGrid1.Canvas.FillRect(Rect);

    //Закрашиваем текст (Text). Так же здесь можно добавить выравнивание и   т.д..
    StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow]);
  end;
end;






end.

end.

end.
Изображения
Тип файла: jpg Безымянный13.jpg (95.1 Кб, 137 просмотров)
Kostya12 вне форума Ответить с цитированием
Старый 12.10.2016, 08:23   #18
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

ну END не хватает или наоборот лишний.
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 12.10.2016, 08:32   #19
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию Разобрался

Хмм теперь разобрался вот тут надо было поставить end
[DELPHI]end
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
If OpenDialog1.Execute then Xls_Open_filter (OpenDialog1.FileName, StringGrid1, Edit1.Text, Edit2.Text);
end;[/DELPHI]
Теперь программа запускается но крашиться. Когда нажимаешь фильтрация и выбираешь файл для фильтрации ,то через несколько секунд программа вылетает с ошибкой и ещё подсвечивается строка. Ниже на картинках будет всё показано.
Изображения
Тип файла: jpg Безымянный15.jpg (95.6 Кб, 149 просмотров)
Тип файла: jpg Безымянный16.jpg (92.9 Кб, 117 просмотров)
Kostya12 вне форума Ответить с цитированием
Старый 12.10.2016, 09:36   #20
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

Если мы не найдем нужную инфу в таблице(Grid), то у нас значение rowisfind неизвестно и компилятор об этом добросовестно ОБЯЗАН был сообщить.
был Warning с упоминанием данного имени (хотя cработает ли это с Variant не уверен).

Цитата:
rowisfind:=-1; //вначале считаем что нужного там нет
куда-то пропало при "многократном переписывании"
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 12.10.2016 в 09:39.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Excel: фильтр по массовому вхождению kitreklama Microsoft Office Excel 14 27.09.2016 15:19
фильтр-сортировка excel 2003 Sharrik Microsoft Office Excel 2 25.07.2013 09:13
Фильтр с combobox в excel VinDiz Помощь студентам 0 25.12.2012 20:59
Фильтр по дате Otlook из Excel Rojohn Microsoft Office Excel 0 05.10.2010 13:24
Фильтр в Access как в Excel Flangini Microsoft Office Access 5 05.03.2010 08:11