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

Delphi - проблемы и решения

  Все выпуски  

Проблемы и решения в Delphi #12


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Проблемы и решения в Delphi - выпуск 12 от 6.04.2001.


Не все то золото, что
в землю зарывают. . .

ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС


Доброго Вам времени суток уважаемый читатель.

Хочу заметить, что многие, задающие вопросы начали повторяться.
Поэтому настоятельно рекомендую прежде, чем спрашивать, заказать
себе список всех вопросов с ответами, указав в теме письма 'VSEVOPR'
(если только Вы на 100% не уверены в иcключительности своего вопроса).

Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Еще о WinApi.
2. Начинаем публиковать отвеченные вопросы.
3. Лучший ответ последнего выпуска.
4. Очередные вопросы.
5. Ищу подельника.
~~~~~~~~~~~~~~~~~~~
1. Еще о WinApi.
----------------
Все окна приложений управляются различными функциями WinApi через
свои дескрипторы. Поэтому неплохо бы знать как их получать.
Рассмотрим функцию FindWindow.

FindWindow(CN,WN:PChar): HWnd;
CN - имя класса.
WN - имя окна(Caption), если = nil, то ищется любое окно этого класса.

Функция возвращает дескриптор окна или 'nil' при неудачном поиске.

- (с.8) Для определения имени класса чужого приложения воспользуйтесь,
поставляемой с Delphi, программой WinSight 32 через Spy\Find
Window. Лучше иметь только нужное окно в этот момент.


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

var h : hwnd;
begin
h:=FindWindow('SciCalc','Калькулятор');
end;

Есть еще одна функция позволяющая определять дескриптор окна.

GetNextWindow(h:hwnd,c:word):hwnd;

h - окно от которого вести отсчет.
с = GW_HWNDNEXT - искать следующее окно.
c = GW_HWNDPREV - искать предыдущее окно.

Если окна не находится, то возвращается 0.

А еще можно считать заголовок окна(и потом по нему искать хендл).

GetWindowText(h:hwnd,str:PChar,kol:word):integer;

str - строка куда считывать.
kol - количество символов.

Ну, и в следующий раз посмотрим как же управлять нашими и не
нашими окошками и на этом завершим.


2. Начинаем публиковать отвеченные вопросы.
-------------------------------------------


Вопрос 1:

От: anton

Скажите как в Delphi написать поцедуру имитации форматирования диска.Чтобы
винт звенел.


Ответить.

Ответ 1:
Из своей практики я знаю, что 'звенит' винт когда
уже совсем плохой. Но определенный шум при форматировании
все-же есть. Характерен он тем, что периодически
происходит монотонная(одна и таже) работа. Это
приводит, в некоторых случаях, к резонансу плохо
закрепленных частей и тоже - 'звону'.

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

Ответ 2:

А зачем это вам???? :-(

Ответ 3:

Напиши простенькую прогу с интерфейсиком в который вставь
примитивную бегущую полоску (индикатор с процентиками, щас не
вспомню как по аглицки звучит).
А во время бега полоски индикатора, постоянно записывай и стирай на
винт маленькое файла с какой-либо лабудой. При этом твой винт будет
издавать шум. Лично я на Delphi (мой любимый язык программирования)
такие проги не катал, но у меня есть
подобная прога на Паскале (писал под Дос). Она лежит в аттаче.
Тока в ней какая-то проблема, но в общем идея рабочая (сам
проверял).

От автора рассылки : кому нужна прога в теме укажите 'Fgdt.pas'.

Ответ 4:
Можно создать напр. пустой файл и в цикле в него че нить писать ;-)
Sam
Ответ 5:
насчет советов про запись/стирание маленького файла:
Я пробовал такое делать, но винт не шуршал постоянно из-за КЭШа.

Вопрос 2:

От: Andrei Bejenari

У меня такой вопрос: как сделать, чтобы какая-то
процедура выполнялась отдельной нитью (thread)?
Если можно, приведите, пожалуйста, какой-нибудь
небольшой пример.


Ответить.

Ответ 1:
Это достаточно сложный и опасный механизм, но если
Вы действительно хотите им пользоваться, то начать
нужно с описания класса TThread.
Можно конечно пользоваться API Windows, но проблем
будет намного больше, особенно при использовании VCL.
Ответ 2:
Работа с потоками = это такой же "опаcный и сложный механизм" как и
работа с комбоБАКСом :) Достаточно просто почитать хелп и заглянуть в
экзампл ".......\Delphi5\Help\Examples\Prgrsbar\" Главное при работе с
объектом VCL использовать Synchronize, тогда никаких проблем не будет.

"Miracle" <miracle@netto.ru>


Вопрос 3:

От: serg

Возможно ли сделать так, чтобы фоном объекта класса TRichEdit был
рисунок.



Ответить.

Ответ 1:

Именно с TRichEdit врядли.

Ответ 2:

Попробуй поиграться с Canvas RichEdit'а. Сам не пробовал.


Вопрос 4:

От: Nertis

Как запустить и управлять внешней программой
из DELPHI?
С уважением Паша.



Ответить.

Ответ 1:
Запустить достаточно просто. Например

ShellExecute(h,'open','my.exe',nil,nil,SW_RESTORE).

А управлять - достаточно растяжимое понятие.
Используя хендлер запущенного окна можно посылать
ему стандартные Windows сообщения.



Вопрос 5:

От: bubnoffdan

Здравствуйте. Как быстро и просто сохранить результат запроса
в DBF файл? Заметил, что при некорректном завершении
программы, в рабочем каталоге остаются файлы вида
XXX_sql.dbf, а как этого добиться программно?
С уважением,
Даниил.



Ответить.

Ответ 1:

Для этого можно использовать сам SQL. Например, добавим в
таблицу qqq.dbf из таблицы qqq1.dbf все поля:

INSERT INTO qqq.dbf *
SELECT *
FROM qqq1.dbf

Ответ 2:
var
MyQuery: TQuery;
...

with MyQuery do begin
SQL.Clear;
SQL.Add( 'SELECT ..... ' );
SQL.Open;

// сохранить результат SQL-запроса

DbiMakePermanent(handle, 'temp.db',true);


Вопрос 6:

От: Eldar

Здравствуйте! я начинаюший программер и я бы хотел посоветоваться с
вами с чего лучше начинать работать в Дельфи, если можно скинтье для
примера проги, также хочу попросить вас скинуть адреса в Инете где
лучше взять обучалки по Дельфи. Заранее благодарен вам.


Ответить.

Ответ 1:
Есть два принципиально разных приема изучения. Первый -
это классический, когда человек берет книжки посвещенные изучению
Delphi(в принципе чего угодно) и планомерно их штудирует.
Второй - это изучение по мере необходимости, т.е. когда Вам нужна
программка Вы изучаете только то, что касается написания программы.
Конечно, первый прием правильнее, но времени он жрет очень много.

Из ссылочек посмотрите эти :

http://delphi.mastak.ru/
http://www.zarech.ru/develop/Consult/Default.asp
http://delphi.vitpc.com/
http://www.rxlib.com/
http://www.chat.ru/~z_ol/links.htm

для начала думаю Вам хватит покопаться. Тем более
там масса ссылок еще.
Ответ 2:
http://www.soobcha.com/ - сообщество чайников
Ответ 3:
Сайт для программистов http://programming.dax.ru
Delphi, VB, CPP и многое другое.
Здесь вы не только найдете примеры, советы. Здесь можно и обучаться
как начинающим программистам, так и продвинутым. Опытные
учителя-ведущие ответят на все ваши вопросы, возникающие по ходу
изучения.


Вопрос 7:

От: Алексей Малиновский

Здраствуйте программисты!
У меня вопрос по БД. Есть файл БД набранный в Excel, а имено очень
большой список товаров с ценами др. информацией в виде таблицы. Так вот
вопрос: можно ли как-нибудь програмно переписать данные в свою БД
(Paradox), и как это сделать?


Ответить.

Ответ 1:
Не подключался программно к Excel ни разу, но сам Excel
умеет через 'сохранить как' преобразовывать данные в формат DBF
или в текст. А оттуда уже нет проблем. Это если нужно срочно
и одноразово. А так, может быть подписчики помогут.
Ответ 2:
Есть один здоровский component - TXLS....
Может читать-писать в xls даже если самого Excela нет на машине.
Если интересует - пришлю
А так кажется есть на Torry Delphi Page
Ответ 3:
Через OLE не пробовал (вкладка Servers VCL)? Откраваешь Excel как
сервер, затем открываешь нужные документ, считываешь информацию и программно
заносишь ее в БД.
Ответ 4:
Можно, используя например доступ к Excel по OLE.

Экселовский ОЛЕ-объект называется "Excel.Application".
Создав его в своей программе можно затем обращаться к свойствам
экселовских объектов, описание которых можно найти в хелпе к офису и
его бейсику.
Так например если переменная Excel это созданный ОЛЕ-объект
"Excel.Application", то конкретная таблица открывается как
Excel.Workbooks.Open(<ИмяФайла>)
Лист в таблице оактивизируется как
Excel.Worksheets(<ИмяЛиста>).Select()
в конкретную ячейку попасть можно через
Excel.activesheet.cells(<НомерСтр>,<НомерКол>)
а получить значение оттуда через
Excel.activesheet.cells(<НомерСтр>,<НомерКол>).value
При этом если мы в Excel.Visible присвоим 1, то эксельное окошко
визуализируется.
Заканчивать работу нужно через
Excel.Quit()
Ответ 5:
Excel имеет свой драцвер ODBC. Надо создать alias на
ваш Excel файл и можно работать как с обычной базой данных...
Ответ 6:
Я пробовал сохранять как DBF, но ентод Excel с кодировкой чето путает и в итоге вместо наших родных знакомых буковок
белиберда получается. Я решил эту проблему так сохранил как текстовый файл а тот туда уже программно загнал в
Парадох
P.S. Может извращение, но зато быстро и нажедно :-)))
Ответ 7:
Приведу похожий пример из личной практики
(в данном случае к Excel обращаюсь с помощью OLE,
а вместо Paradox используется Interbase)

procedure TfmMain.btConvertClick(Sender: TObject);
var
e, b, s: Variant;
i: Integer;
Temp,
Temp2: String;
excel_rows_count: Integer;
begin
e := CreateOleObject('Excel.Application');
b := e.workbooks.open('drive:\path\filename.xls');
s := b.worksheets[1];
e.visible := true;
excel_rows_count := 488;

for i := 1 to excel_rows_count do
begin
Temp := s.cells[i, 1].value;
Temp2 := s.cells[i, 2].value;
ispInsert.Params[0].AsString := Temp + '/' + Temp2;
ispInsert.ExecProc;
end;
itrDatabase.CommitRetaining;
end;
Ответ 8:
День добрый! Это легко организуется с помощью DCOM :

var XLApp, XLSheet : Variant;

{ Активизация OLE-объекта }
try
XLApp := CreateOLEObject('Excel.Application');
except
Memo1.Lines.Add('Ошибка инициализации OLE-сервера');
end;

{ Активизация Sheet-объектов }
try
XLApp.WorkBooks.Open(<Имя_файла>);
XLSheet :=
XLApp.WorkBooks[<Номер_книги_с_единицы>].WorkSheets[<номер_страницы>];
except
Memo1.Lines.Add('Ошибка загрузки документа.');
end;

//. работа с файлом Excel, например :
// <Переменная>:=XLSheet.Cells[<номер_строки>,<номер_столбца>];

{ Завершение работы с файлом }
try
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts:=false; // не показывать сообщение Excel
XLApp.Quit;
end;
except
end;
Ответ 9:
Нуууу дык ето надо бы вопросик по конкретнее, а ежели так , на
вскидку:
Кидаешь на форму два TTable и TDataBase,
Database1.DataBaseName:='MySBase'
Database1.DriverName:={либо AliasName выбрать экселовский драйвер}
Database1.open
Database1.directory:=
Table1.DatabaseName:='MySBase'
Table1.TableName:={имя файла}
Table1.open
Затем тоже для вторых номеров , но Database2.DriverName:={нужный вам
формат} и имя ей другое.
Table2.FieldDefs:=Table1.FieldDefs
Table2.IndexDefs:=Table1.IndexDefs
и копируйте себе на здоровье....
Не забудьте Table2.CreateTable {создать файл}

Все выше описанное конечно очень круто #:\ вот только ODBC драйвера у
меня работать не хотят в упор, поэтому извини , но проверить не могу .
Ежели у вас тоже , то вместо первых номеров можно поюзать сомпоненту
XLSReadWrite

Вопрос 8:

От: fedorenkov

Запускаю из Delphi пакетный файл
ShellExecute(Application.MainForm.Handle,nil,
StrPCopy('MY_PROG.BAT',PFileName),StrPCopy(Params,PParams),
StrPCopy(MyDir,pDir), SW_SHOWMINIMIZED);
Как после завершения его работы закрыть оставшееся DOS-кое окно
из Delphi . Момент завершения работы DOS программы в Delphi известен.
С уважением Александр .


Ответить.

Ответ 1:
Для того, чтобы окошко закрылось, достаточно поставить галочку в
свойствах *.pif файла этого пакетного файла - MY_PROG.pif : закрывать окно
после завершения работы.
Ответ 2:
В конце пакетного файла поставь команду EXIT.


Вопрос 9:

От: dabadabiabo

Здравствуйте!
Возможно ли сделать так, чтобы работающую программу небыло видно в
панели задач? (if "да" then begin " как?" end)
Дмитрий.


Ответить.

Ответ 1:
Если речь идет только о панели задач, то очень просто :

Form1.hide; // скрыть
Form1.show; // показать

Ответ 2:
По внимательней! Не Form1.hide; а так:
procedure TMainForm.FormShow(Sender: TObject);
begin
ShowWindow(Application.Handle,SW_HIDE);
end;


Вопрос 10:

От: Alex

Здравствуйте, а вы не знаете как можно запустить одну программу в окне
другой, так что-бы строка заголовка запускаемой программы была скрыта
???


Ответить.

Ответ 1:
Только как COM объект, и то только если есть у него
соответствующие свойства и методы.

Вопрос 11:

От: Roman Shaporenko

Здравствуйте!
Мне хотелось бы опубликовать свойства в потомке TForm и использовать их в
инспекторе объектов.
Проблема в том, как показать свойства в инспекторе.



Ответить.

Ответ 1:
Описать их в published
Ответ 2:
Вариант1:
Создаешь свой класс, потомок от TForms:

TMyForm = class(TForm)
public
...
published
property MyProperties: <тип> read FMyProperties write FMyProperties;
end;
...

Вариант2:
заходишь в unit Forms и редактируешь класс TForm, т.е. добавляешь нужное свойство (см. выше)
Ответ 3:
Все свойства, объявленные в разделе Published будут в
инспекторе объектов. Если же нужны какие то
специфические методы их редактирования то надо будет
писать свой Property Editor для них
Ответ 4:
Я уже решил эту проблему, всего лишь
навсего зарегистрировал
потомка от TForm:

procedure Register;
begin
RegisterCustomModule(TfrmRelate, TCustomModule);
end;

где TfrmRelate=class(TForm), и обязательно в том же модуле. И не надо
править модуль Forms,
а при других вариантах published-свойства всё равно не видны.


Вопрос 12:

От: Westa

Добрый день!
У меня такой вопрос. Можно ли сделать такой запрос SQL, чтобы данные
группировались по разным значениям одного параметра. Например, вывести
табличку, в которой было бы подобное:
зарпалата < 1000 - 15 человек
< 2000 - 38 человек
< 3000 - 10 человек

Заранее благодарю, Евгения :)


Ответить.

Ответ 1:
Ты можешь воспользоваться группировкой с приведением нужного параметра
с помощью математических преобразований, к примеру:

SELECT
'ОТ '||TO_CHAR(ROUND (ZAPRLATA/1000)*1000) ||
' ДО '||TO_CHAR(ROUND (ZAPRLATA/1000)*1000 + 1000) AS xInterval,
COUNT(*) AS xQuantity
FROM SCHEMA.TABLE
GROUP BY ROUND (ZAPRLATA/1000)

при этом записи будут группироваться по числам 0, 1, 2 и т.д.

Ответ 2:
Я бы сделал так (вообще я на фоксе пишу, но думаю, что с SQL везде
должно быть одинаково):

* ранжируем работников
* ф-ция range()присваивает определенное значение (ранжирует)
SELECT fld_1, fld_2, range(fld_salary) as range FROM tab1 INRO CURSOR tmp

* теперь просто группируем по рангу
SELECT SUM(1) as count FROM tmp GROUP BY range INTO TABLE rez

Ответ 3:
Сложного тут ничего нет.
Есть скажем табличка zarplata с фамилиями и суммами.
Создаем табличку с диапазонами зарплат
diapazon
(name, min, max)
'<1000', 0, 999
'<2000' 1000, 2000

И запрос:
Select d.name, count(*)
From zarplata z,
diapazon d
Where z.summa between (d.min and d.max)
Group by d.name
Ответ 4:
А как передавать параметры?
Если они статические, то лучше написать SP


...
FOR SELECT COUNT(ID_PERSON) FROM SALARY
WHERE AMOUNT<=1000
INTO :QTY
DO BEGIN
SUSPEND;
END

FOR SELECT COUNT(ID_PERSON) FROM SALARY
WHERE AMOUNT>1000 AND ANOUNT <=2000
INTO :QTY
DO BEGIN
SUSPEND;
END
...

а если их заранее неизвестно (как обычно бывает), то либо
1. делаем TMP таблицу, куда скидываем параметры, а затем из SP их читаем и формируем запрос
2. на клиенте динамически формируем SQL
SELECT COUNT (ID_PERSON) FROM SALARY
WHERE AMOUNT>0 AND AMOUNT<=1000
UNION ALL
SELECT COUNT (ID_PERSON) FROM SALARY
WHERE AMOUNT>1000 AND AMOUNT<=2000
UNION ALL
SELECT COUNT (ID_PERSON) FROM SALARY
WHERE AMOUNT>2000 AND AMOUNT<=3000

и так далее

Ответ 5:
select "<1000", count(*) from table1 where zarplata<1000
union
select "<2000", count(*) from table1 where zarplata<2000 and zarplata>1000
union
select "<3000", count(*) from table1 where zarplata<3000 and zarplata>2000
Ответ 6:
Воще-то, по элементарному SQL книжек - не счесть. Ну, ладно, барышне поможем:
SELECT DepartmentID, count(PersonID)
FROM staff
GROUP BY DepartmentID
Предполагается, что staff - таблица, в которой человек (PersonID) связан с отделом, в котором он работает (DepartmentID).
В списке выбора (это то, что идёт сразу после SELECT) - только поля, по которым идёт группировка или агрегирующие функции (сумма,
среднее, количество, наибольшее-наименьшее...)

1. Пишется функция (в среде СУБД), которая определяет какому
диапазону принадлежит значение параметра. На выходе функции долно быть
либо одно число, либо строка, например: "0:100", "100:200" ...
2. По значению этой функции проводится группировка.
3. По значению другого параметра проводится статистика.
Ответ 7:
Select Diappazon([Price]) as Diap, Count(Tovar) as Count_Tovar
from Preiskurant
group by Diappazon([Price]);
Ответ 8:
Можно, для этого нужно использовать
предложение group by.
Например, для Вашего примера

select count(*),
зарплата(имя_поля)
from имя_таблицы
group by зарплата;

count(*) - считает количество записей,
сгруппированных по зарплате.
Ответ 9:
SELECT count(TableName.FieldName),'1000' as NewFieldName
FROM TableName
WHERE TableName.FieldName<'1000'
UNION SELECT count(TableName.FieldName),'2000' as NewFieldName
FROM TableName
WHERE TableName.FieldName<'2000'
UNION SELECT count(TableName.FieldName),'3000' as NewFieldName
FROM TableName
WHERE TableName.FieldName<'3000'

Вопрос 13:

От: Westa

А еще вот такой вопрос. Вы можете объяснить, что такое текстовый
файл и чем он отличается от типизированного?
Спасибо, Евгения :)


Ответить.

Ответ 1:
Отличаются они способом доступа к данным. Объявляя файл того
или иного типа Вы для себя решаете как потом будете писать и читать
из файла, а так же позиционироваться в нем.
Например,типизированный файл можно объявить как имеющий тип данных
запись и далее работать с таким файлом будет намного удобней нежели
с текстовым, заботясь потом где какие данные у вас лежат.
Ответ 2:
Типизированный файл, это файл с элементами одинаковой
длины:

Var f:File of Word

Здесь, каждый элемент файла 2 байта, и можно
читать/писать сразу тот элемент что надо:

seek(f, 10) - переход к десятому элементу

Текстовый файл - имеет элементом строку переменной
длины, и его можно читать только построчно, переход к
произволдьной строке невозможен


Вопрос 14:

От: Sergey V. Alpatov

Можно ли средствами Delphi создать полупрозрачную форму?


Ответить.

Ответ 1:
Полупрозрачную форму создать можно ;-))
Я бы мог расписать полностью алгоритм, но раз задаешь такой вопрос, то
вряд ли сможешь реализовать алгоритм. Поэтому поищи какой-нибудь
компонент - наверняка есть, например на www.torry.net
Ответ 2:
Загляни на http://delphi.vitpc.com <http://delphi.vitpc.com>
Там можно найти заметку Антона Григорьева
"Окно с изменяемой степенью прозрачности."

Исходный текст кода:
<http://delphi.vitpc.com/treasury/sample/smtransp.zip>
http://delphi.vitpc.com/treasury/sample/smtransp.zip
<http://delphi.vitpc.com/treasury/sample/smtransp.zip>
Еще А. Григорьев создал библиотеку FormRgn
(создание окон непрямоугольной формы; изменяемая прозрачность).
Посмотри:
http://delphi.mtu-net.ru/library <http://delphi.mtu-net.ru/library>
Очень удобные компоненты. Там же можно найти ссылку для закачки.
Если возникнут проблемы - инструкция по установке в Delphi5:
http://delphi.vitpc.com/library/formreg_d5.htm
<http://delphi.vitpc.com/library/formreg_d5.htm>
Ответ 3:
Пример (авторство не мое):
........................................................
procedure TForm1.FormCreate(Sender: TObject);
const W=36*pi/180;
var R,R1,R2: HRgn; X,Y,i:integer;
function S(a:integer;R:integer):integer;
begin
Result:=round(R*sin(W*a));
end;
function C(a:integer;R:integer):integer;
begin
Result:=round(R*cos(W*a));
end;
function GetStarReg(X,Y,R:integer):HRGN;
var P : array [0..4] of TPoint;
begin
P[0] := Point(X, Y-R);
P[1] := Point(X-S(4,R), Y-C(4,R));
P[2] := Point(X-S(8,R), Y-C(8,R));
P[3] := Point(X-S(2,R), Y-C(2,R));
P[4] := Point(X-S(6,R), Y-C(6,R));
Result := CreatePolygonRgn(P, 5, WINDING);
end;
begin
X:=Width div 2;
Y:=Height div 2;
R:=GetStarReg(X,Y,100);
i:=1;
repeat
R1:=GetStarReg(X-S(i,120),Y-C(i,110),40);
CombineRgn(R,R,R1,RGN_OR);
inc(i,2);
until i>9;
R1:=GetStarReg(X,Y,30);
CombineRgn(R,R,R1,RGN_DIFF);
R1:=CreateEllipticRgn(3,3,Width-6,Height-6);
R2:=CreateEllipticRgn(20,10,Width-20,Height-10);
CombineRgn(R1,R1,R2,RGN_DIFF);
CombineRgn(R,R,R1,RGN_OR);
SetWindowRgn(Handle, R, True);
end;
Ответ 4:
Есть библиотека компонент 'FormRgn', которая позволяет делать
непрямоугольные, полупрозрачные и др. формы. Откуда ее достал - не помню.
Есть только координаты автора в hlp-файле:

Меня зовут Григорьев Антон, я живу в Черноголовке (Московская область)
Мой электронный адрес duker@ipmt-hpm.ac.ru или grigorievab@mail.ru


Вопрос 15:

От: Dmitry L. Yakovlev

Здраствуйте.
Как на ходу переключать Auto Insert Notification для CD-ROMа (их может
быть несколько)?
Заранее благодарен за ответ.
Дмитрий.


Ответить.

Ответ 1:


Вопрос 16:

От: Vmz

Господа программеры !
Знает ли кто-нибудь, как из STOREDPROCы, принадлежащей одной *GDB,
обратиться к таблице (например, сделать SELECT), принадлежащей другой
*.GDB ?
В описании INTRBASE в общем описании, например, команды SELECT, есть
описание формата для прямого указания базы, но оно не работает...
Может, кому-нибудь удалось решать (и решить) такую проблему ?
С уважением, Владимир Михайлович.


Ответить.

Ответ 1:
Если я правильно понял то речь идет о том чтобы обратиться из одной базы
данных в другую
В MSSQL это делается так : select * from OtherDB..table_test
где OtherDB это и есть другая база данных .... если Interbase
соответствует стандарту SQL92 то все должно работать ...
Ответ 2:
не знаю как в интербейзе. а на скл7 так:
select * from [DatabaseNameOnServer].[UserName].[TableName]
смысл в том, что после базы не таблица, а имя пользователя


Вопрос 17:

От: Андр?й Яблонський

Есть ли какаято компонента Delphi которая позволяет работать
с dbf файлами не используя BDE


Ответить.

Ответ 1:
Стандартных нет, но есть сторонние разработки. Основной
недостаток у них - это то, что они не работают с TTable
например. А те, которые все умеют - стоят денешку.
У меня есть пример для 7-о паскаля - посмотрите,
хотя лучше покопаться в Инете. То, что такое есть
знаю наверняка, и не только для DBF.
Ответ 2:
Есть несколько но как заметили раньше - действительно стоящие вещи
стоят денег. Из бесплатного щас лучшее - TDBF ... возможно вам
подойдет доступ к dbf файлам через ADO или ODBC. В любом случае
советую заглянуть на
http://www.torry.net/db_dbf.htm - там же есть ссылка на TDbf
так же можете обратить внимание на компонент KADao используя
который можно получить доступ к dbf файлам через dao.
ссылку ищите здесь
http://www.torry.net/db_msother.htm

В завершению хочу отметить что все указанные компаненты наследники
TDataSet и сл-но могут в той или иной степени заменять TTable (для
подключения к DataSource-у и потом к таблице - вообще нет проблемм)
Кроме того они имеют лицензию Freeware и открытые исходники.

Но как я сказал хорошие вещи стоит покупать (все хвалят CodeBase, но
я сам не пробовал) т.к. у описанных - TDbf - не понимает mdx индексы,
ADO или ODBC - на два порядка медленнее чем BDE.

Я сам в свое время искал альтернативу BDE но в результате лишь понял,
что лучше BDE вряд ли что то можно найти :)
Ответ 3:
ADO-компоненты (Delphi 5) позволяют использовать ODBC минуя BDE.
Alexandr M. Kolomiets
Ответ 4:
Есть - Halcyon. Сам пробывал. Без Dll. Работает великолепно, быстро.
Но Юрий бескоровайный, а он спец, сказал, что с хальконом без глюков
нельзя. Правда при мне они(глюки) так и не вылезли ни разу. Кстати и
размер ЭКЗешника меньше. Еще кстати - я с большими файлами не
работал. Как он себя там поведет не знаю.
Версия у меня - "Halcyon Version 6.60.00 (4 April 2000)"
Архив весит 1 200 000. Через меня будет прокачиваться долго. Поищи в
интернете.
Ответ 5:
Есть и стандартные средства для работы с базами данных без использования
BDE.
Все последующее взято из статьи "Советы пользователям Delphi и C++ Builder.
Часть 3. MIDAS и "маленькие" настольные приложения", опубликованной в
журнале КомпьютерПресс N4'99 на прилагающемся CD-ROM.

Для создания такого приложения необходим компонент TClientDataSet,
располагающийся на странице MIDAS палитры компонентов. Сначала необходимо
создать приложение для переноса данных из таблиц в файл, содержащий кэш
компонента TCLientDataSet. Для этого размещаем на форме следующие
компоненты:
Компонент - Свойство - Значение
DBGrid1 - DataSource - DataSource3
DBNavigator1 - DataSource - DataSource3
Table1 - DatabaseName - BCDEMOS (или DBDEMOS)
- TableName - customer.db
- Active - true
DataSource1 - DataSet - Table1
Table2 - DatabaseName - BCDEMOS (или DBDEMOS)
- TableName - orders.db
- IndexFieldNames - CustNo
- MasterFields - CustNo
- MasterSource - DataSource1
- Active - true
DataSource2 - DataSet - Table2
Table3 - DatabaseName - BCDEMOS (или DBDEMOS)
- TableName - items.db
- IndexFieldNames - OrderNo
- MasterFields - OrderNo
- MasterSource - DataSource2
- Active - true
ClientDataSet1 - ProviderName - Provider1
- Active - true
DataSource3 - DataSet - ClientDataSet1

Далее выберем из контекстного меню компонента ClientDataSet1 опцию Assign
Local Data и в появившемся списке выберем Table1. После этого в кэш
компонента TCLientDataSet будут загружены данные. Теперь из контекстного
меню этого же компонента выберем опцию Save To File и в появившейся
диалоговой панели открытия файла введем имя файла, в котором будут храниться
данные из кэша. Теперь можно создать приложение. Для этого достаточно просто
удалить с формы компоненты Table1, Table2, Table3, DataSource1,
DataSource2 - они больше не нужны. Далее в обработчике события OnCreate
формы выполняем метод LoadFromFile компонента TClientDataSet.
Теперь приложение можно передать пользователю. В комплект поставки требуется
добавить файл dbclient.dll из каталога Winnt\System32 (или Windows\System) и
файл с кэшированными данными.


Вопрос 18:

От: Igor Tolstik

Приветик!
Рассылка была задумана для начинающих??
Ответы слишком коротки и не всегда помогут!
Мой вопрос: как сделать ссылку в форме для интернета н-р: www.irop.de
<http://www.irop.de>
Как в интернете сделать форму, чтобы данные заносились сразу в таблицу
или базу данных,
если это возможно.
Можно ли как-то из MS Excel в Delphi 5 данные перенести?
У меня будут всегда вопросы, если будет хорошая помощь.
С большим уважением
Игорь www@irop.de <mailto:www@irop.de>


Ответить.

Ответ 1:
> Рассылка была задумана для начинающих??
> Ответы слишком коротки и не всегда помогут!
Попробуйте формулировать вопросы более конкретно.
> Мой вопрос: как сделать ссылку в форме для интернета н-р: www.irop.de
> <http://www.irop.de>
Если имеется в виду простое размещение на форме, то можно
нарисовать хоть Label, а в событии OnClick запустить например так:
ShellExecute(h,'open','http://www.irop.de',nil,nil,SW_RESTORE).
Если это текст, то воспользуйтесь компонентой из библиотеки RX
RxRichEdit. Там свойство 'AutoUrlDetect:=True' и событие
'OnUrlClick' - обработать.

Кстати, если у Вас еще не стоит библиотека RX, то очень советую.
Она бесплатна и очень облегчает жизнь.

> Как в интернете сделать форму, чтобы данные заносились сразу в таблицу
> или базу данных,
> если это возможно.

Что значит в интернете? Если имеется ввиду какая-то страничка, то
можно использовать CGI или ISAPI технологии. Но это потребует
плюс ко всему элементарных знаний HTML.

> Можно ли как-то из MS Excel в Delphi 5 данные перенести?
Можно сохранить табличку в Excel как DBase. А Delphi c
этим форматом работать умеет(через BDE).
Ответ 2:
Эта процедура должна создать Alias для excel, дальше
работаем как с любой другой базой данных.

Procedure CreateExcelAlias(AliasName,
FileName:string);

type TSQLConfigDataSource=function (
hwndParent: Integer;
fRequest: Integer;
lpszDriverString: String;
lpszAttributes: String): Smallint
;stdcall;

var i:integer;
s: string;
h: THandle;
func:TSQLConfigDataSource;


begin
s:='DSN='+AliasName+';DBQ='+FileName;
h:=LoadLibrary('ODBCCP32.DLL');
func :=
GetProcAddress(h,pchar('SQLConfigDataSource'));
func(0,1,PChar('Microsoft Excel Driver
(*.xls)'),Pchar(s));
AliasCreated:=true;
FreeLibrary(h);
end;
Ответ 3:
Работа с MSExcel смотрите
http://programming.dax.ru/lessons/delphi/les3/les3.shtml


Вопрос 19:

От: dabadabiabo

При Form.Hide исчезает форма!

А как сделать, чтобы форма была видна,
а в панели задач иконка отсутствовала?


Ответить.

Ответ 1:
ShowWindow(Application.Handle, SW_HIDE);
Ответ 2:
WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE);
WnHnd := WnHnd or WS_EX_TOOLWINDOW;
SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd);

Вопрос 20:

От: Yellow D.

Приветствую!
Не ответите ли на вопросик?
Как подключить к Дельфи4 или 5 библиотеку DirectX и какие команды
используются под Дельфи? На Visual C++ все просто , а тут , что-то так
и непонял как подключить ее и главное какие дополнения надо (типа
DirectX SDK).


Ответить.

Ответ 1:
Автор интерфесных модулей:
Eric Unger - erik.unger@gmx.at
Качать отсюда (DirectX 8):
http://www.delphi-jedi.org/DelphiGraphics/directx/downloads/directx8.zip
Доп. инфа по использованию DirectX'а в Delphi:
http://www.delphi-jedi.org/DelphiGraphics/directx/
Есть еще некоторые авторы, портирующие заголовки DirectX'а под Delphi
(напимер Hori со своим DelphiX'ом), но лично мне больше нравятся
Unger'овские.
Насчет DelphiX'а. Вроде последняя версия всегда лежит на
http://www.ingjapan.ne.jp/hori/DelphiX.html
DelphiX - это такая кучка (нет не дерьма ;-)) интерфейсных
компонентов, облегчающих программирование под DirectX под Delphi.
Ответ 2:
Библиотеки лежат на http://www.delphi-jedi.org/DelphiGraphics/jedi-index.htm
Там же есть примеры, документацию я нашел только на
http://msdn.microsoft.com/directx/ - там ссылки на много разного, в
том числе и на SDK длиной в 145 метров. В более разбитом виде его
можно получить по адресу
http://msdn.microsoft.com/downloads/default.asp?URL=/code/sample.asp?url=/msdn-files/027/001/551/msdncompositedoc.xml
Оттуда стоит качать либо документацию под C++ (7 mb), либо ее же с
примерами (45 mb) - отдельно примеров нет. Все это, естественно, под
C++, но перевести на Delphi достаточно легко. Формат хелпа -
compressed html, .chm . Смотрится через hh.exe, который входит то ли
в комплект винды, то ли в прогу htmlhelp - тоже, кажется, валяется на
сайте microsoft, но где именно, не помню.



3. Лучший ответ последнего выпуска.
-----------------------------------
Не было ничего особо примечательного, но думаю это
как раз из-за того, что большинство вопросов уже на избитые
у нас темы или просто повторяются. Посмотрим.

4. Очередные вопросы.
---------------------


Вопрос 151:

От: Ернар Шамбаев


чПРТПУ:

Уважаемые господа программисты!

Кто-нибудь занимался написанием софта для видеокамеры?
Или, может, кто-нибудь порекомендует хорошие странички
по данному вопросу?


Ответить.

Ответ 1:


Вопрос 152:

От: Алексей Малиновский

Здраствуйте господа!

Делаю установочную программу с помощью InstallSheild, и когда я делаю
путь песвдонима на русском языке, то при загрузке программы происходит
ошибка, т.е. BDE не видит это директории.
Если посмотреть в bdeadmin, то у этого псевдонима вместо пути БД
какая-то белеберда...
Если же мы вручную в bdeadmin пропишем путь на русском языке, то всё
работает; если же делать это с помощью InstallShield, то не работает
(когда только путь на русском языке).

Подскажите господа, что делать?

С уважением, Алексей.


Ответить.

Ответ 1:


Вопрос 153:

От: Алексей Малиновский

Господа программисты, подскажите с помощью какой API ф-ии можно
установить флаг DTR и RTS в активное состояние для определённого
COM-порта.

Спасибо за ответы...

С уважением, Алексей.


Ответить.

Ответ 1:


Вопрос 154:

От: Кабанов Артур Александрович

Вопрос:
Как узнать значение fsBold в DBGrid3.Columns[0].Title
Пробовал:
DBGrid3.Columns[0].Title.Font.Style:=[fsBold];
Значение изменяется на противоположное, а мне надо именно присвоить
fsBold:=False




Ответить.

Ответ 1:


Вопрос 155:

От: Кабанов Артур Александрович

Вопрос:
При компиляции и последующем запуске программы из Delphi периодически
виснет программа и сама Delphi, но только где используются отчеты.
Пробовал поставить QuickReport 3.0.8 тоже самое.
У меня: DelphiEnterpriseVersion 5.0 (Build 6.18) UpdatePack1
QuickReport Version 3.0.8




Ответить.

Ответ 1:


Вопрос 156:

От: Илья

Здравствуйте
Я уже присылал вопрос на тему IBDataBase и видимо был не совсем точен
, вследстивие чего мне пришло несколько ответов просто пересказывающих
моё письмо :(
Буду точнее:
1)Как СОЗДАТЬ интербазу (gdb файл) в RunTime?
На строку IBDataBase.CreateDataBase идет ошибка "unavailable
database"
2)Почему при работе с DataBase и Table при указании драйвера например
Paradox метод Table.CreateTable проходит нормально ,а если поставить
DataBase на любой из ODBC драйверов , то на тот же метод идет ошибка
SQL Connect ???

--
С уважением
Илья




Ответить.

Ответ 1:


Вопрос 157:

От: Serge V. Frolov

Здравствуйте !
Подскажите пожалуйста какими средствами можно создать
анимированный курсор и как его использовать в Delphi ?




Ответить.

Ответ 1:


Вопрос 158:

От: Katrin

Уважаемые программисты!

При создании мной некоторого класса, возникла необходимость использовать
массив свойств данного класса. При этом я вычитала, что "....в отличие
от стандартного массива, массив свойств может быть индексирован
нечисловым значением. Например в качестве типа индекса возможно указать
строку." Мне эта возможность показалась очень привлекательной, но
реализовать я ее не смогла, т.к. каждое свойство требует переменную
соотв. типа.
Прошу подсказать, действительно ли возможно это реализовать, если да то
хотелось бы посмотреть конкретный пример :))).
Екатерина!


Ответить.

Ответ 1:


Вопрос 159:

От: admin

Вопрос: У вас есть программа или наработки кода для работы с серверами ftp и www4
по электронной почте




Ответить.

Ответ 1:


Вопрос 160:

От: Медяник Юлия Анатольевна

Вопрос:
Помогите решить проблему: в Delphi5 c использованием стандартной
компоненты QuickReport написана программа, формирующая отчет с его
предварительным просмотром и печатью. На компьютерах с принтерами XEROX
и HP 1100 при попытке сформировать отчет выдается сообщение "Access
Violation...".
Такое ощущение, что программа не видит принтера, выбранного в списке
печати. На компьютерах с принтерами HP 1100 иногда после переустановки
драйвера либо после полной переустановки Windows проблема исчезала, но
не всегда. Замена QuickReport на что-либо другое не совсем подходит,
т.к. надо очень много переделывать. Помогите, пожалуйста!


Ответить.

Ответ 1:



5. Ищу подельника.
------------------
Kolesnikov Nikita:
Я сейчас распаял LPT-устройство и занимаюсь его отладкой,
до драйверов дело дойдёт, наверное недели через 2-3. Надеюсь на
конструктивное сотрудничество. Мой адрес KN2@newmail.ru.

Sam Savinov:
Ищу желающих принять участие в создании новой версии
криптографического пакета FET. С последней версией которого
можно ознакомиться по адресу: www.myportal.ru/ss
SAM / sam@myportal.ru




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

Для интересующихся - немного о себе. Работаю на
железнодорожном транспорте ведущим программистом.
Основные мои разработки это сбор и доставка клиентам
информации о вагонах и поездах: где находится(по России),
куда едет. В связи с этим программировал для e-mail,Socket,БД,ISAPI.

За сим прощаюсь - скорых Вам и качественных программ.

Автор рассылки - Дмитрий.
ICQ - 89533941.

ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС



http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное