Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
ВнизСменить запятую на точку Найти похожие ветки
← →
ffo © (2006-08-19 20:14) [0]Как при запуске имеющегося файла Excel из моей программы программно установить в этом файле разделителем целой и дробной части точку (по умолчанию стоит как мы знаем в Excel2003 запятая). Ну то есть надо программно выполнить команду (в Excel) Сервис - параметры - международные - убрать галочку "использовать системные разделители" - посавить вместо запятой точку. Да...вот еще что... надо после окончания работы с программой вернуть все обратно (запятую)
← →
Anatoly Podgoretsky © (2006-08-19 20:15) [1](по умолчанию стоит как мы знаем в Excel2003 запятая).
Мы этого не знаем.
← →
AntiUser © (2006-08-19 20:29) [2]Мы этого не знаем. Потому, что по умолчанию она берется из системы, а не в excel"е
Макрос для смены:
With Application
.DecimalSeparator = ":"
.ThousandsSeparator = "."
.UseSystemSeparators = False
End With
Делай выводы.
← →
AntiUser © (2006-08-19 20:31) [3]P.S.
Но это не есть гуд, заниматься такой фигней. В будущем возникнет КУЧА проблем из-за этого, так как у других разделители будут ПРАВИЛНЫЕ, в отличии от твоих.
← →
ffo © (2006-08-19 21:30) [4]
> Но это не есть гуд, заниматься такой фигней. В будущем возникнет
> КУЧА проблем из-за этого, так как у других разделители будут
> ПРАВИЛНЫЕ, в отличии от твоих.
<Задача еще и в том, чтоб при выходе из моей программы вернуть все в исходное (поставить запятую)/I>
← →
ffo © (2006-08-19 21:32) [5]
> Как при запуске имеющегося файла Excel из моей программы
> программно установить в этом файле разделителем целой и
> дробной части точку (по умолчанию стоит как мы знаем в Excel2003
> запятая). Ну то есть надо программно выполнить команду (в
> Excel) Сервис - параметры - международные - убрать галочку
> "использовать системные разделители" - посавить вместо запятой
> точку. Да...вот еще что... надо после окончания работы с
> программой вернуть все обратно (запятую)
Я в Delphi5 работаю !!!
← →
ffo © (2006-08-19 21:36) [6]
> Мы этого не знаем. Потому, что по умолчанию она берется
> из системы, а не в 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
← →
AntiUser © (2006-08-19 21:42) [7]А можно поинтересоваться "Для нормальной работы программы необходимо, чтобы разделителем целой и дробной части чисел была точка", это как?
← →
AntiUser © (2006-08-19 21:43) [8]Что эта программа делает?
← →
ffo © (2006-08-19 22:00) [9]
> А можно поинтересоваться "Для нормальной работы программы
> необходимо, чтобы разделителем целой и дробной части чисел
> была точка", это как?
Программа расчета расхода топива самолета. Проблема здесь
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 22:22) [10]Извините, не понял. А почему бы перед вводом не поменять точку на запятую или я чего-то не понимаю?
← →
AntiUser © (2006-08-19 22:58) [11]Вообще, если я все-таки понял Ваши далеко пространственные объяснения, то Вам, наверное, нужно вот это:
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;
← →
ffo © (2006-08-19 23:39) [12]
> Вообще, если я все-таки понял Ваши далеко пространственные
> объяснения, то Вам, наверное, нужно вот это:
Не то. Мне нужно в Excel-е изменить международные параметры. Смотрите как бы я это делал без моей программы. Я бы запустил Excel, потом нажал Сервис -параметры-международные, потом убрал-бы галочку ИСПОЛЬЗОВАТЬ СИСТЕМНЫЕ РАЗДЕЛИТЕЛИ и в ячейке РАЗДЕЛИТЕЛИ ЦЕЛОЙ И ДРОБНОЙ ЧАСТИ поставил-бы точку, нажал ОК. Вот и все.
Так вот мне эту точку надо поставить из моей программы. То есть сменить запятую на точку перед запуском файла Excel, а потом вернуть все обратно, то есть поставить запятую (но опять же программно).
← →
AntiUser © (2006-08-20 11:55) [13]Ну всё, я пас. Разговор глухо и слепего.
Я понимаю, что Вы хотите сменить системный разделитель, я не понимаю ДЛЯ ЧЕГО. Если Вы программно заполняете 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, а уже затем вставлять число.
Все, это последняя попытка объяснить Вам вашу ошибку. Либо попробуйте ясно сформулировать задачу, при которой обязательно надо сменить разделитель, либо, быть может, Вам поможет кто-нибудь другой.
================
О-о-о-о!!!! Меня осенило!!!! Вы хотите, чтобы при открыти Вашего документа, вместо запятых отображались точки, так?
Вообщем, телепатия какая-то.
← →
Anatoly Podgoretsky © (2006-08-20 12:00) [14]ffo © (19.08.06 23:39) [12]
Не то. Мне нужно в Excel-е изменить международные параметры.
А пользователю это нужно?
← →
ffo © (2006-08-20 14:18) [15]
> Разговор глухо и слепего.
Во блин... Попробую еще проще.
Программа делалась давно и прекрасно работала в 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 14:22) [16]Программа делалась давно и прекрасно работала в Win98 c Офисом-98
Такого офиса в природе не существует, претензии к пиратам.
← →
ffo © (2006-08-20 14:45) [17]
> Разговор глухо и слепего.
Добавил я данные:
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:49) [18]Формат должен соответствовать региональным настройкам, и это касается не только Экселя, но и других приложений. Ты же сам нарушаешь все требования ОС, а код то твой, кто мешает правильно писать.
← →
ffo © (2006-08-20 14:49) [19]
> Программа делалась давно и прекрасно работала в Win98 c
> Офисом-98
Извиняюсь...думаю вы поняли. что 97
← →
ffo © (2006-08-20 14:54) [20]
> Anatoly Podgoretsky
Опытом проверено, что сколько у компьютера пользователей, столько и настроек... поэтому программа должна сделать какие надо, а после завершения все вернуть на место...то есть быть независимой от них.. этого я и добиваюсь
← →
AntiUser © (2006-08-20 15:01) [21]ffo © (20.08.06 14:45) [17]
И тут при работающем Delphi вылезла ошибка НЕЛЬЗЯ УСТАНОВИТЬ СВОЙСТВО КЛАССА NumberFormat КЛАССА Page
Во-первых класса Rage и это правильно, а во-вторых я сейчас ухожу и приду вечером, если будет возможность посмотрю.
← →
Галинка © (2006-08-20 15:15) [22]А нельзяли как то опросить системный разделитель, и при выгрузке в ексель им пользоваться? Т.е. программа считает так, как нравится ей, а в эксель грузится все, так как ему нравится.
← →
Галинка © (2006-08-20 15:16) [23]Ну и версию самого экселя узнавать. Если младше 2003, то не транслировать, если он или старше - транслировать...
← →
Anatoly Podgoretsky © (2006-08-20 15:25) [24]ffo © (20.08.06 14:49) [19]
Нет не понял, я за свое время насмотрелся и на дельфи 5.5 и на Виндоус 96
← →
Anatoly Podgoretsky © (2006-08-20 15:29) [25]ffo © (20.08.06 14:54) [20]
Программа такого делать ни в коем случае не должна, подобного программиста надо сразу увольнять.
← →
Anatoly Podgoretsky © (2006-08-20 15:32) [26]Галинка © (20.08.06 15:16) [23]
Конечно и информация о поддержке содержится в реестре, тот же самый excel.application.x и если поддержаны несколько то можно использовать любой.
Одно делать нельзя - нельзя менять пользовательские настройки, региональные настройки и т.д. за это надо рублем наказывать.
← →
ffo © (2006-08-20 18:09) [27]
> Галинка
Пробую вместо DecimalSeparator := "." послать SendMessage
Вернее не пробую, а разыскиваю параметрвы необходимого сообщения системе
← →
ffo © (2006-08-20 18:27) [28]
> Галинка
Ну давайте тогда стандартные настройки Excel-я установим, поработаем с нашей программой, а потом вернем все в исходное, как было (у пользователей).Только как? В том-то и вопрос.
Мало ли кто и что меняет при работе с Excel. Там люди может под свои нужды подстроили и забыли. На то и дана такая возможность - ставить точку или запятую в окне Международных настроек. Это только Anatoly Podgoretsky всех рублем за это предлогает наказывать, а разработчики Excel как видите думают иначе, позволяя делать так как кому нужно. И это правильно. Стандарты тоже дело наживное... раньше точка была, теперь запятая ... на то мы и астрономы, чтобы думать. Я же не предлогаю делать только как я хочу. Я предлогаю поработать, а потом вернуть в исходное.
Пока думаю так... либо сообщение надо искать в систему на смену системного разделителя перед запуском Excel (а потом сообщение на возврат всего в исходное не зависимо от того, что там было), либо надо инструкцию к программе писать....
← →
vrem (2006-08-20 18:39) [29][28] ffo © (20.08.06 18:27)
Вопрос в другом - такие действия, как описываешь - изменять/восстанавливать настройки действительно необходимо для реализации алгоритма программы твоей? Может программа твоя зарвалась и требует лишнего? как в магазине продавцы пристанут - а трезвы ли вы, а может в трубку подышать. пока соблюдаешь соцправила поведения в магазине можешь хоть смертельно пьяным быть - продавцы должны молчать.
← →
Virgo_Style © (2006-08-20 18:40) [30]собственно, а зачем надо менять?
← →
ffo © (2006-08-20 18:49) [31]
> Может программа твоя зарвалась и требует лишнего?
Лишнего не требует...наоборот надо бы ее расширить, да все времени нет
← →
guav © (2006-08-20 18:51) [32]
> ffo ©
> SHEET.CELLS[3,2].NumberFormat:="000.00";
Таки непонятно, что мешает писатьSHEET.CELLS[3,2].NumberFormat:=Format("000%s00", [XLSeparator]);
, где XLSeparator взять из того св-ва которое отображает соответствующую настройку экселя ?
← →
guav © (2006-08-20 18:54) [33]> SHEET.CELLS[3,2]:="19.65";
Если это число а не текст, то почему не пишется как число ?SHEET.CELLS[3,2]:=19.65;
← →
ffo © (2006-08-20 19:04) [34]
> Таки непонятно, что мешает писать SHEET.CELLS[3,2].NumberFormat:
> =Format("000%s00", [XLSeparator]);
[XLSeparator] у меня нет. Я в Delphi5 работаю. Перешел бы на более познюю версию, да привязан в этой программе к нескольким серьезным комонентам.
← →
guav © (2006-08-20 19:14) [35]> [XLSeparator] у меня нет.
Я не достаточно понятно выразился ?
XLSeparator - переменная строкового или символьного типа которое берётся из св-ва Excel.DecimalSeparator !
Если пользователь екселя требует точку давай точку, если требует запятую давай запятую, подставляя соответствующий разделитель в данные своей программы при необходимости.
← →
ffo © (2006-08-20 20:17) [36]
> XLSeparator
Что я наделал...
Procedure ...
var
XLSeparator:variant;
begin
XLSeparator:= Excel.DecimalSeparator;
SHEET.CELLS[3,2]:="19.65";
SHEET.CELLS[3,2].NumberFormat:=Format("000%s00", [XLSeparator]);
end;
Получил ошибку Format % invalid or incompatible with argument
← →
Anatoly Podgoretsky © (2006-08-20 20:24) [37]ffo © (20.08.06 18:27) [28]
Разработчики думают иначе чем ты, поэтому и вынесли данную настройку в пользовательскик, а программиста, который себя ставит выше пользователя надо наказывать.
Тем более что это глобальные вещи, которые влияют на все экземпляры Экселя.
← →
ffo © (2006-08-20 20:33) [38]
> Anatoly Podgoretsky
Просмотрел все твои ссылки и не нашел ни одной дельной. Одни разглагольствования и призывы к наказанию. Аnatoly Podgoretsky. Не занимал бы ты эфир
← →
Anatoly Podgoretsky © (2006-08-20 20:40) [39]Ну чтож у тебя есть возможность не писать, я даже не буду давать характеристики этой писанине.
Но поговорка Юпитер ты сердишься, значит ты не прав очень верна в твоем случае.
Второй вариант обратиться в персональную службу поддержки, а не в публичный форум.
И не тебе судить о моих ссылках, интеллекта не хватит.
← →
guav © (2006-08-20 20:43) [40]> [36] ffo © (20.08.06 20:17)
> XLSeparator - переменная строкового или символьного типаvar
XLSeparator:string;
begin
XLSeparator:= Excel.DecimalSeparator;
SHEET.CELLS[3,2]:=19.65;
SHEET.CELLS[3,2].NumberFormat:=Format("000%s00", [XLSeparator])
end;
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.05 c