Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поток запущен, а форма висит 
V
    Опции темы
Чучмек
Дата 1.7.2012, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



И еще. Знаешь, не знаешь ...
Прежде чем вызвать в потоке CreateOleObject необходимо вызвать coinitialize.

Код

procedure Txxx.execute;
 begin
 coinitialize(nil);
 ...
 Excel := CreateOleObject('Excel.Application');
 ...
 excel.quit;
 ...
 couninitialize;
 end;



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Чучмек
Дата 1.7.2012, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Еще...
В твоем случае можно вообще обойтись без  Synchronize.
В TPotok объяви переменную hProgressBar:Cardinal (в место ProgressBar), в которую, при инициализации потока, сохраняй StatusProgressBar.Handle
В потоке можешь смело использовать
  
Код

SetWindowPos(hProgressBar, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); 
вместо 
Код

StatusProgressBar.visible:=true;


Код

SetWindowPos(hProgressBar, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW);
 вместо 
Код

StatusProgressBar.visible:=false;



Код

PostMessage(hProgressBar, PBM_SETRANGE32, Mix, Max);
 вместо 
Код

StatusProgressBar.Min:=Min;
StatusProgressBar.Max:=Max;


Код

PostMessage(hProgressBar, PBM_SETPOS, position,0);
 вместо 
Код

StatusProgressBar.Position:=position;


Константы из CommCtrl
Код

const
 PBM_SETPOS              = WM_USER+2;
 PBM_SETRANGE32          = WM_USER+6;




Это сообщение отредактировал(а) Чучмек - 1.7.2012, 20:32


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
chikistbuch
Дата 1.7.2012, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 15.3.2008

Репутация: нет
Всего: 1



Охренеть. Чучмек, спасибо конечно, но ....
Оставлю этот вопрос на потом. Еще раз спасибо!!!

Это сообщение отредактировал(а) chikistbuch - 1.7.2012, 20:36
PM MAIL   Вверх
chikistbuch
Дата 1.7.2012, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 15.3.2008

Репутация: нет
Всего: 1



Всё таки решил попробовать, пишет ошибку:
Код

[DCC Error] Unit1.pas(251): E2003 Undeclared identifier: 'coinitialize'


Код

procedure TPotok.Execute;
var
  WorkBook, Sheet: Variant;
  i, j, kolKolonok, kolStrok:integer;
  sql, sql_1: string;
  maxID: array [1..2] of string;
  sqlArray: OLEVariant;
  bool:boolean;
begin
  coinitialize(nil);
  try
    Excel := CreateOleObject('Excel.Application');//создаем что-то типа excel
  except
    MessageBox(Application.ActiveFormHandle, 'MS Excel не найден!'+#13#10+'Для работы программы необходимо установить MS Excel.', 'Внимание!', MB_ICONWARNING or MB_OK);
    exit;
  end;

  Excel.Application.Enab

PM MAIL   Вверх
Чучмек
Дата 1.7.2012, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Пропиши в uses activex

Это сообщение отредактировал(а) Чучмек - 1.7.2012, 21:47


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Чучмек
Дата 1.7.2012, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Опять же...
Цитата(chikistbuch @  1.7.2012,  21:21 Найти цитируемый пост)
MessageBox(Application.ActiveFormHandle, 

В execute не должно быть ничего типа Application.xxx... и Form1.xxx...  - такое только через Synchronize.
Переменную Excel  объяви в Execute. В execute  Excel и закроешь.



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
chikistbuch
  Дата 1.7.2012, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 15.3.2008

Репутация: нет
Всего: 1



Цитата(Чучмек @ 1.7.2012,  22:08)
Опять же...
Цитата(chikistbuch @  1.7.2012,  21:21 Найти цитируемый пост)
MessageBox(Application.ActiveFormHandle, 

В execute не должно быть ничего типа Application.xxx... и Form1.xxx...  - такое только через Synchronize.
Переменную Excel  объяви в Execute. В execute  Excel и закроешь.

))) а  оно все равно работает ))))))

Добавлено @ 22:32
Намудрил, сам не знаю что, но работает ))))))) (все в одном unit'е):
Код

type
   TPotok = class(TThread)
    private
      hProgressBar:Cardinal;
      list: TStrings;
      filename: string;
      Excel: OleVariant;
      ProgressBar: TProgressBar;
      UniQuery: TUniQuery;
      procedure loaddata;
     { Private declarations }
    protected
      procedure Execute; override;
end;

var
  potok: TPotok;


Код

procedure TPotok.Execute;
var
  WorkBook, Sheet: Variant;
  i, j, kolKolonok, kolStrok:integer;
  sql, sql_1: string;
  maxID: array [1..2] of string;
  sqlArray: OLEVariant;
  bool:boolean;
begin
  coinitialize(nil);
  try
    Excel := CreateOleObject('Excel.Application');//создаем что-то типа excel
  except
    MessageBox(0, 'MS Excel не найден!'+#13#10+'Для работы программы необходимо установить MS Excel.', 'Внимание!', MB_ICONWARNING or MB_OK);
    exit;
  end;

  Excel.Application.EnableEvents := false;// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
  Excel.DisplayAlerts:=False;//отключаем сообщения excel'я

  WorkBook := Excel.WorkBooks.Open(filename);//открываем файл
  PostMessage(0, WM_CloseExcel, 0, 0);//закрываем excel после выполнения данной процедуры

  try
    Sheet := Workbook.Sheets.Item[1] //выбираем лист
  except
    MessageBox(Application.ActiveFormHandle, 'Ошибка!'+#13#10+'Файл MS Excel пуст или поврежден.', 'Внимание!', MB_ICONWARNING or MB_OK);
    exit;
  end;

  kolStrok:=Sheet.UsedRange.Rows.Count;
  kolKolonok:=Sheet.UsedRange.Columns.Count;
  sqlArray:=Sheet.UsedRange.Value; //прочитали все значения в массив

  for i := 1 to kolKolonok do begin //проверяем правильность названия колонок
    j:=0;
    bool:=false;//индикатор совпадения имени

    while (j<list.Count-1) AND (NOT bool) do begin
      if AnsiUpperCase(sqlArray[1,i])=AnsiUpperCase(list.Strings[j]) then begin //если название колонки совпадает с названием колонки в БД
        sqlArray[1,i]:=form1.getAS(sqlArray[1,i], 2);//записали название колонки familia
        bool:=true;
      end;
      j:=j+1;
    end;

    if not bool then begin //если совпадений в названии колонки не найдено
      MessageBox(Application.ActiveFormHandle, pChar('Ошибка! Неверное название '+inttostr(i)+' колонки: "'+string(sqlArray[1,i])+'".'), 'Внимание!', MB_ICONWARNING or MB_OK);
      exit;//прерываем выполнение кода
    end;
  end;

  if  MessageBox(0, 'Загрузить данные из указанного файла?', 'Внимание!', MB_ICONWARNING or MB_YESNO) = IDNO then exit;//прерываем выполнение кода

  ProgressBar.Position:=0;
  ProgressBar.Visible:=true;
  ProgressBar.Max:=kolStrok+round(0.2*kolStrok);


  UniQuery.SQL.Text:='SELECT MAX(`id`) FROM spisok';//узнали макс id
  UniQuery.Execute;
  maxID[1]:=UniQuery.Fields.Fields[0].AsString;

    sql:='PREPARE excelInsert FROM "INSERT INTO `spisok` ('; //подготавливаем sql запрос на ввод данных

  for i:=1 to kolKolonok do begin
    sql:=sql+'`'+sqlArray[1,i]+'`, ';
    sql_1:=sql_1+'@'+sqlArray[1,i]+', ';//для EXECUTE
  end;
  delete(sql, length(sql)-1, 2);
  delete(sql_1, length(sql_1)-1, 2);//для EXECUTE
  sql:=sql+') VALUES (';

  for i:=1 to kolKolonok do begin
    sql:=sql+'?, ';
  end;
  delete(sql, length(sql)-1, 2);
  sql:=sql+')";';           //подготовили запрос на вставку

  for i := 2 to kolStrok do begin //так как первая строка содержит названия колонок
    if i mod 10 = 0 then ProgressBar.Position:=i;
    for j := 1 to kolKolonok do begin
      if string(sqlArray[i,j])='' then sql:=sql+'SET @'+string(sqlArray[1,j])+' = NULL;'//проверяем не пуста ли строка
        else sql:=sql+'SET @'+string(sqlArray[1,j])+' = "'+string(sqlArray[i,j])+'";';//формируем значения
    end;
  sql:=sql+'EXECUTE excelInsert USING '+sql_1+';';;
  end;

  UniQuery.SQL.Text:=sql;
  UniQuery.Execute; //вставили все значения


  UniQuery.SQL.Text:='SELECT MAX(`id`) FROM spisok';//узнали макс id
  UniQuery.Execute;
  maxID[2]:=inttostr(form1.UniQuery2.Fields.Fields[0].AsInteger+1);

  if maxID[1]='' then sql_1:='WHERE id < '+maxID[2] //формируем условие запроса
    else sql_1:='WHERE id BETWEEN '+maxID[1]+' AND '+maxID[2];
  sql:='UPDATE spisok SET data_redaktirovania = "'+FormatDateTime('yyyy:mm:dd',Now())+'" '+sql_1;//выставляем дату редактирования записи
  UniQuery.SQL.Text:=sql;
  UniQuery.Execute;

  ProgressBar.Position:=ProgressBar.Max;

  kolStrok:=kolStrok-1; //так как 1 строка - название колонок
  sql_1:=inttostr(kolStrok)[length(inttostr(kolStrok))];//формируем сообщение
  sql:='Загрузка данных выполнена успешно!'+#13#10+'Загружен';

  if (sql_1='1') and (kolStrok<>11) then sql:=sql+'а'
    else sql:=sql+'о';

  sql:=sql+' '+inttostr(kolStrok);
  if (kolStrok>10) and (kolStrok<21) or (sql_1='0') or (sql_1='5') or (sql_1='6') or (sql_1='7') or (sql_1='8') or (sql_1='9') then sql:=sql+' записей.'
    else if sql_1='1' then sql:=sql+' запись.'
      else sql:=sql+' записи.';

  MessageBox(0, PWideChar(sql), 'Внимание!', MB_ICONWARNING or MB_OK);

  ProgressBar.Visible:=false;

  Excel.Quit;  //якобы мы нажимаем на крестик в excel
  Excel:=unassigned;  //походу это нужно писать в паре с Quit (перевод - неназначенный)

  Synchronize(loaddata); // Вызов метода с синхронизацией
  couninitialize;
end;

procedure TPotok.loaddata();
begin
  getDB();
end;

procedure TForm1.ToolButton7Click(Sender: TObject);
begin
  form1.OpenDialog1.Filter:='Файлы Excel|*.xls; *.xlsx';
  if form1.OpenDialog1.Execute() then begin
    potok := TPotok.Create(true);// true - после создания класса поток автоматически запущен не будет
    potok.FreeOnTerminate := true;//после завершения кода потока он сразу завершится
    potok.ProgressBar:=StatusProgressBar;
    potok.UniQuery:=form1.UniQuery2;
    potok.hProgressBar:=StatusProgressBar.Handle;
    potok.filename := form1.Opendialog1.FileName;
    potok.list:=form4.CheckListBox1.Items;
    potok.Priority := tpNormal;//Устанавливаем приоритет
    potok.Resume;//Запускаем поток
  end;
end;


Это сообщение отредактировал(а) chikistbuch - 1.7.2012, 22:36
PM MAIL   Вверх
Чучмек
Дата 1.7.2012, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



22:
Цитата(chikistbuch @  1.7.2012,  22:27 Найти цитируемый пост)
PostMessage(0, WM_CloseExcel, 0, 0);//закрываем excel после выполнения данной процедуры

Это что? Откуда и зачем? 

27:
Цитата(chikistbuch @  1.7.2012,  22:27 Найти цитируемый пост)
 MessageBox(Application.ActiveFormHandle, 


48:
Цитата(chikistbuch @  1.7.2012,  22:27 Найти цитируемый пост)
MessageBox(Application.ActiveFormHandle,


55-57:
Цитата(chikistbuch @  1.7.2012,  22:27 Найти цитируемый пост)
  ProgressBar.Position:=0;
  ProgressBar.Visible:=true;
  ProgressBar.Max:=kolStrok+round(0.2*kolStrok);

Опять-двадцать пять - или через Synchronize или через PostMessage
81:
Цитата(chikistbuch @  1.7.2012,  22:27 Найти цитируемый пост)
 if i mod 10 = 0 then ProgressBar.Position:=i;

Тудаже

95:
Цитата(chikistbuch @  1.7.2012,  22:27 Найти цитируемый пост)
  maxID[2]:=inttostr(form1.UniQuery2.Fields.Fields[0].AsInteger+1);
 Внимательней

103:
Цитата(chikistbuch @  1.7.2012,  22:27 Найти цитируемый пост)
  ProgressBar.Position:=ProgressBar.Max;

119:
Цитата(chikistbuch @  1.7.2012,  22:27 Найти цитируемый пост)
  ProgressBar.Visible:=false;


130:
Цитата(chikistbuch @  1.7.2012,  22:27 Найти цитируемый пост)
  getDB();
 Что это такое и почему через Synchronize

139,141:
Цитата(chikistbuch @  1.7.2012,  22:27 Найти цитируемый пост)
    potok.ProgressBar:=StatusProgressBar;
potok.hProgressBar:=StatusProgressBar.Handle;
 Либо то либо другое, определись ( ProgressBar+Synchronize или hProgressBar + PostMessage)

143:
Цитата(chikistbuch @  1.7.2012,  22:27 Найти цитируемый пост)
potok.list:=form4.CheckListBox1.Items;
 Так не пойдет
Код

potok.list:=TstringList.Create;
potok.list.text:=form4.CheckListBox1.Items.text;



Это сообщение отредактировал(а) Чучмек - 1.7.2012, 23:07


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
chikistbuch
Дата 1.7.2012, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 15.3.2008

Репутация: нет
Всего: 1



Цитата(Чучмек @  1.7.2012,  23:05 Найти цитируемый пост)
Либо то либо другое, определись ( ProgressBar+Synchronize или hProgressBar + PostMessage)

Дык, вроде бы и так работает. И не post и не Synchronize. Может потому что XE2

getDB(); - это процедура в которой формируется запрос на вывод данных из БД в DBGrid

Это сообщение отредактировал(а) chikistbuch - 1.7.2012, 23:16
PM MAIL   Вверх
Чучмек
Дата 1.7.2012, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Цитата(chikistbuch @  1.7.2012,  23:14 Найти цитируемый пост)
Дык, вроде бы и так работает. И не post и не Synchronize. Может потому что XE2

Работает до  поры до времени.
Одна ветка ЖД и два поезда  - без диспетчера рано или поздно поезда столкнутся.



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
chikistbuch
Дата 1.7.2012, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 15.3.2008

Репутация: нет
Всего: 1



Код

type
   TPotok = class(TThread)
    private
      hProgressBar:Cardinal;
      list: TStringList;
      filename: string;
      UniQuery: TUniQuery;
      procedure loaddata;
     { Private declarations }
    protected
      procedure Execute; override;
end;

const
  PBM_SETPOS = WM_USER+2;
  PBM_SETRANGE32 = WM_USER+6;

var
  potok: TPotok;


Код

procedure TPotok.Execute;
var
  Excel: OleVariant;
  WorkBook, Sheet: Variant;
  i, j, kolKolonok, kolStrok:integer;
  sql, sql_1: string;
  maxID: array [1..2] of string;
  sqlArray: OLEVariant;
  bool:boolean;
begin
  coinitialize(nil);
  try
    Excel := CreateOleObject('Excel.Application');//создаем что-то типа excel
  except
    MessageBox(0, 'MS Excel не найден!'+#13#10+'Для работы программы необходимо установить MS Excel.', 'Внимание!', MB_ICONWARNING or MB_OK);
    exit;
  end;

  Excel.Application.EnableEvents := false;// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
  Excel.DisplayAlerts:=False;//отключаем сообщения excel'я

  WorkBook := Excel.WorkBooks.Open(filename);//открываем файл

  try
    Sheet := Workbook.Sheets.Item[1] //выбираем лист
  except
    MessageBox(0, 'Ошибка!'+#13#10+'Файл MS Excel пуст или поврежден.', 'Внимание!', MB_ICONWARNING or MB_OK);
    exit;
  end;

  kolStrok:=Sheet.UsedRange.Rows.Count;
  kolKolonok:=Sheet.UsedRange.Columns.Count;
  sqlArray:=Sheet.UsedRange.Value; //прочитали все значения в массив

  for i := 1 to kolKolonok do begin //проверяем правильность названия колонок
    j:=0;
    bool:=false;//индикатор совпадения имени

    while (j<list.Count-1) AND (NOT bool) do begin
      if AnsiUpperCase(sqlArray[1,i])=AnsiUpperCase(list.Strings[j]) then begin //если название колонки совпадает с названием колонки в БД
        sqlArray[1,i]:=form1.getAS(sqlArray[1,i], 2);//записали название колонки familia
        bool:=true;
      end;
      j:=j+1;
    end;

    if not bool then begin //если совпадений в названии колонки не найдено
      MessageBox(0, pChar('Ошибка! Неверное название '+inttostr(i)+' колонки: "'+string(sqlArray[1,i])+'".'), 'Внимание!', MB_ICONWARNING or MB_OK);
      exit;//прерываем выполнение кода
    end;
  end;

  if  MessageBox(0, 'Загрузить данные из указанного файла?', 'Внимание!', MB_ICONWARNING or MB_YESNO) = IDNO then exit;//прерываем выполнение кода

  PostMessage(hProgressBar, PBM_SETPOS, 0,0);// Position:=0;
  SetWindowPos(hProgressBar, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); // Visible:=true;
  PostMessage(hProgressBar, PBM_SETRANGE32, 0, kolStrok+round(0.2*kolStrok)); // min max


  UniQuery.SQL.Text:='SELECT MAX(`id`) FROM spisok';//узнали макс id
  UniQuery.Execute;
  maxID[1]:=UniQuery.Fields.Fields[0].AsString;

    sql:='PREPARE excelInsert FROM "INSERT INTO `spisok` ('; //подготавливаем sql запрос на ввод данных

  for i:=1 to kolKolonok do begin
    sql:=sql+'`'+sqlArray[1,i]+'`, ';
    sql_1:=sql_1+'@'+sqlArray[1,i]+', ';//для EXECUTE
  end;
  delete(sql, length(sql)-1, 2);
  delete(sql_1, length(sql_1)-1, 2);//для EXECUTE
  sql:=sql+') VALUES (';

  for i:=1 to kolKolonok do begin
    sql:=sql+'?, ';
  end;
  delete(sql, length(sql)-1, 2);
  sql:=sql+')";';           //подготовили запрос на вставку

  for i := 2 to kolStrok do begin //так как первая строка содержит названия колонок
    if i mod 10 = 0 then PostMessage(hProgressBar, PBM_SETPOS, i,0);// Position:=i;
    for j := 1 to kolKolonok do begin
      if string(sqlArray[i,j])='' then sql:=sql+'SET @'+string(sqlArray[1,j])+' = NULL;'//проверяем не пуста ли строка
        else sql:=sql+'SET @'+string(sqlArray[1,j])+' = "'+string(sqlArray[i,j])+'";';//формируем значения
    end;
  sql:=sql+'EXECUTE excelInsert USING '+sql_1+';';;
  end;

  UniQuery.SQL.Text:=sql;
  UniQuery.Execute; //вставили все значения


  UniQuery.SQL.Text:='SELECT MAX(`id`) FROM spisok';//узнали макс id
  UniQuery.Execute;
  maxID[2]:=inttostr(UniQuery.Fields.Fields[0].AsInteger+1);

  if maxID[1]='' then sql_1:='WHERE id < '+maxID[2] //формируем условие запроса
    else sql_1:='WHERE id BETWEEN '+maxID[1]+' AND '+maxID[2];
  sql:='UPDATE spisok SET data_redaktirovania = "'+FormatDateTime('yyyy:mm:dd',Now())+'" '+sql_1;//выставляем дату редактирования записи
  UniQuery.SQL.Text:=sql;
  UniQuery.Execute;

  PostMessage(hProgressBar, PBM_SETPOS, kolStrok+round(0.2*kolStrok),0);// Position:=0;

  kolStrok:=kolStrok-1; //так как 1 строка - название колонок
  sql_1:=inttostr(kolStrok)[length(inttostr(kolStrok))];//формируем сообщение
  sql:='Загрузка данных выполнена успешно!'+#13#10+'Загружен';

  if (sql_1='1') and (kolStrok<>11) then sql:=sql+'а'
    else sql:=sql+'о';

  sql:=sql+' '+inttostr(kolStrok);
  if (kolStrok>10) and (kolStrok<21) or (sql_1='0') or (sql_1='5') or (sql_1='6') or (sql_1='7') or (sql_1='8') or (sql_1='9') then sql:=sql+' записей.'
    else if sql_1='1' then sql:=sql+' запись.'
      else sql:=sql+' записи.';

  MessageBox(0, PWideChar(sql), 'Внимание!', MB_ICONWARNING or MB_OK);

  SetWindowPos(hProgressBar, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW);// Visible:=false;

  Excel.Quit;  //якобы мы нажимаем на крестик в excel
  Excel:=unassigned;  //походу это нужно писать в паре с Quit (перевод - неназначенный)

  Synchronize(form1.ToolButton1.Click); //хер его знает что (в ToolButton1.Click -> getDB();)
  couninitialize;
end;

procedure TForm1.ToolButton7Click(Sender: TObject);
begin
  form1.OpenDialog1.Filter:='Файлы Excel|*.xls; *.xlsx';
  if form1.OpenDialog1.Execute() then begin
    potok := TPotok.Create(true);// true - после создания класса поток автоматически запущен не будет
    potok.FreeOnTerminate := true;//после завершения кода потока он сразу завершится
    potok.UniQuery:=form1.UniQuery2;
    potok.hProgressBar:=StatusProgressBar.Handle;
    potok.filename := form1.Opendialog1.FileName;

    potok.list:=TstringList.Create;
    potok.list.text:=form4.CheckListBox1.Items.text;

    potok.Priority := tpNormal;//Устанавливаем приоритет
    potok.Resume;//Запускаем поток
  end;
end;


Как-то так
PM MAIL   Вверх
Чучмек
Дата 2.7.2012, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Ну почти.
Цитата(chikistbuch @  1.7.2012,  23:46 Найти цитируемый пост)
sqlArray[1,i]:=form1.getAS(sqlArray[1,i], 2);//записали название колонки familia

В execute не должно быть обращений к чему либо за пределами класса. Либо копируешь содержимое в переменную класса, либо используешь Synchronize.

UniQuery - исключение, компоненты для работы с БД, обычно, потокозащищенные. Но, все равно, нужно(лучше) использовать для каждого потока свой.

Код

type
   TUniQuery=tobject;

   TPotok = class(TThread)
    private
      hProgressBar:Cardinal;
      list: TStringList;
      filename: string;
      UniQuery: TUniQuery;
      procedure loaddata;
     { Private declarations }
    protected
      procedure Execute; override;
    public
      constructor Create(CreateSuspended: Boolean;ProgressBarHandle:cardinal;
        CheckList:TStringList;DataFileName:string;QueryComponent:TUniQuery);
    end;


constructor TPotok.Create(CreateSuspended: Boolean;
  ProgressBarHandle: cardinal; CheckList: TStringList;
  DataFileName: string; QueryComponent: TUniQuery);
begin
 hProgressBar:=ProgressBarHandle;
 List:=TStringList.Create;
 List.Text:=CheckList.Text;
 filename:=DataFileName;
 UniQuery:=QueryComponent;
 inherited Create(CreateSuspended);
end;


...
...
potok := TPotok.Create(true,StatusProgressBar.Handle,form4.CheckListBox1.Items,form1.Opendialog1.FileName,form1.UniQuery2);
potok.FreeOnTerminate := true;
potok.Priority := tpNormal;
potok.Resume;


  

Это сообщение отредактировал(а) Чучмек - 2.7.2012, 00:31


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
northener
Дата 2.7.2012, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(XperT @  1.7.2012,  10:06 Найти цитируемый пост)
Говорим совсем о разном. Попробую объяснить по другому:
При вызове Synchronize, вызывающий поток переходит в состояние suspend, т.е. ему перестает выделятся процессорное время, т.е. он блокируется. 

Тем не менее разговор об одном и том же.  Но давайте перестанем спорить(почти оффтопить) в чужом топике. smile



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
chikistbuch
Дата 2.7.2012, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 15.3.2008

Репутация: нет
Всего: 1



Спасибо, Чучмек, ты мозг!!!
Просто интересно: где ты работаешь и какая зарплата (заработок)???
PM MAIL   Вверх
northener
Дата 2.7.2012, 00:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Чучмек @  1.7.2012,  23:20 Найти цитируемый пост)
Работает до  поры до времени.

+1
А точнее - если в данный момент работает, то это невезение!


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0814 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.