Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

За 2004-04-16

Re: [VC++] нормальный rand

Hello Havoc,

H> Доброго времени суток, многоуважаемый ALL.

H> Люди, может кто подскажет как написать функцию, котороя выдавала бы
H> случайные числа, распределенные по нормальному закону?

Используем центральную предельную теорему: суммируем много случайных
величин, неважно как распределенных, и получаем величину с нормальным
(гауссовым) распределением.

double r = 0;
for (int i = 0; i < 12; i++) r += rand(); // суммируем
r -= (double) RAND_MAX / 6; // а это чтобы центр в нуле был

   2004-04-16 19:28:03 (#127254)

Re[2]: импорт Exelевской таблицы.

Здарова, Олег Кузьмин!

15 апреля 2004 г., четверг, 16:15:00 (GMT+05:00), пришел ко мне
почтальон Почкин и всучил письмо с пометкой "импорт Exelевской таблицы.",
в котором сообщалось следующее:

>> Для этого можно воспользоваться технологией OLE. В справке к Делфи
>> неплохо описана. При желании информацию можно поискать в интернете.
>>
ОК> Я конечно посмотрю, но на самом деле мне хотелось немного другое. Я хотел
бы
ОК> скопировать экселевскую таблицу в свою БД, и там с ней работать средствами
ОК> Дельфи. А при использование OLE ведь прийдётся обходиться средствами exel?
ОК> Мне этих средств не хватит. Если бы я мог обойтись средствами exel я не
ОК> писал бы свою программу...

Я как-то ради интереса написал такую штуку xls->db (писал под
конкретную xls-ку). Тормозит само формирование таблицы (ну для 5 тыс. строк,
я так думаю, не будет так заметно, я тестировал на 65000 - было
несколько минут) да вообще это был мой самый первый опыт работы с
базами, пусть знающие люди подправят если что криво сделано и можно
пооптимизированне, получение содержания файла xls происходит
мгновенно.

==Начало Unit1.pas==
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComObj, ComCtrls, Excel97, Db, DBTables, Grids, DBGrids;

type
TForm1 = class(TForm)
Button6: TButton;
DBGrid1: TDBGrid;
Table1: TTable;
Query1: TQuery;
DataSource1: TDataSource;
Button1: TButton;
Button2: TButton;
StatusBar1: TStatusBar;
procedure Button6Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ProgressBar1: TProgressBar;
var v:variant;

implementation

{$R *.DFM}

type
TCellPos = record
Row,
Col: integer;
end;

function GetLastCell(sh: variant): TCellPos;
const
xlLastCell = 11;
var
range: Variant;
begin
range:=sh.Cells.SpecialCells(xlLastCell);
Result.Row:=range.Row;
Result.Col:=range.Column;
range:=Unassigned;
end;

procedure TForm1.Button6Click(Sender: TObject);
const sql_='INSERT INTO employee.db ' +
'(Number, Item_Name, Cost_YE, Cost_RU, Warranty, Shop, ' +
'Number2, Item_Name2, Cost_YE2, Cost_RU2, Warranty2, Shop2, ' +
'Number3, Item_Name3, Cost_YE3, Cost_RU3, Warranty3, Shop3, ' +
'Number4, Item_Name4, Cost_YE4, Cost_RU4, Warranty4, Shop4) ' +
'VALUES ( ';
var excel,workbook,sheet,IRange:variant;
Values:OLEVariant;
{maxSheet,iSheet,}maxColumns,iColumns,maxRow,iRow:integer;
GTK,GTK2,GTK3:DWORD;
tmp,sql:string;
begin
excel:=CreateOleObject('Excel.Application');
try
GTK2:=GetTickCount;
//workbook:=excel.Workbooks.Open('D:\!!!!!!!!!NADO\_tomilov\комп_2.xls');
workbook:=excel.Workbooks.Open('D:\!!!!!!!!!NADO\_tomilov\Копия Прайс Электрон.xls');
//workbook:=excel.Workbooks.Open('D:\!!!!!!!!!NADO\_tomilov\Прайс Электрон.xls');
GTK2:=GetTickCount-GTK2;
try
GTK3:=GetTickCount;
sheet:=workbook.Worksheets.Item[2];
IRange:=sheet.UsedRange;
maxRow:=IRange.Rows.Count;
maxColumns:=IRange.Columns.Count;
Values:=IRange.Value;
GTK3:=GetTickCount-GTK3;

ProgressBar1.Max:=maxRow;
Table1.Active:=false;
Query1.sql.Clear;

GTK:=GetTickCount;
for iRow:=1 to maxRow do
begin
sql:=sql_+IntTostr(iRow)+' , ';

for iColumns:=2 to maxColumns do
begin
try
tmp:=Values[iRow,iColumns];
except
tmp:='';
end;
if (iColumns=2) or (iColumns=5) or (iColumns=6) or
(iColumns=8) or (iColumns=11) or (iColumns=12) or
(iColumns=14) or (iColumns=17) or (iColumns=18) or
(iColumns=20) or (iColumns=23) or (iColumns=24)
then tmp:='"'+tmp+'"'
else if tmp='' then tmp:='0';
if iColumns=24
then sql:=sql+tmp+' ) '
else sql:=sql+tmp+' , ';
end;
try
Query1.UnPrepare;
Query1.sql.Text:=sql;
Query1.Prepare;
Query1.ExecSQL;
except
end;
if iRow mod 250=0 then
begin
ProgressBar1.Position:=iRow;
Application.ProcessMessages;
end;
end;
table1.TableName:=ExtractFilePath(ParamStr(0))+'employee.db';
Table1.Active:=true;
GTK:=GetTickCount-GTK;
ShowMessage(IntTostr(GTK2)+' '+IntTostr(GTK3)+' '+IntTostr(GTK));
finally
IRange:=Unassigned;
Values:=Unassigned;
sheet:=Unassigned;
workbook:=Unassigned;
end;
finally
excel.Quit;
excel:=null;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var sql:string;
begin
Table1.Active:=false;
if not FileExists('employee.db') then
begin
Query1.UnPrepare;
sql:='CREATE TABLE "employee.db" '+
'( Number SMALLINT, Item_Name CHAR(50), Cost_YE NUMERIC(20,20), Cost_RU
NUMERIC(20,20), '+
'Warranty CHAR(15), Shop CHAR(50), '+

'Number2 SMALLINT, Item_Name2 CHAR(50), Cost_YE2 NUMERIC(20,20),
Cost_RU2 NUMERIC(20,20), '+
'Warranty2 CHAR(15), Shop2 CHAR(50), '+

'Number3 SMALLINT, Item_Name3 CHAR(50), Cost_YE3 NUMERIC(20,20),
Cost_RU3 NUMERIC(20,20), '+
'Warranty3 CHAR(15), Shop3 CHAR(50), '+

'Number4 SMALLINT, Item_Name4 CHAR(50), Cost_YE4 NUMERIC(20,20),
Cost_RU4 NUMERIC(20,20), '+
'Warranty4 CHAR(15), Shop4 CHAR(50), '+

'PRIMARY KEY (Number))';
Query1.sql.text:=sql;
Query1.Prepare;
Query1.ExecSQL;
end;
table1.TableName:=ExtractFilePath(ParamStr(0))+'employee.db';
Table1.Active:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
var sql:string;
begin
Table1.Active:=false;

Query1.UnPrepare;
Query1.sql.Clear;
sql:='INSERT INTO employee.db ' +
'(Number, Item_Name, Cost_YE, Cost_RU, Warranty, Shop) ' +
'VALUES (1, "CD", 5, 150, "No", "" )';

Query1.sql.Text:=sql;
Query1.Prepare;
Query1.ExecSQL;
Query1.UnPrepare;
sql:='INSERT INTO employee.db ' +
'(Number, Item_Name, Cost_YE, Cost_RU, Warranty, Shop) ' +
'VALUES (2, "CD", 5, 150, "No", "" )';
Query1.sql.Text:=sql;
Query1.Prepare;
Query1.ExecSQL;

table1.TableName:=ExtractFilePath(ParamStr(0))+'employee.db';
Table1.Active:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
{while not (csDesigning in ComponentState) do
begin
Application.ProcessMessages;
sleep(10);
end; }
ProgressBar1:=TProgressBar.Create(StatusBar1);
ProgressBar1.Parent:=StatusBar1;
ProgressBar1.Align:=alClient;
ProgressBar1.Left:=0;
ProgressBar1.Width:=1024;
ProgressBar1.Smooth:=true;
ProgressBar1.Height:=18;
end;

end.
==Конец Unit1.pas==

==Начало Unit1.dfm==
object Form1: TForm1
Left = 202
Top = 113
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object DBGrid1: TDBGrid
Left = 0
Top = 0
Width = 688
Height = 433
Align = alClient
DataSource = DataSource1
TabOrder = 1
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style = []
end
object Button6: TButton
Left = 650
Top = 84
Width = 33
Height = 25
Caption = 'Button6'
TabOrder = 0
OnClick = Button6Click
end
object Button1: TButton
Left = 570
Top = 82
Width = 45
Height = 25
Caption = 'Create'
TabOrder = 2
OnClick = Button1Click
end
object Button2: TButton
Left = 616
Top = 84
Width = 33
Height = 25
Caption = 'Add'
TabOrder = 3
OnClick = Button2Click
end
object StatusBar1: TStatusBar
Left = 0
Top = 433
Width = 688
Height = 19
Panels = <
item
Width = 1024
end>
SimplePanel = False
end
object Table1: TTable
DatabaseName = 'DefaultDD'
Left = 116
Top = 106
end
object Query1: TQuery
Left = 152
Top = 106
end
object DataSource1: TDataSource
DataSet = Table1
Left = 188
Top = 110
end
end
==Конец Unit1.dfm==

   Томилов Александр 2004-04-16 19:07:12 (#127234)

Re: импорт Exelевской таблицы.

Олег Кузьмин пишет:

>>Насколько я знаю excel позволяет сделать экспорт в dbf. Эту dbf-ку можно
>>открыть из Делфи и работать с ней. Такой вариант устроит?
>>
>>
>>
>В принципе да. Я и забыл про такое простое решение :). А какие ещё есть
>варианты?
>
>P.s.: А средствами дельфи нельзя xls конвертнуть в dbf? Я пишу программку
>для обработки прайсов, и как-то негоже заставлять пользователя пересохранять
>свой файл в dbf. Пока что это не критично, но всё же...
>

1. Есть такой Gnumeric, он идет под GPL. Вот возми его исходник и
посмотри, как они импортируют экселевские файлы.
2. Не раз нарывался на маленькие утилиты импорта-экспорта, тоже под GPL.
Поищи в гугле и посмотри исходники.

   2004-04-16 10:42:52 (#126770)

Re: PalmOS] hacks

15 Апрель 2004 06:18, Sad Spirit написал:
>
> [PalmOS] hacks в смысле взлома программ или в смысле т.н резидентных прог
> под Палм Ос??
>

Второе. Только вот с понятием "резидентных" я не согласен.

PS. Ломает тот кто не не умеет писать. А с другой стороны: "чукча не читатель

- чукча писатель" :)
Номер выпуска : 2860
Возраст листа : 207 (дней)
Количество подписчиков : 385
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/126730
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

   2004-04-16 09:10:09 (#126730)

Re: импорт Exelевской таблицы.

> Насколько я знаю excel позволяет сделать экспорт в dbf. Эту dbf-ку можно
> открыть из Делфи и работать с ней. Такой вариант устроит?
>
Импортировал из excel в dbf. И хочу сказать, что не настолько уж это просто
сделать.
Там кучу условий необходимо выполнить. Информация может потеряться, так как
в dbf заносятся только значения, которые видны на экране, для этого надо
столбцы Excel делать как можно шире, если в ячейке забита формула, тоже
проблема может возникнуть, так как знак деления может быть воспринят как
слеш, если есть записи на русском языке (а в прайсе они должны быть), то
опять же возникает проблема со шрифтами.
Эти все проблемы надо решать до импорта в dbf. И скорее всего пользователю.
Или макрос писать, да?

так что наверное всё же с OLE будет попроще.
А вообще PHP хорошо работает с Excel. Может попытаться импорт в базу
написать на PHP?

C уважением, Бурляев Вячеслав
Номер выпуска : 2859
Возраст листа : 207 (дней)
Количество подписчиков : 387
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/126681
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

   2004-04-16 07:05:42 (#126681)

Re[2]: импорт Exelевской таблицы.

15 апреля 2004 г. от кого-то с адреса bamn***@r*****.ru, не без помощи сервера
localhost; (IP )мне в ящик свалилось какое-то непонятное письмо по теме "импорт
Exelевской таблицы.", на что через осмысливания я решил высказаться:

>> Насколько я знаю excel позволяет сделать экспорт в dbf. Эту dbf-ку можно
>> открыть из Делфи и работать с ней. Такой вариант устроит?
>>
ОК> В принципе да. Я и забыл про такое простое решение :). А какие ещё есть
ОК> варианты?
Тебе же говорили - OLE. Объясняю, тебе не нужно обрабатывать данные с помощью
OLE, тебе нужно _вытащить_ данные с помощью OLE, ну а дальше делай с ними
что
хочешь...

   LinFor 2004-04-16 03:58:20 (#126654)