Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi

Автор: Pinocchio
Дата сообщения: 09.12.2005 14:17
Farkhad
Тогда лучше объясни зачем тебе фрейм в статистике или где там, и как ты его
загружать собрался? Какими операторами, функциями или методами (чтобы
понять нужны названия)?

Добавлено:
evle
Чем дело закончилось?
Автор: Farkhad
Дата сообщения: 09.12.2005 18:06
vserd
Т.е. последовательность этих действий надо выполнять для каждого пункта меню (нажатие на пункт)?

Н-р,
Users->New
Frame := TFrame2.Create(Self); // TFrame2 фрейм где создается новый юзер
....


User->Show all
Frame := TFrame10.Create(Self); // TFrame10 фрейм где отображаются все юзеры.
Автор: vserd
Дата сообщения: 10.12.2005 17:49
Farkhad
Все зависит от....
Если у тебя одновременно показывается только один фрейм, тогда
нужно будет if assigned(Frame) then FreeandNil(Frame); делать при каждом вызове.
например:
User->Show all
if assigned(Frame) then FreeandNil(Frame);
Frame := TFrame10.Create(Self);
....

Users->New
if assigned(Frame) then FreeandNil(Frame);
Frame := TFrame2.Create(Self); // TFrame2 фрейм где создается новый юзер
....


Если же на экране может быть одновременно несколько фреймов (MDI?). тогда нужно будет отслеживать какой фрейм будет закрываться пользователем, и хранить указатель на него в отдельной структуре (массив, список и т.п.) и удалять/добавлять его по мере надобности, либо уничтожаться в самом фрейме (делать Self.free), но это не очень хорошо с точки зрения "правильности".

Автор: Farkhad
Дата сообщения: 11.12.2005 12:49
vserd

Цитата:
Если у тебя одновременно показывается только один фрейм

да именно так, спасибо!
Автор: Bill_PHO
Дата сообщения: 12.12.2005 12:38
Удается ли кому-нибудь, используя ADOQuery в Delphi7, вытащить в грид больше, чем 4 знака после запятой из колонки типа numeric(18,6) (таблица расположена на MS SQL Server 2000) ?
Автор: ShIvADeSt
Дата сообщения: 13.12.2005 00:48
Bill_PHO

Цитата:
Удается ли кому-нибудь, используя ADOQuery в Delphi7, вытащить в грид больше, чем 4 знака после запятой из колонки типа numeric(18,6) (таблица расположена на MS SQL Server 2000) ?

Попробуй обычный Query вроде я полностью все знаки вытаскивал, причем спокойно. Приходилось потом резать.
Автор: SergeBS
Дата сообщения: 13.12.2005 09:45
Bill_PHO
В ADOQuery идешь в FieldsEditor, выбираешь поле и выставляешь в его свойствах нужный формат отображения. Хоть 10 знаков после точки. Там же и маска ввода.
Автор: Bill_PHO
Дата сообщения: 13.12.2005 10:23
SergeBS

А ты сам это попробовал - или это как бы теоретически?
Практически я сам конечно же это пробовал - ничего не получилось.
Не получается именно через ADO соединение + ADOQuery (через TDatabase+обычный Query - получается).

В Delphi2005/Delphi2006 - это срабатывает, хотя и криво. Ведь речь идет о точном формате числа с каким-то количеством знаков после запятой. А в свойствах Tfields ADOQuery, получается вытащить все знаки (в Delphi2005/2006), если задать тип поля float, а ведь это неточное представление числа, имеющего знаки после запятой. Т.е. хотелось бы вытаскивать точное значение.

Добавлено:
ShIvADeSt

Как же я могу взять данные через обычный Query, если у него нет свойства ADOConnection?
Я так и писал, что через ODBC соединение (через TDatabase+обычный Query) все нормально вытаскивается, а вот через TADOConnection+TADOQuery - нет.

Вообще во всех редакциях Delphi имеется странность в работе с точными числами.
Например, если вы посмотрите отладчиком, как выполняются действия с числами типа Currency, то увидите, что выполняются они на сопроцессоре, то есть преобразуются в плавающий формат и обратно. Может кто может объяснить философию такого поведения. При этом на разных компьютерах можно получить разный результат по причине работы сопросессоров в разных режимах (а это может зависить от наставленного софта. Некоторые программы принудительно переводят сопроцессор в нужный им режим ).

Добавлено:
SergeBS

Используя формат, получишь указанное число знаков после запятой, но значащих из них будет только 4, остальные нули.
Автор: Bill_PHO
Дата сообщения: 14.12.2005 12:25
SergeBS
ShIvADeSt

Спасибо за участие.
Сработало, хотя это и криво, использование свойства ADOQuery - EnableBCD.


Автор: Admin CSB
Дата сообщения: 14.12.2005 13:53
Bill_PHO

Цитата:
Например, если вы посмотрите отладчиком, как выполняются действия с числами типа Currency, то увидите, что выполняются они на сопроцессоре, то есть преобразуются в плавающий формат и обратно.

Если я не ошибаюсь карренси, это по определению вещественное число...
Обычно его обзывают "числовой с фиксированной точкой"
Автор: SergeBS
Дата сообщения: 15.12.2005 07:40
Bill_PHO

Цитата:

Сработало, хотя это и криво, использование свойства ADOQuery - EnableBCD.

Оно по умолчанию true. Так что на будущее: не знаешь - не трогай.
Автор: VC7
Дата сообщения: 15.12.2005 08:42
Bill_PHO


Цитата:
Удается ли кому-нибудь, используя ADOQuery в Delphi7, вытащить в грид больше, чем 4 знака после запятой из колонки типа numeric(18,6) (таблица расположена на MS SQL Server 2000) ?


with ADOQuery1 do
(FieldByName('Num') as TNumericField).DisplayFormat:='###,###.000000 p';
Автор: Bill_PHO
Дата сообщения: 15.12.2005 10:34
SergeBS
Так в том то и дело, что его надо поменять на false.
Я не знал - и не трогал.
Когда оно - true (по умолчанию), то Delphi тянет numeric из базы как Currency (у него нет иного формата для точных чисел), но только с четырьмя знаками после запятой ( у меня поэтому и вытягивалось только 4 знака с округлением) .
А вот если его превести в false, то Delphi тащит его как float, что тоже неприятно, но зато со всеми знаками после запятой.
Вообще получается, что с точными двоично-десятичными числами (когда вам надо иметь больше 4 знаков после запятой и в промежуточных вычислениях) в Delphi штатными средствами нормально манипулировать не получится, вернее не всегда вы получите такой же результат, как на калькуляторе. Более того, даже после написания своей математики для таких чисел, у меня создалось впечатление, что при заталкивании результата в базу и при вытаскивании его обратно происходит преобразование в double, а это может привести к искажению результата, хотя вероятность этого уже не очень высокая.


Добавлено:
Admin CSB

"Currencyis a fixed-point data type that minimizes rounding errors in monetary calculations. It is stored as a scaled 64-bit integer with the four least significant digits implicitly representing decimal places. When mixed with other real types in assignments and expressions, Currency values are automatically divided or multiplied by 10000".

Я ожидал, что если они хранятся как целые, то и арифметика с ними будет точной. Ведь написано, что этот тип данных введен в целях минимизации ошибок округления при выполнении денежных вычислений. А вот на деле ...

А в MS SQL Server Currency - это numeric (18,4) - точное двоично-десятичное число.

Вообще интересно кто и как работает с деньгами, вернее делает денежные вычисления, когда суммы большие и есть операнды с 6 знаками после запятой?
Автор: Pinocchio
Дата сообщения: 15.12.2005 10:56
Bill_PHO


Цитата:
вытаскивании его обратно происходит преобразование в double, а это может привести к искажению результата, хотя вероятность этого уже не очень высокая.


Слушай а как понять:


Цитата:
float { ( n ) }
...
The Microsoft® SQL Server™ float[(n)] data type conforms to the SQL-92 standard for all values of n from 1 to 53. The synonym for double precision is float(53).

real

Floating point number data from –3.40E + 38 through 3.40E + 38. Storage size is 4 bytes. In SQL Server, the synonym for real is float(24).


зы:
поздравляю с декстером.
думаю может десятибайтным бинари экстендед прикрутить как график.
Автор: Bill_PHO
Дата сообщения: 15.12.2005 11:15
Pinocchio

Я раньше не обращал на все это внимания - все как то само собой получалось и работало.
Начал копать поглубже и захотел сделать правильнее - залез в какие-то дебри.
Обнаружил, что еще и сопроцессор работает с currency, то как с float(53) - double, то как с float(64) - extended.
По крайней мере 2 режима я сам увидел причем на похожих машинах, но немного с разным установленным софтом. Какая-то софтина перевела сопроцессор из double в extended. Какая - не выяснял. Естественно при операциях, например умножения, с некоторыми числами получается разный результат в последнем знаке - результат округления.
Автор: Pinocchio
Дата сообщения: 15.12.2005 11:42
Bill_PHO
Ну это думаю регулируется директивами компилятору (когда эмулируешь, то жутко теряешь в скорости на пнях сотых, зато получаешь гарантированный резулт).
А для гарантированного экстендед можно и uniqueidentifier использовать. Он имеет уже 16 байт - типа 6 байт (т.е. 12 букв для сортирования) а в остальные кодируешь байты с экстенда. Если не заморачиваться на неудобоваримости такого представления для sql скриптов и стандартных гридов, то можно иметь именно ту гарантированную точность.
Автор: Z MeZe
Дата сообщения: 15.12.2005 11:47
Подскажите.
Абсолютно (почти) не посвящен в эту проблему. Мне нужно сделать что-то типа БД:
Первая таблица:
1.1 Название (уникальное)
1.2 и т.д.
...
1.х и.т.п.

Вторая таблица:
2.1 Дата
2.2 Название (уникальное) 1.1
2.3 Тип (уникальное)
2.4 и т.д.
...
2.х и.т.п.

Третья таблица (чисто теоретически должна быть связана со Второй, если поле 2.3 там = "1"):
3.1 Год
3.2 Месяц
3.3 Название (уникальное) 1.1
3.4 и т.д.
...
3.н и.т.п.

Четвертая таблица (чисто теоретически должна быть связана со Второй, если поле 2.3 там <> "1"):
4.1 Год
4.2 Месяц
4.3 Название (уникальное) 1.1
4.4 и т.д.
...
4.н и.т.п.
...
1. Если я правильно понимаю, нужно сделать 1-ую таблицу с первичным ключом и все остальные со связью на 1-ую.
2. Не совсем ясно как реализовать 3-ю и 4-ую таблицы (с 3.3 и 4.3 заморочки). В принципе, я сам придумал такое описание таблиц. Может быть есть смысл объединить 3 и 4 (число полей там одинаковое) и цеплять данные по 2-ой таблице.
...
Что вообще-то нужно:
1. Подскажите как это реализовать как можно проще (нужно очччень быстро, чтобы двинуться дальше)
2. Под Дельфи (5).
3. Лучше без привязки к чему-то (Работать должна и на "голых" компах). Присмотрелся к АДО... но что-то как-то вряд ли за неделю забабахаю.
4. Если есть какие-то примеры, буду признателен.
5. И вообще, нужна реализация в деталях, потому что в общем-то на пальцах я представляю что и как. Не знаю просто как вообще организовать БД именно в Дельфи, чтобы и самому в ней лазать и доступна чтобы была.
6. Желательно, чтобы была возможность запросов простеньких.
7. Нужна выгрузка в ТХТ читаемый. (Все будет храниться в ТХТ файлах), Таблицы будут работать во время работы приложения.
8. БД очень маленькая. Скорость доступа/работы не принципиальна (пока ).

Буду очень признателен, если кто-то поможет с проблемой


ЗЫ: а то на Новый Год у Деда Мороза буду вазелин просить
Автор: PowerChute
Дата сообщения: 15.12.2005 12:55
Z MeZe
Есть такая книга "Delphi. Разработка баз данных", где все очень популярно расписано. что и как делать.
Автор: imonah
Дата сообщения: 15.12.2005 13:13
Z MeZe
Прямо вот сидеть и писать тут никто за тебя не будет, как ты понимаешь А вот инфой поделиться могу:
Программирование баз данных в Delhpi
http://www.delphikingdom.com/asp/nets.asp?ItemID=19 - см. внизу страницы, там подробно рассказано об индексах и ключевых полях, то, что тебе понадобится для связывания таблиц.

http://www.delphiworld.narod.ru/_db_.html
Вот тут исчерпывающая инфа о БД, их типах и строении. Расчитано больше на профи, но опять таки, прокрути до конца, там в последних разделах справочная инфа по основам постоения и работы с БД в Delphi.

Автор: Pinocchio
Дата сообщения: 15.12.2005 13:24
Z MeZe
Есть ещё метод - медитация.
Берёшь и представляешь себе вместо базы данных массивы рекордов и списки объектов. Массивы могут быть выборками из базы, а на списки объектов это надо много кода делать (инит, клеар, в базу, из базы, и т.п.).
Когда предмет медитации начинает вырисовываться, кладёшь пальцы на клавиатуру и запускаешь пасьянс.
Автор: Z MeZe
Дата сообщения: 15.12.2005 13:28
PowerChute

Цитата:
"Delphi. Разработка баз данных"

Которая Андрея Сорокина? Нашел, Скачал, обчитаться мне теперь , Спасибо.

imonah

Цитата:
Прямо вот сидеть и писать тут никто за тебя не будет, как ты понимаешь

Хе, фирштейн есссенно.

Цитата:
А вот инфой поделиться могу:

Спасибо, спасибо.



Добавлено:
Pinocchio
шутить, блин, я тоже умею

Цитата:
Есть ещё метод - медитация.
Берёшь и представляешь себе вместо базы данных массивы рекордов и списки объектов. Массивы могут быть выборками из базы, а на списки объектов это надо много кода делать (инит, клеар, в базу, из базы, и т.п.).
Когда предмет медитации начинает вырисовываться, кладёшь пальцы на клавиатуру и запускаешь пасьянс.

Красиво придумано, долго размышлял или руки писали?
Автор: Bill_PHO
Дата сообщения: 15.12.2005 13:46
Z MeZe


Цитата:
Есть ещё метод - медитация.
Берёшь и представляешь себе вместо базы данных массивы рекордов и списки объектов. Массивы могут быть выборками из базы, а на списки объектов это надо много кода делать (инит, клеар, в базу, из базы, и т.п.).
Когда предмет медитации начинает вырисовываться, кладёшь пальцы на клавиатуру и запускаешь пасьянс.

Красиво придумано, долго размышлял или руки писали?


Самое интересное, что это не шутка, а чистая правда.
Пока не вникнешь в саму сущность решаемой задачи, пока не представишь себя на месте этой сущности - как правило, не сделаешь все путем.
Автор: Z MeZe
Дата сообщения: 15.12.2005 13:50

Цитата:
Самое интересное, что это не шутка, а чистая правда.
Пока не вникнешь в саму сущность решаемой задачи - не сделаешь все путем.

Bill_PHO
В ссуть-то я вник,.. мозгов не хватает (пока) реализовать, буду шарить, мож доведу до конца.
...
А медитировать буду потом .
Автор: imonah
Дата сообщения: 15.12.2005 22:42
Pinocchio
Если ничем помочь не можешь, то не городи чушь. Либо помогай, чем можешь, либо не мешай.
(отредактировано)
Автор: Pinocchio
Дата сообщения: 16.12.2005 11:54
imonah
Читай пост:

Цитата:
Самое интересное, что это не шутка, а чистая правда.
Пока не вникнешь в саму сущность решаемой задачи, пока не представишь себя на месте этой сущности - как правило, не сделаешь все путем.

Считаю что уже помог (там где про много кода писать, там без сарказма).
Автор: VC7
Дата сообщения: 16.12.2005 12:13
Z MeZe


Цитата:
2. Не совсем ясно как реализовать 3-ю и 4-ую таблицы (с 3.3 и 4.3 заморочки). В принципе, я сам придумал такое описание таблиц.



Для связи таблиц

DataModule1.Table3.Append;

DataModule1.Table3.Edit;
DataModule1.Table3.FieldByName('3.3').AsInteger:=
DataModule1.Table1.FieldByName('1.1').AsInteger;
DataModule1.Table2.Post;

Для вывода

with DataModule1.Table3 do
begin
Active:=False;
Filter:='3.1='+DataModule1.Table1.FieldByName('3.3').AsString;
Filtered:=True;
Active:=True;
end;


Цитата:
6. Желательно, чтобы была возможность запросов простеньких.

Для написания используй компонент Query со вкладки BDE

Пример
Select * from Имя таблицы


Цитата:
7. Нужна выгрузка в ТХТ читаемый. (Все будет храниться в ТХТ файлах), Таблицы будут работать во время работы приложения.


var F: TextFile;
begin
AssignFile(F,'Имя файла.txt'); //-создаем файл
Rewrite(F); // - переписываем его
Writeln(F,'+---+-------+-------------------+--------+');
with DataModule1.Table1 do
begin
DisableControls;
First;
while not EOF do
begin
Write(F,'|');
Write(F,' '+FieldByName('Имя поля').AsString);
Writeln(F,'|');
Next;
end;
CloseFile(F);
EnableControls;
end;

З.Ы. Дерзай все в твоих руках
Автор: Z MeZe
Дата сообщения: 16.12.2005 12:29
VC7
Спасибо.

Цитата:
Для написания используй компонент Query со вкладки BDE

Вообще-то не хотелось BDE,.. хотя...
Ну, в общем-то, очень даже прилично.
Спасибо
Автор: vserd
Дата сообщения: 16.12.2005 13:27
1-я таблица
ID
Название
и.т.п.

2-я таблица
ID
ID из первой
Вторая таблица:
2.1 Дата
2.3 Тип (уникальное)
2.4 и т.д.
...
2.х и.т.п.


Третья таблица (чисто теоретически должна быть связана со Второй, если поле 2.3 там = "1"):
ID
ID из второй
3.1 Год
3.2 Месяц
3.4 и т.д.
...
3.н и.т.п.

Четвертая таблица (чисто теоретически должна быть связана со Второй, если поле 2.3 там <> "1"):
ID
ID из второй.
4.1 Год
4.2 Месяц
4.4 и т.д.
...
4.н и.т.п.

т.е. убирай всю дублирующуся информацию, в противном случае при обновлении будешь получать бяку.
Если третья и четвертая таблица одинаковы по структуре, храни данные в одной, возможно добавишь какой-либо признак.
получать выборку будешь примерно так:
это тертья таблица
Select t3.*, t1.name from table3 t3, table1 t1, table2 t2
where (t2.тип = 1) and (t2.id=t3.id из второй) and (t2.id из первой = t1.id)
это четвертая таблица

Select t3.*, t1.name from table3 t3, table1 t1, table2 t2
where (t2.тип <> 1) and (t2.id=t3.id из второй) and (t2.id из первой = t1.id)
Автор: Z MeZe
Дата сообщения: 16.12.2005 14:03
vserd
Ясно, спасибо.
Но дело в том, что теоретически (в голове, на бумаге ...), я представляю всю структуру, все связи, всю БД.
Проблема в том, что руки коряво подточены под Дельфи... Вот собсснноо и все.
Я бы живую реализацию посмотрел бы.
Где делать, как делать.

В принципе, описание БД можно жестко обозначить (динамически структура изменятся пока не будет) (НО ГДЕ И КАК ).
Сразу же обозначить все связи (ключи, признаки ...) (НО ГДЕ И КАК )
А заполнять таблицы уже в программе или подгружать.

Возможно ли вообще СОЗДАТЬ структуру БД один раз, а далее ей пользоваться?
Можно ли ее (структуру) таскать за собой и в рабочем виде держать на других "голых" компах?
Автор: SergeBS
Дата сообщения: 16.12.2005 15:25
Z MeZe

Цитата:

Но дело в том, что теоретически (в голове, на бумаге ...), я представляю всю структуру, все связи, всю БД.

Не представляешь. Мне только один раз понадобилось, чтобы в зависимости от поля выбиралась таблица. И то - исключительно по причине лени, а сроки жали. А у тебя, как я понял, ВСЕ таблицы так связаны. А так просто не бывает.
Мой тебе совет: если относишься к своему проекту сколько-нибудь серьезно, то лучше найди рядом кого-нибудь, кто уже проектировал базы данных. И с ним уже общайся на предмет и теории и практики. Иначе научишься делать неправильно, а потом долго и печально будешь переучиваться.
Просто по твоему посту видно - СУБД не занимался. Особенно это по вопросам видно.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Вероятность одинакового CRC32


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.