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

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 960
от 21.10.2007, 09:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 459, Экспертов: 66
В номере:Вопросов: 3, Ответов: 10


Вопрос № 105490: Добрый день, ВСЕМ! У меня возникла проблема с отображением связанных полей в таблице DBGrid. Суть такова: Есть реляционная БД. Есть в ней две таблицы - в первой список товаров на складе в 2 столбца (tovar_id, tovar), где tovar_id - связующее поле...
Вопрос № 105504: Подскажите пожалуйсто Можно ли через вариантный массив (VarArrayCreate) передать в Word таблицу целиком, вместо записи данных в каждую ячейку поочередно. Хочется следующего аналога, только для Word:...
Вопрос № 105511: Здравствуйте Эксперты. Помогите разобраться с таким вопросом: в дельфи есть функция Random();. Как заставить её генерировать значения в интервале [-5..+5]. Спасибо. ...

Вопрос № 105.490
Добрый день, ВСЕМ!
У меня возникла проблема с отображением связанных полей в таблице DBGrid. Суть такова: Есть реляционная БД. Есть в ней две таблицы - в первой список товаров на складе в 2 столбца (tovar_id, tovar), где tovar_id - связующее поле с таблицей справочником по товарам; tovar - код товара (LongInt) , во второй таблице справочник по товарам в 2 столбца (tovar_id, name_tovar), где tovar_id - счетчик, name_tovar - название товара (String). Теперь создаем ADOTable, DataSource и таблицу DBGrid. ADOTable связываем с БД, DataSource связываем с ADOTable, DBGrid связываем с DataSource. В ADOTable указываем таблицу со списком товаров. DBGrid показывает 2 столбца - в первом tovar_id в виде цифры, во втором tovar тоже в виде цифры. А надо, чтобы было название товара. Как это сделать? Только стандартными средствами Дельфи. Редактируя поля в таблице, таблицы БД должны меняться. Если можно, на примерчике.
Отправлен: 15.10.2007, 09:39
Вопрос задал: Alex446 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Drbear
Здравствуйте, Alex446!

Попробуйте использовать ADOQuery примерно такого вида:
select tab1.tovar_id, tab1.tovar, tab2.tovar_id, tab2.name_tovar
from tab1INNER JOIN Таблица2 ON tab2.tovar_id = tab2.tovar_id
where тра-ля-ля1

DataSource связываете с ADOQuery, в DBGrid указываете необходимые поля отображения
можно изменить строку select, оставив только необходимые поля (tab1.tovar, tab2.name_tovar)
Ответ отправил: Drbear (статус: 2-ой класс)
Ответ отправлен: 15.10.2007, 10:26
Оценка за ответ: 5
Комментарий оценки:
Спасибо за ответ, Drbear, все нормально заработало. Правда, учитывая, что связывать надо сразу несколько таблиц, запрос получился достаточно сложный. Но все работает, а как правильно, то время покажет.

Отвечает: Алексей Акишин
Здравствуйте, Alex446!
Создаешь AdoTable2 и Datasourse2, связываешь их и второй таблицей (справочником) аналогично первому AdoTable1.
Проверь подключение .
Затем правой кнопкой мыши на AdoTable1 выбираешь Fields Editor. В появившемся окне правой кнопкой выбираешь New Field:
- name - имя поля;
- type - тип поля (ставишь String);
- field type выбираешь Lookup.
Lookup definition:
- key Field - tovar;
- dataset - таблица со справочником (AdoTable2);
- lookup keys - tovar_id;
- result field - name_tovar.
После этого жмешь ОК. Должно появиться новое поле, в котором будет отображаться name_tovar при условии tovar=tovar_Id.
Если возникнут вопросы или найдешь ошибки пиши в минифорум.
---------
Что бы ни делать - лишь бы ничего не делать!
Ответ отправил: Алексей Акишин (статус: 3-ий класс)
Ответ отправлен: 15.10.2007, 10:38
Оценка за ответ: 5
Комментарий оценки:
Спасибо за ответ, Алексей Акишин, тоже получилось все нормально. Не пришлось мучиться со сложными запросами, так как связывать в реале приходится сразу множество таблиц, и запросы при этом получаются сложные. Единственное НО! После создания дополнительного поля в AdoTable, перестают добавляться и удаляться строки в таблицах, этому мешают дополнительные добавленные поля. Если отобразить такие поля в DBGrid, то они становятся редактируемыми даже когда таблица DBGrid разрешена только на просмотр. А это не есть хорошо....


Вопрос № 105.504
Подскажите пожалуйсто
Можно ли через вариантный массив (VarArrayCreate) передать в Word таблицу целиком, вместо записи данных в каждую ячейку поочередно.
Хочется следующего аналога, только для Word:

Приложение:

Отправлен: 15.10.2007, 11:02
Вопрос задал: Degtyarev Anton (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Drbear
Здравствуйте, Degtyarev Anton!

можно использовать Rng.ConvertToTable('->');

создается текст из нескольких строк с разделителями, но нужно, чтобы разделитель заведомо не встречался в данных. Вот примерный код:

var
Rng: Variant;
...
Rng := App.Selection.Range;
Rng.Collapse(wdCollapseEnd);
Rng.InsertAfter('тра,ля,ля');
Rng.InsertParagtaphAfter;
Rng.InsertAfter('тру,лю,лю');
Rng.InsertParagtaphAfter;
...
Rng.ConvertToTable(',');

кстати Paragtaph можно вставить сразу в массив.
если есть ошибки, извините, сейчас негде проверить.
Ответ отправил: Drbear (статус: 2-ой класс)
Ответ отправлен: 15.10.2007, 11:26
Оценка за ответ: 5
Комментарий оценки:
Спасибо выглядит как оптимальный вариант для Word хотя конечно с Exel по скорости не сравнится


Вопрос № 105.511
Здравствуйте Эксперты. Помогите разобраться с таким вопросом:
в дельфи есть функция Random();. Как заставить её генерировать значения в интервале [-5..+5]. Спасибо.
Отправлен: 15.10.2007, 12:16
Вопрос задал: MIXAIL (статус: Посетитель)
Всего ответов: 7
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Gh0stik
Здравствуйте, MIXAIL!

Вам достаточно пойти таким путем:

var i,k:integer;
begin
...
randomize;
k:=random(11)-5;
writeln(k);
...
end;


Таким подходом (random(11)-5) вы получите нужный результат.
Еслинемного доработать код, то можно выводить числа из отрезка [-n; +n].

Вот код:
const n=7;
var k:integer;
begin
...
randomize;
k:=random(2*n+1)-n;
writeln(k);
...
end.


Good Luck!!!
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Профессор)
Украина, Славянск
Организация: Славянский государственный педагогический университет (Кафедра алгебры)
ICQ: 289363162
----
Ответ отправлен: 15.10.2007, 12:30
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Всё оказалось очень просто!!!

Отвечает: Delph
Здравствуйте, MIXAIL!

(10 * Random - 5) - даст вещесвенный результат в диапазоне [-5..+5]. С помощью функций Trunc (отсечение дробной части) и Round (округление до ближайшего целого) результат можно привести у целому типу.

После запуска программы нужно хотя бы раз запустить процедуру Randomize, иначе значения Random будут повторяться.
---------
Сомневайся во всём! Реальность часто бывает не такой, как мы о ней думаем.
Ответ отправил: Delph (статус: Студент)
Ответ отправлен: 15.10.2007, 12:30
Оценка за ответ: 5
Комментарий оценки:
Тоже вариант. Правда посложней.

Отвечает: Omickron
!!!
Здравствуйте, MIXAIL!

Достаточно просто:
x:=Random(11)-5;
Только предварительно нужно вызвать инициализацию генератора случайных чисел - Randomize;

Ответ повторный (см. ответ эксперта Gh0stik)
-----
∙ Отредактировал: Denisss (Профессионал)
∙ Дата редактирования: 15.10.2007, 20:19
Ответ отправил: Omickron (статус: 5-ый класс)
Ответ отправлен: 15.10.2007, 14:12
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Разобрался!!!

Отвечает: Виктор Пырлик
Здравствуйте, MIXAIL!

Вот процедурка, которая это делает.
переменным a и b присваеваем граничные значения [a,b]
а переменной f случайное число из этого диапазона


procedure TForm1.Button1Click(Sender: TObject);
var a,b,f:integer;
begin
a := StrToInt(Edit1.Text);
b := StrToInt(Edit2.Text);
Randomize;
f := RandomRange(a,b);
Label1.Caption := IntToStr(f);
end;


---------
Если ничего не помогло - надо читать инструкцию
Ответ отправил: Виктор Пырлик (статус: Практикант)
Ответ отправлен: 15.10.2007, 16:11
Оценка за ответ: 5
Комментарий оценки:
Интересно!!! Попробую!!!

Отвечает: PM_pilot
!!!
Здравствуйте, MIXAIL!
RandomRange(MinVal, MaxVal);

Ответ повторный (см. ответ эксперта Виктор Пырлик).
-----
∙ Отредактировал: Denisss (Профессионал)
∙ Дата редактирования: 15.10.2007, 20:20
Ответ отправил: PM_pilot (статус: 1-ый класс)
Ответ отправлен: 15.10.2007, 19:45
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Разобрался!!!

Отвечает: Владик
!!!
Здравствуйте, MIXAIL!
Random(-1;1)*Random()*5
Random(-1;1) - случайное число из двух чисел

Ответ не верный - не правильно используются стандартные функции. (Random(-1;1) и Random(-1;1) - ошибки).
Смотрите предыдущие ответы!!!

-----
∙ Отредактировал: Gh0stik (Профессор)
∙ Дата редактирования: 16.10.2007, 08:36
Ответ отправил: Владик (статус: 1-ый класс)
Ответ отправлен: 16.10.2007, 07:56
Оценка за ответ: 5
Комментарий оценки:
Спасибо.

Отвечает: Genia007
Здравствуйте, MIXAIL! Насколько я знаю, функция Random генерирует только положительные числа, при этом если после функции нет числа, то генерируются числа от 0 до 1, а при наличие Random(x), числа от 0 до Х-1. По вашему вопросу непонятно какие числа Вам нужны (только целые или вместе с вещественными), поэтому предлагаю свой код, который генерирует целые и вещественные числа в интервале [-5,5]. Код нормально работает, если нужно только целые числа, его не трудно упростить.

Приложение:

Ответ отправил: Genia007 (статус: 1-ый класс)
Ответ отправлен: 16.10.2007, 10:08
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Разобрался.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.61.1 от 16.10.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное