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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2011, 15:39   #11
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

В общем пусть напишет, как открывает или создает документ и какая версия Word используется, а то может уже использует TWordApplication тогда все гораздо проще, а еще лучше пусть часть кода покажет.

Последний раз редактировалось Aliens_wolfs; 05.07.2011 в 15:43.
Aliens_wolfs вне форума Ответить с цитированием
Старый 06.07.2011, 08:05   #12
a_n_n_a
Форумчанин
 
Регистрация: 06.03.2009
Сообщений: 157
По умолчанию

У меня Word 2007, но сохраняю все в формате 2003.
А вообще ситуация такая: вот создает пользователь док-т №1111-А_Акт Toyota Mark II_Акт осмотра, который автоматом сразу сохраняется под таким именем.
Но были ситуации, когда пользователь, создав этот документ, его не закрыл, но решил напечатать точно такой же, т.е. с таким же именем.
Вот мое сохранение и ругается, что не пожет сохранить док-т, т.к он используется.
Я хотела исключить такую ситуацию, и проверить не открыт ли док-т, и предупредить пользователя.
Цитата:
Word:= CreateOleObject('Word.Application') ;
Word.Visible:= True;
k:=ExtractFilePath(Paramstr(0));
Word.Documents.Open(k+'Шаблоны\'+'A kt_2');
PutToWrd('СтранаИзг', Form4.dbEdit71.Text);
PutToWrd('ГодВып', Form4.dbEdit72.Text);
PutToWrd('цвет', Form4.dbEdit75.Text);
PutToWrd('Кузов', Form4.dbEdit73.Text);
Word.ActiveDocument.SaveAs(k+'Задан ия и договоры\'+'№'+DBEdit2.Text+DBEdit1 43.Text+'_'+DBEdit69.Text+' '+DBEdit70.Text+'_Акт осмотра');
a_n_n_a вне форума Ответить с цитированием
Старый 06.07.2011, 11:21   #13
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Но были ситуации, когда пользователь, создав этот документ, его не закрыл, но решил напечатать точно такой же, т.е. с таким же именем.
Что, прям файл с точно таким же именем и в той же папке? Бред. Просто разграничте права на доступ к папке. Если программа создает документ, то делает это с правами "админ", а если пользователь, то папка "только для чтения" или вообще скрыта. А проще навести порядок с папками и не иметь таких проблем вовсе. Что пользователю делать в папке, в которую сохраняет программама?
Sibedir вне форума Ответить с цитированием
Старый 06.07.2011, 11:38   #14
a_n_n_a
Форумчанин
 
Регистрация: 06.03.2009
Сообщений: 157
По умолчанию

Так программа сохраняет док-ты для пользователя, предполагается, что из нее он будет перемещать док-т, как ему угодно.
А имя точно такое же, т.к. есть заказ с номером и маркой авто, эти данные заносятся в имя файла, папка для сохранения тоже одна и та же всегда. У одного заказа имя файла не будет менятся.
a_n_n_a вне форума Ответить с цитированием
Старый 06.07.2011, 12:41   #15
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Да я не пойму зачем создавать файл с именем, которое уже есть. Что, другой заказ с тем же номером и авто что-ли? Зачем вообще пользователю вручную создавать файл, который может создать программа? Или зачем программно создавать файл, если его уже вручную создали?
ППниПП:
Это всеравно что наливать воду в стакан из под куллера, в который уже налили ее из под крана.

a_n_n_a, блин, ну не могу я понять логики такой работы. Если есть программа по созданию файлов, то скажите пользователям, чтобы они пользовались именно ей, а доступ к папке им, как пользователям, закройте.

---------------------------------
Или на худой конец добавляйте к имени дату и время создания

Последний раз редактировалось Sibedir; 06.07.2011 в 12:45.
Sibedir вне форума Ответить с цитированием
Старый 06.07.2011, 12:55   #16
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

У вас папка общая для сохранения документов и она находится на вашем компьютере, и эта программа на Delphi только у вас или все ее пользуются по сети?

Еще можно пойти таким путем

//Проверить на занятость файла
Код:
function ApplicationUse(fName: string): boolean;
var
  HFileRes: HFILE;
begin
  HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  Result := (HFileRes = INVALID_HANDLE_VALUE);
  if not Result then CloseHandle(HFileRes);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Word: OleVariant;
k: string;
Doc: string;
begin
//Ваш код
Word:= CreateOleObject('Word.Application') ;
Word.Visible:= True;
k:=ExtractFilePath(Paramstr(0));
Word.Documents.Open( Format('%sШаблоны\A kt_2', [k]) );
PutToWrd('СтранаИзг', Form4.dbEdit71.Text);
PutToWrd('ГодВып', Form4.dbEdit72.Text);
PutToWrd('цвет', Form4.dbEdit75.Text);
PutToWrd('Кузов', Form4.dbEdit73.Text); 
// Название Вашего документа
Doc := format('%sЗадания и договоры\№%s%s_%s %s_Акт осмотра',[k, DBEdit2.Text,
DBEdit143.Text, DBEdit69.Text, DBEdit70.Text]);
//Проверяем открыт ли документ, если да, то закрываем его, если нет, то сохроняем
if ApplicationUse(doc + '.doc') then then
Word.ActiveDocument.close
else
Word.ActiveDocument.SaveAs(Doc);
end;

Последний раз редактировалось Aliens_wolfs; 06.07.2011 в 13:35.
Aliens_wolfs вне форума Ответить с цитированием
Старый 06.07.2011, 13:23   #17
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

А можно и так

Код:
//Функция для проверки открыт ли документ
function ViewDoc(Doc: string): boolean;
var
  i: Integer;
  Word: OleVariant;
begin
result:= false;
  try
    Word := GetActiveOleObject( 'Word.Application' );
      for i := 1 to Word.Documents.Count do
     //Проверяем какой документ открыт
       if pos(AnsiLowerCase(Doc), AnsiLowerCase(Word.Documents.Item(i).Name))<>0 then begin
        result:= true;
       break;
      end;
  except
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Word: OleVariant;
k: string;
Doc: string;
begin
//Ваш код
Word:= CreateOleObject('Word.Application') ;
Word.Visible:= True;
k:=ExtractFilePath(Paramstr(0));
Word.Documents.Open( Format('%sШаблоны\A kt_2', [k]) );
PutToWrd('СтранаИзг', Form4.dbEdit71.Text);
PutToWrd('ГодВып', Form4.dbEdit72.Text);
PutToWrd('цвет', Form4.dbEdit75.Text);
PutToWrd('Кузов', Form4.dbEdit73.Text); 
// Название Вашего документа
Doc := format('%sЗадания и договоры\№%s%s_%s %s_Акт осмотра',[k, DBEdit2.Text,
 DBEdit143.Text, DBEdit69.Text, DBEdit70.Text]);
 //Проверяем открыт ли документ, если да, то закрываем его, если нет, то сохроняем
 if ViewDoc(doc) then
 Word.ActiveDocument.close
 else
Word.ActiveDocument.SaveAs(Doc);
end;

Последний раз редактировалось Aliens_wolfs; 06.07.2011 в 14:57.
Aliens_wolfs вне форума Ответить с цитированием
Старый 06.07.2011, 14:28   #18
a_n_n_a
Форумчанин
 
Регистрация: 06.03.2009
Сообщений: 157
По умолчанию

Aliens_wolfs, спасибо, получилось))
Только, когда документ не открыт, при его составлени появляется ошибка: 'Операция недоступна', ругается на строку
Код:
Word := GetActiveOleObject( 'Word.Application' );
a_n_n_a вне форума Ответить с цитированием
Старый 06.07.2011, 14:37   #19
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Когда не с проекта а с EXE запустите ошибки не будет, там перехватчик ошибки работает в функции ViewDoc except в проекте будет без проекта нет. Либо выше код попробуйте с ApplicationUse

Еще можно так попробовать без Word := GetActiveOleObject( 'Word.Application' );
а общий Word: OleVariant;

Код:
//общий
var
Word: OleVariant;
  Form1: TForm1;

implementation

{$R *.dfm}

//Функция для проверки открыт ли документ
function ViewDoc(Doc: string): boolean;
var
  i: Integer;
begin
result:= false;
      for i := 1 to Word.Documents.Count do
     //Проверяем какой документ открыт
       if pos(AnsiLowerCase(Doc), AnsiLowerCase(Word.Documents.Item(i).Name))<>0 then begin
        result:= true;
       break;
      end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
k: string;
Doc: string;
begin
//Ваш код
Word:= CreateOleObject('Word.Application') ;
Word.Visible:= True;
k:=ExtractFilePath(Paramstr(0));
Word.Documents.Open( Format('%sШаблоны\A kt_2', [k]) );
PutToWrd('СтранаИзг', Form4.dbEdit71.Text);
PutToWrd('ГодВып', Form4.dbEdit72.Text);
PutToWrd('цвет', Form4.dbEdit75.Text);
PutToWrd('Кузов', Form4.dbEdit73.Text); 
// Название Вашего документа
Doc := format('%sЗадания и договоры\№%s%s_%s %s_Акт осмотра',[k, DBEdit2.Text,
 DBEdit143.Text, DBEdit69.Text, DBEdit70.Text]);
 //Проверяем открыт ли документ, если да, то закрываем его, если нет, то сохроняем
 if ViewDoc(doc) then
 Word.ActiveDocument.close
 else
Word.ActiveDocument.SaveAs(Doc);
end;

Последний раз редактировалось Aliens_wolfs; 06.07.2011 в 14:52.
Aliens_wolfs вне форума Ответить с цитированием
Старый 06.07.2011, 14:56   #20
a_n_n_a
Форумчанин
 
Регистрация: 06.03.2009
Сообщений: 157
По умолчанию

Все работает))))) Спасибо всем большущие!!!))))
a_n_n_a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
офис 2003 или офис 2010 -открыт документ valerij Microsoft Office Excel 3 14.05.2011 11:02
нужно узнать, открыт ли документ под Excel или OO Calc mjr27 Microsoft Office Excel 1 05.04.2011 00:26
ccылка на документ word voldemen HTML и CSS 3 29.04.2010 14:05
Открыть документ WORD Maxx Microsoft Office Excel 0 15.02.2010 17:37
Не открывается документ Word komar73 Microsoft Office Word 3 30.05.2009 22:17