Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сменить запятую на точку [D5]


Страницы:   1 2 3

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>


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо