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

» Вопросы по Delphi

Автор: SergeyReutov
Дата сообщения: 15.07.2005 08:00
Я соеденяюсь с базой данных MSAccess XP при помощи компонентов ADOConnection и ADOTable. Использую Microsoft Jet 4.0 OLE DB Provider.
Проблема в том, что когда я пытаюсь выполнить поиск:
DataModule1.ADOTable1.Seek('15',soFirstEQ);
система выдает ошибку: "Текущий проводник не поддерживает необходимый интерфейс для функции Index".
Формат индексного поля, по которому я пытаюсь выполнить поиск - integer.
В чем может быть проблема?
Автор: Rasa
Дата сообщения: 15.07.2005 08:26
Попробуй посмотри здесь

http://www.delphikingdom.com/asp/answer.asp?IDAnswer=31684
Автор: MICROPOM
Дата сообщения: 15.07.2005 09:14
Всё получилось. Всем большое спасибо!!!

Добавлено:
А как в делфе запустить внешнее приложение?
Например Файл .com
Автор: PowerChute
Дата сообщения: 15.07.2005 09:19
MICROPOM

ShellExecute(Handle, nil, 'C:\Program Files\Loger.exe', nil, nil, SW_SHOW);


Автор: SergeyReutov
Дата сообщения: 15.07.2005 10:11
Я пытаюсь выполнить следующий запрос:
DataModule1.ADOQuery1.Active:=False;
DataModule1.ADOQuery1.SQL.Clear();
DataModule1.ADOQuery1.SQL.Add('update Cell');
DataModule1.ADOQuery1.SQL.Add('set Cell.u2=77');
DataModule1.ADOQuery1.SQL.Add('Where Cell.u1=7');
DataModule1.ADOQuery1.Active:=True;

При этом возникает ошибка: "Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции" и "ADOQuery1: CommandText does not return a result set".

Но запрос всеравно выполняется. Тоже самое происходит и при попытке удаления записи, т.е. возникают те же ошибки, но запись удаляется. В чем может быть причина появления этих ошибок?
Автор: MICROPOM
Дата сообщения: 15.07.2005 11:27
PowerChute

Цитата:
ShellExecute(Handle, nil, 'C:\Program Files\Loger.exe', nil, nil, SW_SHOW);


А как его описать? Прости за неграмотность, я только начал.


Добавлено:
А всё нашёл, ShellAPI. Спасибо.

Добавлено:
PowerChute

А если этот фаил находится в каталоге с ЕХЕшником? И я хочу сделать так
ShellExecute(Handle, nil, ExtractFilePath(Application.ExEName)+'123.com', nil, nil, SW_SHOW);
Тогда неполучается.
Автор: Dim2004
Дата сообщения: 15.07.2005 12:13
SergeyReutov

Цитата:
DataModule1.ADOQuery1.Active:=True;

При этом возникает ошибка: "Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции" и "ADOQuery1: CommandText does not return a result set".

Естессно. Нахрена ты пытаешься открыть запрос, не возвращающий dataset? Его нужно выполнить (DataModule1.ADOQuery1.ExecSQL()).
Автор: SergeyReutov
Дата сообщения: 15.07.2005 12:37
Dim2004
Все понял. Спасибо.

А как можно проверить возвращает запрос какие-нибудь данные или нет?
Например, если взять самый простой:
Select *
From Cell
Where u1=7
Т.е. нашел он что-нибудь или нет.
Автор: h0mer
Дата сообщения: 15.07.2005 13:08
MICROPOM
если находиться в том-же каталоге, можно и не выкоблучиваться с путём, а сделать так.
WinExec('123.com',SW_SHOW);
или так
ShellExecute(Handle, nil, '123.com', nil, nil, SW_SHOW);
и на будущее:
посмотри что возвращается в
Label1.Caption := ExtractFilePath(Application.ExEName)+'123.com';
и узнаешь почему не работает.
Автор: MICROPOM
Дата сообщения: 15.07.2005 13:27
h0mer, спасибо, всё работает и всё оказалось намного проще.

Добавлено:
А неподскажете ещё как потом завершить это приложение, спустя некоторое время?

Добавлено:
h0mer

Цитата:
посмотри что возвращается в
Label1.Caption := ExtractFilePath(Application.ExEName)+'123.com';
и узнаешь почему не работает


Это я знал, возвращался правильный путь.
Автор: YurikGL
Дата сообщения: 15.07.2005 19:40
http://delphi4all.narod.ru/how/closeapp.htm


Эта программа закрывает Delphi Help.

procedure TForm1.Button1Click(Sender: TObject);
begin
PostMessage(FindWindow(nil, 'Delphi Help'), WM_QUIT, 0, 0);
end;

Автор: Z MeZe
Дата сообщения: 15.07.2005 22:32
MICROPOM

Цитата:
А если этот фаил находится в каталоге с ЕХЕшником? И я хочу сделать так
ShellExecute(Handle, nil, ExtractFilePath(Application.ExEName)+'123.com', nil, nil, SW_SHOW);
Тогда неполучается.

Вот так будет правильно в этом случае:
ShellExecute(Handle, nil, PChar(ExtractFilePath(Application.ExEName)+'123.com'), nil, nil, SW_SHOW);
В shellexecute не строка (string) как параметр, а PChar. В общем, читай чем они отличаются.
А вообще, в этом случае правильно (корректно) с моей точки зрения так:
...
var
path: array[0..64] of Char;
...
begin
...
FillChar(path, SizeOf(path), 0);
StrPCopy(path, ExtractFilePath(Application.ExEName)+'123.com');
ShellExecute(Handle, nil, path, nil, nil, SW_SHOW);
...
end

h0mer

Цитата:
и на будущее:
посмотри что возвращается в
Label1.Caption := ExtractFilePath(Application.ExEName)+'123.com';
и узнаешь почему не работает.

А что в этом случае возвращается? ,.. строка ведь, с корректным путем к файлу .
Объясни что имел ввиду...
Автор: ShIvADeSt
Дата сообщения: 18.07.2005 00:55

Цитата:
А вообще, в этом случае правильно (корректно) с моей точки зрения так:
...
var
path: array[0..64] of Char;

ИМХО грубейшая ошибка, для пути есть специальная константа MAX_PATH, так как в противном случае, если путь будет длиннее 64 символов будешь получать AccessVilotion и мучительно думать, в чем проблема, почему иногда работает иногда нет.
ТРак же считаю, что для данного случаю заморачиваться с
Цитата:
FillChar(path, SizeOf(path), 0);
StrPCopy(path, ExtractFilePath(Application.ExEName)+'123.com');
ShellExecute(Handle, nil, path, nil, nil, SW_SHOW);
...

не стоит, вполне достаточно
Цитата:
ShellExecute(Handle, nil, PChar(ExtractFilePath(Application.ExEName)+'123.com'), nil, nil, SW_SHOW);

SergeyReutov

Цитата:
А как можно проверить возвращает запрос какие-нибудь данные или нет?
Например, если взять самый простой:
Select *
From Cell
Where u1=7
Т.е. нашел он что-нибудь или нет.

потом делаешь проверку if ADOQuery.RecordCount>0 then (//то есть есть записи в таблице, делаем что нам надо
Автор: h0mer
Дата сообщения: 18.07.2005 09:07
Z MeZe
я что то думал, что строка возвращается из ExtractFilePath(Application.ExEName) без последнего слэша. Обычно на win9x такая фигня.
Автор: PowerChute
Дата сообщения: 18.07.2005 10:57
MICROPOM


Цитата:
А неподскажете ещё как потом завершить это приложение, спустя некоторое время?

А что там у тебя происходит? И по какому признаку надо завершать?
А чтобы закрыть чужое приложение -
PostMessage (FindWindow (nil, 'Loger'), WM_QUIT, 0, 0);
Автор: mr_eoi
Дата сообщения: 18.07.2005 11:24
PowerChute
11:57 18-07-2005
Цитата:
А чтобы закрыть чужое приложение -
PostMessage (FindWindow (nil, 'Loger'), WM_QUIT, 0, 0);

Так закрывают оконные приложения. В данном же случае у MICROPOM программа .COM -> запускается она в окне консоли. Я такие вещи делал через ShellExecuteEx с соответствующими настройками, получал HANDLE консоли (или все равно - чего запустилося). Для досрочного завершения используем TerminateProcess.
Автор: MICROPOM
Дата сообщения: 18.07.2005 12:12
PowerChute

Цитата:
А что там у тебя происходит? И по какому признаку надо завершать?
А чтобы закрыть чужое приложение -
PostMessage (FindWindow (nil, 'Loger'), WM_QUIT, 0, 0);


Запускается досовское приложение. После завершения оно просит эникей нажать.
Окно эмуляции ДОС остаётся активным.

Добавлено:
Я ещё так попробовал
var
ProcInfo: TProcessInformation;
CreateProcess('123.com', Nil, Nil, Nil, 1, 1, Nil, Nil, ^ProcInfo);
...
TerminateProcess(ProcInfo.hProcess, 0);

Вместо еденицы надо Incompatible types: 'LongBool' and 'Integer'

Добавлено:
А если я вот так делаю, то главная форма закрывается, а приложение нет.


ShellExecute(Handle, nil, '123.com', nil, nil, SW_SHOW);
...
TerminateProcess(Handle, 0);
Автор: mr_eoi
Дата сообщения: 18.07.2005 14:08
MICROPOM
ShellExecuteEx и ShellExecute - это разные функции. Вот пример кода на C++. Перевести на Дельфи, думаю, труда не составит. Данный фрагмент запускает программу "123.com" и, если в течение 10 секунд она не завершилать, завершает её принудительно.

Код: SHELLEXECUTEINFO sei;
memset(&sei,0,sizeof(sei));
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI;
sei.lpVerb = "open";
sei.lpFile = "123.com"; // запускаемая программа
sei.lpParameters = NULL;
sei.lpDirectory = NULL;
sei.nShow = SW_SHOW;
BOOL res = ShellExecuteEx(&sei);
DWORD timeout = 10*1000; // 10 seconds
if(res && int(sei.hInstApp) > 32)
{
DWORD wt = WaitForSingleObject(sei.hProcess,timeout);
if(wt != WAIT_OBJECT_0)
{
TerminateProcess(sei.hProcess,0);
}
}
Автор: MICROPOM
Дата сообщения: 18.07.2005 14:49
mr_eoi

Цитата:
Вот пример кода на C++. Перевести на Дельфи, думаю, труда не составит

Составит
)
Автор: mr_eoi
Дата сообщения: 18.07.2005 15:16
MICROPOM
15:49 18-07-2005
Цитата:
Составит

Лови:

Код: uses ...,shellapi,...
...
var
sei : SHELLEXECUTEINFO;
res : boolean;
timeout, wt : DWORD;
...
FillChar(sei,SizeOf(sei),0);
sei.cbSize := SizeOf(sei);
sei.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_DOENVSUBST or SEE_MASK_FLAG_NO_UI;
sei.lpVerb := 'open';
sei.lpFile := '123.com'; // запускаемая программа
sei.lpParameters := nil;
sei.lpDirectory := nil;
sei.nShow := SW_SHOW;
res := ShellExecuteEx(sei);
timeout := 10*1000; // 10 seconds
if res and (integer(sei.hInstApp) > 32) then
begin
wt := WaitForSingleObject(sei.hProcess,timeout);
if wt <> WAIT_OBJECT_0 then
begin
TerminateProcess(sei.hProcess,0);
end;
end;
Автор: EvSeKo
Дата сообщения: 18.07.2005 15:36
Люди, помогите. У меня такая беда: есть три переменные l,r и x типа extended.
l=6137
r=0,24221605023
x=l+r
После сложения выходит, что x=6137,2422161
Зачем он округляет? Можно ли как нибудь избавиться от этого, есть ли какие нибудь директивы, отменяющие округление?
Автор: MICROPOM
Дата сообщения: 18.07.2005 15:46
mr_eoi
Ругается на эту строку
res := ShellExecuteEx(sei);
Вот такими словами
Incompatible types: '_SHELLEXECUTEINFOA' and 'PShellExecuteInfoA'
Автор: mr_eoi
Дата сообщения: 18.07.2005 15:50
MICROPOM
16:46 18-07-2005
Цитата:
Ругается на эту строку
res := ShellExecuteEx(sei);
Вот такими словами
Incompatible types: '_SHELLEXECUTEINFOA' and 'PShellExecuteInfoA'

Напиши

Код: res := ShellExecuteEx(@sei);
Автор: Dim2004
Дата сообщения: 18.07.2005 19:04
EvSeKo

Цитата:
=6137
r=0,24221605023
x=l+r
После сложения выходит, что x=6137,2422161
Зачем он округляет? Можно ли как нибудь избавиться от этого, есть ли какие нибудь директивы, отменяющие округление?

Чего-й то Вы, мил человек, мозги нам сношаете . Следующий кусок кода


Код: procedure TForm1.Button3Click(Sender: TObject);
var l,r,x: extended;
begin
l:=6137;
r:=0.24221605023;
x:=l+r;
ShowMessage(FloatToStr(x))
end;
Автор: MICROPOM
Дата сообщения: 19.07.2005 08:00
mr_eoi
Вроде работает, только процесс не завершается.
Продолжает просить: пресс эникей ту континиори.

Добавлено:
А может сэмулировать нажатие пробела? Вот только как это сделать для активного окна?
Автор: EvSeKo
Дата сообщения: 19.07.2005 11:19
Dim2004

Всё, спасибо. Ошибку нашёл. Это я во время отладки решил посмотреть чему равняется переменная, навёл мышку на неё, а в подсказке число округлённое.
Автор: Softerr
Дата сообщения: 19.07.2005 13:31
Возникла проблемка. В связке TTable,TDataSource, TDBGrid. Данные при редактировании в TDBGrid'е сразу же заносятся в базу данных TDataSource'ом, а нужно чтобы данные заносились только тогда, когда пользователь этого хочет (при нажатии кнопочки Save, например).
База данных - BDE, Delphi 7.
Автор: GloThin
Дата сообщения: 19.07.2005 13:49
Softerr
Используй кэширование записей в DBGrid'е и потом при нужном условии сохраненяй в таблице.
Автор: Softerr
Дата сообщения: 19.07.2005 14:22
GloThin, спасибо за подсказку, но не мог бы ты точнее сказать как в DBGrid'e сделать это самое кэширование записей и сохранение?
Автор: aquaman1977
Дата сообщения: 19.07.2005 15:02
Приветствую!

Не подскажет ли кто, какая процедура в принципе быстрее выполняется:
FillChar(arg,SizeOf(arg),0) или ZeroMemory(addr(arg),SizeOf(arg))?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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