![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сменить запятую на точку [D5]
ffo © (2006-08-19 20:14:00)Как при запуске имеющегося файла Excel из моей программы программно установить в этом файле разделителем целой и дробной части точку (по умолчанию стоит как мы знаем в Excel2003 запятая). Ну то есть надо программно выполнить команду (в Excel) Сервис - параметры - международные - убрать галочку "использовать системные разделители" - посавить вместо запятой точку. Да...вот еще что... надо после окончания работы с программой вернуть все обратно (запятую)
Галинка (2006-08-20 15:16:00) [21]Ну и версию самого экселя узнавать. Если младше 2003, то не транслировать, если он или старше - транслировать...
Галинка (2006-08-20 15:15:00) [22]А нельзяли как то опросить системный разделитель, и при выгрузке в ексель им пользоваться? Т.е. программа считает так, как нравится ей, а в эксель грузится все, так как ему нравится.
AntiUser (2006-08-20 15:01:00) [23]ffo © (20.08.06 14:45) [17]
И тут при работающем Delphi вылезла ошибка НЕЛЬЗЯ УСТАНОВИТЬ СВОЙСТВО КЛАССА NumberFormat КЛАССА Page
Во-первых класса Rage и это правильно, а во-вторых я сейчас ухожу и приду вечером, если будет возможность посмотрю.
ffo (2006-08-20 14:54:00) [24]
> Anatoly Podgoretsky
Опытом проверено, что сколько у компьютера пользователей, столько и настроек... поэтому программа должна сделать какие надо, а после завершения все вернуть на место...то есть быть независимой от них.. этого я и добиваюсь
ffo (2006-08-20 14:49:00) [25]
> Программа делалась давно и прекрасно работала в Win98 c
> Офисом-98
Извиняюсь...думаю вы поняли. что 97
Anatoly Podgoretsky (2006-08-20 14:49:00) [26]Формат должен соответствовать региональным настройкам, и это касается не только Экселя, но и других приложений. Ты же сам нарушаешь все требования ОС, а код то твой, кто мешает правильно писать.
ffo (2006-08-20 14:45:00) [27]
> Разговор глухо и слепего.
Добавил я данные:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Excel97,OleServer,ComObj,AppEvnts, StdCtrls, Grids, Buttons, ExtCtrls,Clipbrd, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Excel:Variant;
end;
var
Form1: TForm1;
implementation
USES ShellAPI;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
CONST
Msg='Вы пытаетесь установить связь с сервером "Microsoft ExcelXP". Этот процесс может занять значительное время.'+#13+' Продолжить?';
VAR
SHEET:Variant;
n:OleVariant;
BegTime:TDateTime;
BEGIN
IF APPLICATION.MessageBox(Msg,'Загрузка Microsoft ExcelXP',MB_YesNO + MB_ICONEXCLAMATION)= IDNO THEN Exit;
BegTime:=Time;//Контроль времени загрузки ExcelXP
//Определяем путь к файлу IShR_ExcelA4.xls, который надо открыть для редактирования
n:=APPLICATION.ExeName;
n:=ExtractFilePath(n);
n:=n+'IShR_ExcelA4.xls';
try
Excel:=CreateOleObject('Excel.APPLICATION')
except
ShowMessage('Нет доступа к серверу "ExcelXP"');
Exit;
END;
Screen.Cursor:=crHourGlass;
//Excel.SheetsInNewWorkbook:=1;// добавляем новую книгу с одним листом
Excel.Workbooks.Open(n,0);
//****************** Добавляем записи в "ЛИСТ1" *******
SHEET:=Excel.Workbooks[1].Sheets[1];//(РАСЧЕТ МАРШРУТА И ТОПЛИВА)
SHEET.Columns.Clear;//очистить предыдущие записи
SHEET.PageSetup.PrintGridLines:=TRUE;// разрешили печать сетки
SHEET.CELLS[2,2]:='Контрольное значение ';
SHEET.CELLS[3,2]:='19.65';
SHEET.CELLS[3,2].NumberFormat:='000.00';
//************************* Добавляем записи в "ЛИСТ2" ******************
SHEET:=Excel.Workbooks[1].Sheets[2];// ссылка на лист
SHEET.Columns.Clear;//очистить предыдущие записи
SHEET.CELLS[6,22]:='67.777';
SHEET.CELLS[6,22].NumberFormat:='000.00';
Screen.Cursor:=crDefault;
Excel.VISIBLE:=TRUE; //Показываем Excel
Label1.Caption:='Время загрузки '+TimeToStr(Time-BegTime);
END;
end.
И тут при работающем Delphi вылезла ошибка НЕЛЬЗЯ УСТАНОВИТЬ СВОЙСТВО КЛАССА NumberFormat КЛАССА Page
Значит дело в формате...
Я в программе заменил все выражения типа
SHEET.CELLS[3,2].NumberFormat:='000.00';
на
SHEET.CELLS[3,2].NumberFormat:='000,00';
Ошибка пропала.
И все бы ничего, но ведь кто то там далеко не перешел на Офис 2003(XP)...
значит теперь ему это не подойдет.
Вот и решил я, что не зависимо от того, что там у них является разделителем моя программа должна сделать разделителем точку, поработать, а при выключении вернуть то, что уних там было (точку или запятую).
Думалось мне, что это можно сделать добавив при загрузке программы
строку команды смены разделителя в системе:
procedure TForm1.FormCreate(Sender: TObject);
begin
if DecimalSeparator = ',' then
begin
if MessageDlg('Внимание !!!'+ #13+#13+
'Для нормальной работы программы необходимо, чтобы разделителем целой и дробной части чисел была точка.'+#13+
'Менять запятую на точку? ',mtWarning,[mbYes,mbNo],0)=mrNO then Abort;
DecimalSeparator := '.';
//DateSeparator:='.';
//ShortDateFormat:='dd.mm.yyyyy';
//ShortTimeFormat:='hh:mm:ss';
end;
end;
Не помогает. Вот и решил я спросить у знающих Хлопцев в интернете.
Кстати, если оставить SHEET.CELLS[3,2].NumberFormat:='000.00',
а в Excele предварительно установить разделителем точку (Сервис- параметры-международные-поставить точку), то все тип-топ.
Ну не писать же мне инструкцию по применеию программы ... хотя возможно придется ... а всего-то надо научиться менять в Excel запятую на точку программно, так же как "Сервис- параметры-международные-поставить точку".
Anatoly Podgoretsky (2006-08-20 14:22:00) [28]Программа делалась давно и прекрасно работала в Win98 c Офисом-98
Такого офиса в природе не существует, претензии к пиратам.
ffo (2006-08-20 14:18:00) [29]
> Разговор глухо и слепего.
Во блин... Попробую еще проще.
Программа делалась давно и прекрасно работала в Win98 c Офисом-98(2000). Там при установке Офиса по умолчанию в Excel-е разделителем является точка.
Теперь пользователи перешли на Офис2003 (XP). Звонят мне и говорят, что из моей программы перестал запускаться Excel. Совсем перестал... виснет программа и все. Я стал разбираться в чем дело.
Вначале решил проверить запускается ли моей программой Excel2003(XP) без вывода туда данных. Для этого на базе основной программы сделал отладочную прораммку просто открытия файла IShR_ExcelA4.xls, лежащего в каталоге программы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Excel97,OleServer,ComObj,AppEvnts, StdCtrls, Grids, Buttons, ExtCtrls,Clipbrd, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Excel:Variant;
end;
var
Form1: TForm1;
implementation
USES ShellAPI;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
CONST
Msg='Вы пытаетесь установить связь с сервером "Microsoft ExcelXP". Этот процесс может занять значительное время.'+#13+' Продолжить?';
VAR
SHEET:Variant;
n:OleVariant;
BegTime:TDateTime;
BEGIN
IF APPLICATION.MessageBox(Msg,'Загрузка Microsoft ExcelXP',MB_YesNO + MB_ICONEXCLAMATION)= IDNO THEN Exit;
BegTime:=Time;//Контроль времени загрузки ExcelXP
//Определяем путь к файлу IShR_ExcelA4.xls, который надо открыть для редактирования (он сущечтвует и у него три листа)
n:=APPLICATION.ExeName;
n:=ExtractFilePath(n);
n:=n+'IShR_ExcelA4.xls';
try
Excel:=CreateOleObject('Excel.APPLICATION')
except
ShowMessage('Нет доступа к серверу "ExcelXP"');
Exit;
END;
Screen.Cursor:=crHourGlass;
//Excel.SheetsInNewWorkbook:=1;// добавляем новую книгу с одним листом
Excel.Workbooks.Open(n,0);
//****************** Добавляем записи в "ЛИСТ1" *******
SHEET:=Excel.Workbooks[1].Sheets[1];//РАСЧЕТ МАРШРУТА И ТОПЛИВА
SHEET.Columns.Clear;//очистить предыдущие записи
SHEET.PageSetup.PrintGridLines:=TRUE;// разрешили печать сетки
//ТУТ БУДЕМ ВЫВОДИТЬ ДАННЫЕ
//************************* Добавляем записи в "ЛИСТ2" ******************
SHEET:=Excel.Workbooks[1].Sheets[2];
SHEET.Columns.Clear;//очистить предыдущие записи
// SHEET.CELLS[6,22]:='Неизменный вес';
// SHEET.CELLS[7,22]:='Груз';
//ТУТ БУДЕМ ВЫВОДИТЬ ДАННЫЕ
Screen.Cursor:=crDefault;
Excel.VISIBLE:=TRUE; //Показываем Excel
Label1.Caption:='Время загрузки '+TimeToStr(Time-BegTime);
END;
end.
Так вот этот прмер мне показал, что Excel прекрасно запускается и видимо причина в тех данных, которые выводятся в файл Excel после его запуска.
Я стал проверять дальше. То есть попробовал выводить данные
Пока проверяете (если хотите конечно) работу этого примера я отойду не на долго, а потом продолжу расказ о своих опытах. О том как я вычислил в чем причина.
Anatoly Podgoretsky (2006-08-20 12:00:00) [30]ffo © (19.08.06 23:39) [12]
Не то. Мне нужно в Excel-е изменить международные параметры.
А пользователю это нужно?
AntiUser (2006-08-20 11:55:00) [31]Ну всё, я пас. Разговор глухо и слепего.
Я понимаю, что Вы хотите сменить системный разделитель, я не понимаю ДЛЯ ЧЕГО. Если Вы программнозаполняете xls-документ, то нет такой задачи, для которой бы было НЕОБХОДИМО сменить разделитель, т.к. тот же разделитель можно поменять в программе. Я пытаюсь Вам объяснить, что у Вас ошибка в определении задачи, Вы поставили перед собой не правильную задачу для решения возникшей у Вас проблемы (сужу исключительно по Вашим постам).
Вы привели некий пример, в котором, даже не вводится дробное число.
Однако предположим, что Вам надо ввести число:
SHEET.CELLS[3,2]:='1965,45';
Тогда, да мы получим его сохраненным в ячейке как текст. Однако, если мы сделаем так:
SHEET.CELLS[3, 2] := StringReplace('1965,45', ',', '.', [rfReplaceAll]);
то тогда все будет чики-пуки. И никаких смен системных разделителей.
Продолжим. Если Вы хотите, что бы при вводе
SHEET.CELLS[3,2]:='1965';
Число в ячейке отобразилость как 1965,00, тогда надо сделать так
SHEET.CELLS[3, 2].NumberFormat := '0,00';
SHEET.CELLS[3, 2] := '1965';
Т.е. сначала назначить NumberFormat, а уже затем вставлять число.
Все, это последняя попытка объяснить Вам вашу ошибку. Либо попробуйте ясно сформулировать задачу, при которой обязательно надо сменить разделитель, либо, быть может, Вам поможет кто-нибудь другой.
================
О-о-о-о!!!! Меня осенило!!!! Вы хотите, чтобы при открыти Вашего документа, вместо запятых отображались точки, так?
Вообщем, телепатия какая-то.
ffo (2006-08-19 23:39:00) [32]
> Вообще, если я все-таки понял Ваши далеко пространственные
> объяснения, то Вам, наверное, нужно вот это:
Не то. Мне нужно в Excel-е изменить международные параметры. Смотрите как бы я это делал без моей программы. Я бы запустил Excel, потом нажал Сервис -параметры-международные, потом убрал-бы галочку ИСПОЛЬЗОВАТЬ СИСТЕМНЫЕ РАЗДЕЛИТЕЛИ и в ячейке РАЗДЕЛИТЕЛИ ЦЕЛОЙ И ДРОБНОЙ ЧАСТИ поставил-бы точку, нажал ОК. Вот и все.
Так вот мне эту точку надо поставить из моей программы. То есть сменить запятую на точку перед запуском файла Excel, а потом вернуть все обратно, то есть поставить запятую (но опять же программно).
AntiUser (2006-08-19 22:58:00) [33]Вообще, если я все-таки понял Ваши далеко пространственные объяснения, то Вам, наверное, нужно вот это:
var
s:string;
Excel:OleVariant;
WorkBook, Sheet: Variant;
begin
s:=ExtractFilePath(ParamStr(0))+'fff.xls';
Excel := CreateOleObject('Excel.Application');
WorkBook := Excel.Application.WorkBooks.Add;
Sheet := WorkBook.WorkSheets[1];
Excel.ActiveWorkBook.Saveas(s ,xlNormal,'','',FALSE, FALSE);
try
SHEET.CELLS[2,2]:='Контрольное значение ';
SHEET.CELLS[3,2]:='1965';
Sheet.Columns[2].Select; // Для всей 2 колонки
SHEET.CELLS[3,2].Select; // Для ячейки
Excel.Selection.NumberFormat:='0,00';
Excel.Application.ActiveWorkbook.Save;
Application.MessageBox(PChar(s),'Окончено.', MB_OK + MB_ICONINFORMATION);
finally
Excel.WorkBooks.Close;
end;
end;
AntiUser (2006-08-19 22:22:00) [34]Извините, не понял. А почему бы перед вводом не поменять точку на запятую или я чего-то не понимаю?
ffo (2006-08-19 22:00:00) [35]
> А можно поинтересоваться "Для нормальной работы программы
> необходимо, чтобы разделителем целой и дробной части чисел
> была точка", это как?
Программа расчета расхода топива самолета. Проблема здесь
SHEET:=Excel.Workbooks[1].Sheets[1];// ссылка на второй лист
SHEET.Columns.Clear;//очистить предыдущие записи
SHEET.PageSetup.PrintGridLines:=TRUE;// разрешили печать сетки
SHEET.CELLS[2,2]:='Контрольное значение ';
SHEET.CELLS[3,2]:='1965';
//Здесь выдается сообщение об ошибке
//В Excel надо установить: Сервис -> Настройка -> Международные -> точка
SHEET.CELLS[3,2].NumberFormat:='000.00';
//Надо так
// SHEET.CELLS[3,2].NumberFormat:='000,00';
Если заранее установить в Excel разделителем точку, то проблем нет, но я не знаю кто будет дальше работать с программой...каждому не объяснишь что и где там надо предварительно настроить.
AntiUser (2006-08-19 21:43:00) [36]Что эта программа делает?
AntiUser (2006-08-19 21:42:00) [37]А можно поинтересоваться " Для нормальной работыпрограммы необходимо, чтобы разделителем целой и дробной части чисел была точка", это как?
ffo (2006-08-19 21:36:00) [38]
> Мы этого не знаем. Потому, что по умолчанию она берется
> из системы, а не в excel'еМакрос для смены:With Application
> .DecimalSeparator = ":" .ThousandsSeparator
> = "." .UseSystemSeparators = FalseEnd WithДелай выводы.
>
Меняю системные настроки перед запуском Excel:
if DecimalSeparator = ',' then
begin
if MessageDlg('Внимание !!!'+ #13+#13+
'Для нормальной работы программы необходимо, чтобы разделителем целой и дробной части чисел была точка.'+#13+
'Менять запятую на точку? ',mtWarning,[mbYes,mbNo],0)=mrNO then Abort;
DecimalSeparator := '.';
//DateSeparator:='.';
//ShortDateFormat:='dd.mm.yyyyy';
//ShortTimeFormat:='hh:mm:ss';
end;
end;
Не помогает!!!!!!11
ffo (2006-08-19 21:32:00) [39]
> Как при запуске имеющегося файла Excel из моей программы
> программно установить в этом файле разделителем целой и
> дробной части точку (по умолчанию стоит как мы знаем в Excel2003
> запятая). Ну то есть надо программно выполнить команду (в
> Excel) Сервис - параметры - международные - убрать галочку
> "использовать системные разделители" - посавить вместо запятой
> точку. Да...вот еще что... надо после окончания работы с
> программой вернуть все обратно (запятую)
Я в Delphi5 работаю !!!
ffo (2006-08-19 21:30:00) [40]
> Но это не есть гуд, заниматься такой фигней. В будущем возникнет
> КУЧА проблем из-за этого, так как у других разделители будут
> ПРАВИЛНЫЕ, в отличии от твоих.
<Задача еще и в том, чтоб при выходе из моей программы вернуть все в исходное (поставить запятую)/I>