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

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

  Все выпуски  

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


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

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


И беда не беда и весна не осень
сколько хочешь пиши - мы тебя не бросим.


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


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

Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Метки и ... метки(неожиданное дополнение).
2. Есть предложение - кто за?
3. Девушки - программисты?
4. Очередные вопросы.
5. Отвеченные вопросы.
~~~~~~~~~~~~~~~~~~~


1. Метки и ... метки(неожиданное дополнение).
---------------------------------------------
В чем корень различий компонент 'StaticText' и 'Label'?

Пишет Pavel Anufrikov.

Отличие определяется тем, что один является оконным компонентом
(TStaticText), а другой - нет(TLabel). Соответственно первый способен
получать события Windows, быть предком для компонентов ActiveX и пользоваться
прочими прелестями операционной системы, а второй же ценен тем, что
при ненадобности всего вышеперечисленного он позволяет сэкономить
такой ресурс системы, как дескриптор окна, и как следствие, более мобилен и
имеет большую скорость перерисовки.

И пытаться получить эти два компонента в одном - очень даже бессмысленное занятие.



2. Есть предложение - кто за?
-----------------------------

Нестеренко Кирилл предлагает.

А что если зделать огромную базу исходников, вот я например написал прогу
и закинул ее к вам. Вместе с небольшим описанием по программе.

Например:
Программа - MyProgram.pas ...
Задача - Сортировка массива. Массив задается пользователем в TEdit.
Особенности - Использован метод пузырька.

Теперь если мне понадобилась програмка, я поиском прогнал описания,
нашел нужную и слёзно прошу у вас выслать мне этот исходник.
_____


От себя, как от автора рассылки, хочу сказать следующее. В принципе таких вещей
в интернете уже хватает, но все они требуют ONLINE подключения. Если подписчики,
т.е. ВЫ, активно поддержите эту идею, а заодно и подкините идей по организации
удобного поиска, то я, в свою очередь, возьмусь организовать такую базу(не без
Вашей помощи) и удобный доступ к ней по почте. В итоге получится полный OFFLINE.
Высказывайтесь!!!



3. Девушки - программисты?
--------------------------
Поскольку мое неосторожное заявление о лучшей половине нашего человечества
вызвало целую бурю эмоций и шквал писем - негодований, то я решил(хотя и не
собирался вовсе) немного расширить эту тему и предложить нашим дамам сказать
почему они занимаются программированием и что натолкнуло их на это, а я
опубликую и таким образом надеюсь реабилитироваться в глазах наших
программисток. Если, конечно дамам есть, что сказать!!! Тогда вперед!!!



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


Вопрос 409:

От: Lamer

В последнем выпуске прочел впечатления от Дельфи6. Я тоже ее себе поставил
и мне понравилась работа с Action-ами и особенно Action-bar-ы.
Есть ли способ сохранять состояния Action-ов не в файл
(как это делает ActionManager), а в соответвтующую ветку реестра (HKCU\...)?


Ответить.

Ответ 1:



Вопрос 410:

От: Ефремов Александр


Не подскажете ли как узнать, подключен ли в данный момент
компьютер к интернету или нет. Недавно в FAQ был дан ответ в качестве
функции InetIsOffLine(Flag: Integer): Boolean , которую необходимо
импортировать из библиотеки Url.dll. У меня она не работает. Все время
выдает FALSE !?! Зашел на официальный сайт Microsoft по MSDN
http://msdn.microsoft.com/library/psdk/shellcc/shell/Functions/InetIsOff
line.htm
<http://msdn.microsoft.com/library/psdk/shellcc/shell/Functions/InetIsOf
fline.htm>
где черным по белому написано, что функция эта выдает false не только,
когда комп подключен к интернету, но и когда ЕЩЕ НЕ БЫЛО ПОПЫТОК
подключения (or if no attempt has yet been made to connect to the
Internet). Ну и скажите мне теперь, какой у этой функции тогда смысл ?
Да, умом Microsoft не понять (к сожалению). Помогите хоть кто-нибудь
найти нормальный способ проверки подключения к инет (online) .


Ответить.

Ответ 1:


Вопрос 411:

От: Ефремов Александр


У меня есть один существенный вопрос. Наверняка
каждый из Вас рано или поздно загорался желанием убрать Вашу прогу из
Alt+Ctrl+Del. Делается это просто:
if not (csDesigning in ComponentState) then
RegisterServiceProcess(GetCurrentProcessID, 1);
Но при всем при этом программа все же остается работающим ПРОЦЕССОМ в
системе, т.е. любой программкой отображением процессов ее можно
обнаружить, а значит и снять. А в WinNT/2000 вообще можно снимать не
только Задачи, но и останавливать Процессы простым нажатиет
Alt+Ctrl+Del. И вот вопрос: "Нельзя ли как нибудь мою программу
запускать не как самостоятельный процесс, а ПРИКРЕПЛЕННОЙ к какому
нибудь процессу, уже работающему в системе, т.е. запускать два процесса
как один ?" В ОС в любом случае есть процессы, которые запускаются
всегда при ее загрузке, и если к ним прикрепить прогу, то обнаружить ее
уже действительно будет проблематично, а для некоторых пользователей
даже невозможно. Помогите, пожалуйста, справиться с этой нелегкой
задачей. К сожалению там, где я живу (г. Петропавловск-Камчатский) очень
трудно купить хорошую книгу, а книг по WinAPI я сдесь вообще никогда не
встречал, поэтому очень часто приходится бить в бубен. Заранее спасибо.


Ответить.

Ответ 1:


Вопрос 412:

От: Глубокий Александр

Как в StringGriud засунуть картинки.
Так чтобы при изминение в какойто ячейке значение,
картинка менялась. Если можно поподробней.


Ответить.

Ответ 1:


Вопрос 413:

От: Константин Ольта


Стоит Delphi 5 под Windows 2000. При открытии баз DBASE 4 в Desktop
русские буквы представлены иероглифами (в программах все в порядке). Под
Windows 95/98 вношу изменение в Win.ini и все в порядке. Подскажите, что
делать под Windows 2000 и NT?


Ответить.

Ответ 1:


Вопрос 414:

От: otdel21

При передаче байта через последовательный порт (например, СОМ1)
нужно
определить момент времени, когда через сдвиговый регистр порта был
передан
последний бит данных. Сразу после этого я должен установить сигнал
RTS:=1,
чтобы переключить на прием внешний мультиплексор.
Функция WinAPI - WaitCommEvent(Form.hCov, EV_TXEMPTY, nil) меня не
устраивает, ибо она формирует событие в момент, когда освободился
регистр
данных, в который можно помещать следующий передаваемый байт.
Я написал вставку на ассемблере, которая напрямую читает регистр LSR
порта (по адресу $3FD для СОМ1) и в цикле опрашиваю его "6" бит (считая
"0" - младшим, а "7" - старшим) этого регистра, ожидая, когда он
установится
в "1".
Такой вариант, в принципе, работает под Windows/95/98/Me, но не
выполняется под Windows/NT/2000, ибо эти системы запрещают прикладным
программам не только записывать, но и читать регистры портов напрямую, а
только через WinAPI.
Подскажите, пожалуйста, как мне решить эту проблему без
ассемблерного
опроса порта, может я не совсем разобрался (по Help-ам) в этом
необъятном
WinAPI ?


Ответить.

Ответ 1:


Вопрос 415:

От: Okulov


: У меня вот такая проблема!! Пишу под OpenGL!!!
Не могу написать коридор состоящий из n-ого колличества полигонов ( а
терерь самое главное)
с правильно наложеной текстурой и светяшими в пол тремя лампами Народ
ПОМОГИТЕ!!!!!! Помогите хоть коридором с текстурой!!!!!!!!


Ответить.

Ответ 1:


Вопрос 416:

От: Mishenka

Где можно скачать компоненты для Delphi?


Ответить.

Ответ 1:


Вопрос 417:

От: Dr.IMP

Есть два вопроса, на которые хотелось бы получить ответ:
1. Имеется Win2000Server. Подключается уо мне пользователь через модем.
Так
вот, как программно определить, кто это ко мне подключился и как, в
случае
необходимости разорвать это соединение (для исходящих звонков нашел, а
вот
для входящих не получается).
2. Имеется окно какого-нибудь приложения. Как получить хэндл этого окна
я
знаю, а вот как получить хэндл элементов расположенных на этом окне?
конкретно интересуют Edit и Memo (вариант: эдитов и мемо может быть
несколько штук)


Ответить.

Ответ 1:


Вопрос 418:

От: Ефремов Александр

Не подскажет ли кто, существуют ли в Delphi зарезервированные имена
(псевдонимы) для таких папок как Windows, Program files и т. п. Если
такие константы есть, подскажите, пожалуйста, в каком файле они
объявлены. Может быть существуют функции для получения псевдонимов или
их можно найти где-нибудь в реестре ?


Ответить.

Ответ 1:


Вопрос 419:

От: В.А.Крашенинников

У меня два вопроса :
1. Подскажите пожайлуста, можно-ли убрать программу (заголовок) из
панели задач ? ( Я использую ShellApi.TrayIcon, но в панели задач
заголовок
остается, а так никакого смысла вешать прогу в трей {OS - WinME} ).

2. Пришлите пожайлуста пример ( минимальный, но полностью :-)
программы
без использования VCL.



Ответить.

Ответ 1:


Вопрос 420:

От: Ефремов Александр


Обращаюсь я к Вам уже не первый
раз, поэтому вполне могу и претензию предъявить. Неужели во всей России
не найдется человека, который ответил бы на мой вполне простой вопрос. И
куда же делись все российские хакеры, которых "боятся" во всем мире. Где
же они ? Или форумы посещают только user-ы и game-еры. Не знаю... У меня
нет документации по WinAPI, да и купить ее там где я живу трудно, а
набор функций, который можно получить из библиотеки windows ни о чем не
говорит. Помогите кто может, как же мне присоединить свою прогу к уже
запущенному ПРОЦЕССУ, так, чтобы ее не было видно "нигде". Если убрать
ее из из Alt+Ctrl+Del функцией RegisterServiceProcess, то она остается
работающим процессом, любой прогой обнаружения процессов ее можно
обнаружить, а значит и снять. А если при запуске прикреплять программу к
какому-нибудь стандартному процессу ОС, например Explorer.exe, то
обнаружить ее будет уже очень проблематично. ТАК МОЖНО ЛИ ЗАПУСКАТЬ
РАЗНЫЕ ПРИЛОЖЕНИЯ КАК ОДИН ПРОЦЕСС ИЛИ НЕТ ?
И еще вопрос: где можно найти (в инете) электронную документацию по
WinAPI на РУССКОМ языке ? Заодно спрошу еще вот что: МОЖНО ЛИ СОЗДАВАТЬ
ФОРМУ НЕСТАНДАРТНОГО РАЗМЕРА ПО БИТОВОЙ МАСКЕ, загруженой из
какого-нибудь графического файла ?
Ну и раз такое дело вот Вам еще вопрос: Известно, что большинство
Web-серверов построены на платформе Unix, поэтому Web-модули для них
пишутся в основном на Perl. Как известно, Delphi позволяет создавать
Web-модули. БУДУТ ЛИ ОНИ ФУНКЦИОНИРОВАТЬ ПОД UNIX ИЛИ ТОЛЬКО ПОД WIN32 ?
Если только под Unix, то существуют ли какие-нибудь конвертеры,
преобразователи или что-то в этом роде. Вобщем как сделать, чтобы
Web-модель написанный на Delphi работал на Unix-е ?
И на последок вот еще что (ответте хоть НА ЭТО): После того, как
рассылка FAQ приходит мне на мыло, я могу отвечать на вопросы через
e-mail. Значит они (мои ответы на Ваши вопросы или Ваши ответы на мои
вопросы) приходят на сервер. А дальше ? Они отправляются прямиком на
мыло того, кто спросил или остаются на сервере. Если так, то ГДЕ ЖЕ
МОЖНО НА СЕРВЕРЕ ПОСМОТРЕТЬ НА НИХ ОТВЕТ ? Заранее спасибо. ГОСПОДА, НЕ
ДАДИМ УПАСТЬ В ГРЯЗЬ РЕПУТАЦИИ РУССКОГО ХАКЕРА !!!


Ответить.

Ответ 1:


Вопрос 421:

От: tmp_user@newmail.ru


Подскажите пожалуйста, как сделать всплывающую подсказку
(hint) на элемент списка (TListBox), если он полностью не
входит по длине в окошко?


Ответить.

Ответ 1:


Вопрос 422:

От: Чернов Станислав

Хочу задать вам такой вопрос:
Можно ли при помощи компонент Делфи 5 получить вместо содержимого URL
StatusCode типа 404 - not found, 200 - OK,500-internal server error etc.


Ответить.

Ответ 1:



5. Отвеченные вопросы.
----------------------



Вопрос 281:

От: Geints Yuri

:Привет, коллеги!

Может кто подскажет, как можно получить доступ к курсору, который
создает какой-нибудь TADO... компонент у клиента на машине? Как
сохранить его (курсор) в нормальную DBF-ку?

С наилучшими пожеланиями,
Юрий




Ответить.

Ответ 1:


Вопрос 282:

От: Katkov Sergey


:Использую SQL Server 2000 и Delphi 5. В одной из таблиц находится
BLOB-поле. На форме TDBImage. Если картинка попадает в TDBImage через
TTable, то все нормально, а если через TQuery - то при размере поля больше
нескольких килобайт значительная часть картинки оказывается черной. Причем
не с начала, а как-то в середине. Не подскажет ли многоуважаемые знатоки,
как бороться с таким глюком?

Best regards
Sergey Katkov (katkov@zorya.com.ua)




Ответить.

Ответ 1:


Вопрос 283:

От: Вадим Шешунов

Здравствуйте!

Каким образом можно в программе на Делфи регулировать громкость звука
колонок так, как это делает стандартный регулятор Виндов? Применение
функции auxSetVolume почему-то не дает никакого эффекта.


Ответить.

Ответ 1:
В модуле MMSystem есть функции
waveOutSetVolume(WAVE_MAPPER, AVolume) и
midiOutSetVolume(MIDI_MAPPER, AVolume), которые регулируют громкость в зависимости от формата музыки.
AVolume :Longint - старший разряд - правый канал, младший - левый.
Ответ 2:
Win API.
GetDriveType см справку.
Не СД- Следующий диск.
Начинай с С:\


Вопрос 284:

От: Nostradamus

Как отловить создание окна другой программы и получить её handle?


Ответить.

Ответ 1:
var Myhandle:HWND;
...
MyHandle:=findwindow('class','caption');
...
<<<>>>
Для определения class пользуйтесь WinSight32 из комплекта Дельфей (Можно вместо " 'class' " написать "nil "
Ответ 2:
Почитай в Win32 Help про функцию FindWindow.
Ей задаешь имя искомого класса окна и, если надо, заголовок искомого
окна, а она тебе возвращает HANDLE.
Для более навороченного поиска есть FindWindowEx.

HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);

HWND FindWindowEx(
HWND hwndParent, // handle to parent window
HWND hwndChildAfter,// handle to a child window
LPCTSTR lpszClass, // pointer to class name
LPCTSTR lpszWindow // pointer to window name
);


Вопрос 285:

От: Богер Евгений

Как узнать букву, соответствующую CD-ROM'у из Дельфы?


Ответить.

Ответ 1:
Вот пример получения типов носителей:
...
var c : Char;
begin
FOR c := 'a' TO 'z' DO
IF (GetDriveType( PChar(c + ':\') ) = DRIVE_FIXED) THEN ...
...
Типы (из хелпа WinAPI):
0 The drive type cannot be determined.
1 The root directory does not exist.
DRIVE_REMOVABLE The drive can be removed from the drive.
DRIVE_FIXED The disk cannot be removed from the drive.
DRIVE_REMOTE The drive is a remote (network) drive.
DRIVE_CDROM The drive is a CD-ROM drive.
DRIVE_RAMDISK The drive is a RAM disk.
..............
Ответ 2:
Для того, чтобы узнать тип устройства, используем функцию
GetDriveType.

UINT GetDriveType(
LPCTSTR lpRootPathName // корневой каталог (например, 'C:\')
);

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

0 Невозможно распознать тип диска.
1 Корневой каталог не существует (точнее, такого диска нет)
DRIVE_REMOVABLE Диск может быть вынят из устройства.
DRIVE_FIXED Диск из устройства не вынимается.
DRIVE_REMOTE Сетевой диск.
DRIVE_CDROM CD-ROM диск.
DRIVE_RAMDISK RAM диск.


Вопрос 286:

От: Alexey

Можно ли в TChart программно (т.е. не в диалоговом режиме)
добавить/убрать одну серию?


Ответить.

Ответ 1:
Данный код удаляет последнюю серию в Chart типа TChart:

Chart.SeriesList.Delete(Chart.SeriesCount-1):
Chart.Repaint;
Ответ 2:
Конечно можно.

Добавить
Chart1.AddSeries(TBarSeries.Create(Self));
Убрать
Chart1.Series[0].Free;

НЕЛЬЗЯ удалять из SeriesList. Ей от этого плохо. Именно Free у удаляемой
серии. Это необходимо и достаточно.


Вопрос 287:

От: Гавриленко Степан

1) КАК при помощи дельфи выполнить внешнее событие. например запутить
ехе файл.
2) У меня на форме есть компанент TStringGreed. - по русски говоря таблица.
Она заполнена какой либо информацией.
Вдруг в определенный момент мне нужно перенести фокус на определенную ячейку
таблици. Ну или хотябы выделить определенну строку.
Какое свойство за это отвечает?
Я пробовал Select. Но там оно типа Trect и я незнаю, как его юзать.


Ответить.

Ответ 1:
Ответ на 1-ый вопрос:
 
В Uses добавь ShellApi
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ShellExecute(0, nil, 'calc.exe', nil, 'c:\winnt', sw_restore);
end;
 
Запускается стандартный Windows калькулятор.
 
Ответ на 2-ой вопрос:
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
StringGrid1.Col:=3;
StringGrid1.Row:=3;
end;
 
Фокус переместиться на ячейку в 3 строке 3 столбце, не считая
фиксированных
Ответ 2:
Выделить ячейку с координатами i, j можно так:

var
  GridRect    : TGridRect;
  StringGrid  : TStringGrid;
  i,j         : Integer;
begin
  i:=...;
  j:=...;
  GridRect.Left:=i;
  GridRect.Right:=i;
  GridRect.Top:=j;
  GridRect.Bottom:=j;
  StringGrid.Selection:=GridRect
end;

Вопрос 288:

От: Egorov Alexander

Не можете подсказать, почему не работает следующая программа:

program LockWorkStation;

uses
ShellAPI,
Windows;

{$E scr}
{$R *.RES}

var
c: Char;
begin
if (ParamCount >= 1) and (Length(ParamStr(1)) > 1) then
c := UpCase(ParamStr(1)[2])
else
c := #0;
case c of
'P': ;
'S': ShellExecute(0, 'open',
PChar('rundll32.exe'),
PChar('user32.dll,LockWorkStation'),
PChar('C:\WinNT\System32'), SW_HIDE);
end;
end.

Точнее она работает если запускать вручную, а системой она не запускается.


Ответить.

Ответ 1:
Попробуй
ShellExecute(0, 'open',PChar('rundll32.exe user32.dll,LockWorkStation
C:\WinNT\System32'), SW_HIDE);


Вопрос 289:

От: Алексей К

Здравствуйте.
А как добавить ключ к командной строке, например команда выключения
компьютера "rundll.exe user,exitwindows"?
Что сделать, чтобы запустить 1.exe user,exitwindows? Просто дописание не
помогает.
Спасибо!!!!!

Адрес изменён с <mailto:seagull@aaanet.ruна> seagull@aaanet.ru на
seagull_rnd@mail.ru <mailto:seagull_rnd@mail.ru>
Алексей.

===================Моё первое письмо================

>Здравствуйте!
>Напишите пожалуйста, как будет выглядеть текст программы, окно которой
имеет
>просто одну кнопку, при нажатии на которую запустится программа
C:\1\1.exe.
>И будет ли это работать с относительным путём?
>Я в этом полный ноль.
>Заранее благодарен.
>С уважением Алексей.
===================================================

> Пересылаю Вам письмо:
>
> From: Иван Варанкин < varankin@mail.kz <mailto:varankin@mail.kz> >
> To: DTarasov@kms.dvgd.ru <mailto:DTarasov@kms.dvgd.ru>
> Subject: OtvNaV64
>
> ==============Текст письма===============
> Ответ'
> unit Unit1;
> interface
> uses
> Windows, Messages, SysUtils, Classes, Graphics,
> Controls, Forms, Dialogs, StdCtrls, ShellApi;
> type
> TForm1 = class(TForm)
> Button1: TButton;
> procedure FormActivate(Sender: TObject);
> procedure Button1Click(Sender: TObject);
> private
> { Private declarations }
> public
> { Public declarations }
> end;
> var
> Form1: TForm1;
> implementation
> {$R *.DFM}
> procedure TForm1.FormActivate(Sender: TObject);
> begin
> width:= button1.Width;
> height:= button1.Height;
> end;
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> shellexecute(0, nil, '1.exe', nil, 'c:\1', sw_restore);
> end;
> end.
>
> В инспекторе объектов необходимо указать для Form1:
> BorderStyle:= None;
> Position:= poScreenCenter;
>
> для Button1
> Left:= 0;
> Top:= 0;
>
> Тогда при запуске программы в центре экрана будет отображаться одна
> кнопка, нажатие на которую приведет к запуску другой программы.
>
>
>
> ==============Финал письма===============
>
>
> ICQ : 89533941
> mailto:Dtarasov@kms.dvgd.ru
<mailto:Dtarasov@kms.dvgd.ru> (МПС-*.mps)
>
>
>


Ответить.

Ответ 1:


Вопрос 290:

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

Доброе время суток господа!

1) Подскажите как сделать так, чтобы при выборе моей программы в панели
задач, главная форма перерисовывалась (у меня в программе в цикле
обрабатывается инф-ия)?
2) Как сделать так, чтобы название в панели задач передоически менялось,
т.е. я хочу показывать там процесс обработки инф-ии в % (как это сделано
в DrWeb)?


Ответить.

Ответ 1:
1. Application.ProcessMesage
2.Application.Title
Ответ 2:
1) Не проще ли внутри цикла вставить строку
Form1.Update;
После этого форма будет периодически перерисовываться.

2) Там же внутри цикла
Application.Title := 'Progress '+IntToStr(procent)+'%';
Ответ 3:
1. Во-первых, форма рисуется в событии OnRepaint. Во-вторых, при
переключении задач (читай, форм) возникает событие OnActivate. Вот, в
одном из них (лучше в OnPaint) и укажите действия по прорисовки формы.
2. Как вариант записывайте свои % в свойство Caption формы и /или в
свойство Application.Title.


Вопрос 291:

От: anton


Здравствуйте.
У меня есть компонент VrSpectrum и из него можно сделать
цветомузыку.Скажите как это можно сделать и чтобы компонент работал не
просто так,а именно под ритмы песни,как у WinAmp.Скажите есть ли компоненты
с помощью которых можно сделать проигрыватель типа как WinAmp,но без
использования bmp рисунков.
Антон.



Ответить.

Ответ 1:


Вопрос 292:

От: Eremenko Vitaly

Скажите пожалуйста как из программы прервать выполнение screensaver'a/


Ответить.

Ответ 1:
Ему можно только помешать запустится (прикинутся активным
ScreenSaver-ом)

type
TForm1 = class(Tform)
...
procedure WMSysCommand(var Message: TWMSysCommand); message
WM_SYSCOMMAND;
...
End;

procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
if Message.CmdType = SC_SCREENSAVE then Message.Result := 0
else inherited;
end;
Ответ 2:
//Теоретически можно его закрыть как любое окно
procedure TForm1.Timer1Timer(Sender: TObject);
 Var
   Pnt: tPoint;
   W : hWnd;
begin
  pnt.x := 1;
  pnt.y := 1;
  W :=  WindowFromPoint(Pnt);
  If not(CloseWindow(W)) then MessageBox(0,'','Sorry',0);
 
end;
Ответ 3:
Пошлите скринсейверу сообщение с помощью Sendmessage


Вопрос 293:

От: asd

Подскажите пожалуйста как в DataBase Desktop создать alias для
Microsoft SQL Server ?
Что конкретно нужно вводить в поля при создании aliasa
DataBase = ?
Server Name = ?
User Name = ?
Open Mode = ?
Schema Cache = ?
Blob Edit = ?
LangDriver = ?
SQLQRYMODE = ?

А как также создать alias для Oracle ?

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


Ответить.

Ответ 1:
DataBase = ИмяТвоейБазы данных. Вообщем-то можно и не указывать, потом
перейти к ней с помощью use ИмяТвоейБазы данных. Но для удобства работы
лучше указать
Server Name = Имя сервера
User Name = имя по умолчанию, под которым будешь логиниться на сервер.
Можно
не указывать, все равно потом переспросит, вместе с паролем
Open Mode = ReadOnly, Read/Write. Комментарии нужны?
Schema Cache = Число таблиц SQL, информация о которых будет
кешироваться. От
0 до 32.
LangDriver = Язык. Тебе понадобится PDox ansi Cyrillic
SQLQRYMODE = Где в первую очередь выполняются запросы, на сервере или
клиенте. Можешь оставить пустым, тогда запрос сначала пересылается на
сервер, а при отказе сервера выполняется локально (надо полагать из
кеша).
Вообще эти вещи лучше настраивать из BDE Administrator'a, ткам больше
параметров доступно и хелп толковее

>А как также создать alias для Oracle ?
Аналогично
Ответ 2:
DataBase Desktop тебе не поможет.
Необходимо сначала создать Алиас в BDE администратор, потому что DeskTop
работает только через BDE.
Я не знаю подробностей создания алиаса для MS SQL, а для Oracle
необходимо сделать следующее
по пунктам.
1. Установить клиентское ПО для подсоединения к Oracle (для Oracle 7
sql*net2, Oracle8 sql*net8)
2.Настроить TNSNAMES.ORA для работы с БД(спросить у администратора)
 
В BDEAdmin
настроить драйвер NATIVE ORACLE установить ему DLL32 - ORACLE7.3 или
ORACLE8 (в зависмости от версии ядра Oracle)
Соотвественно VENDOR должен быть либо SQLORA32.DLL или OCI.DLL
 
LANG DRIVER PdoxAnsiCyrillic ибо только с ним Oracle нормально работает.
Пользователя и пароль тебе должен дать администратор ORACLE.
 
Вот и все. Остальные настройки не существенны.


Вопрос 294:

От: Dizzer

Hello ALL!

Как можно в ОДИН файл сахронить несколько картинок из Image и
текстовую информаию, чтобы можно было любую картинку или строку
текста загрузить?

Спасибо за помощь...




Ответить.

Ответ 1:


Вопрос 295:

От: Roman Vdovenkov

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


Ответить.

Ответ 1:
Если использовать Async Pro 3.0 то можно звонилку написать одной мышкой. .) А если еще и кода ручками добавишь, то
получиться полноценная звонилка.


Вопрос 296:

От: Вадим Шешунов


> Все очень просто:
>
>
> uses Windows, ..., Classes, MMSystem;
>
> ...
>
> with MediaTable do // таблица с медиа-блобами :)
> ...
> if not Fields[k].IsNull then // Fields[k] - поле с БЛОБом - не пустое?
> begin
> (Fields[k] as TBlobField).SaveToStream(AudioDev);
> AudioDev.Position:=0;
> sndPlaySound(AudioDev.Memory, SND_ASYNC or SND_MEMORY or SND_LOOP);
> end;
>
> ...
> // ну и это не забудь!
> procedure TFormХХХ.FormDestroy(Sender: TObject);
> begin
> sndPlaySound(nil, 0); // так можно прекратить проигрыш в любом
> // месте программы
> if AudioDev<>nil then
> AudioDev.Free;
> if MediaTable.Active then
> MediaTable.Close
> end;

Но, увы, этот принцип проблемы не решают. Дело в том, что надо проигровать
файлы размером более 100 кб, а ни sndPlaySound, ни PlaySound не справляются
с файлами таких размеров. Вообще-то, я разобрался с проигрованием mp3-, wav-
и mid-файлов mci-функциями. Но, как проиграть не дисковый файл, а образ
памяти, я пока не могу сообразить. Просто, мне нужно при переходе от записи
к записи в таблице БД проигровать содержимое поля с образом муз. файла,
причем минимизировав время на "раскачку". Я думаю, что саму музыку лучше
хранить не в BLOB, а в MEMO-поле. Но как это содержимое играть - не знаю. А
очень хотелось бы узнать. Буду благодарен за любые советы!


Ответить.

Ответ 1:


Вопрос 297:

От: Андрей Щавелев

Ситуация: из программы, написанной на Delphi, запускается DOS-задача (например,
rar.exe):

shellexecute(0, 'open', 'rar.exe' , <параметры>, nil, SW_HIDE);


Вопрос: Каким образом организовать ожидание завершения этой DOS-задачи? Т.е.
Надо подождать, пока заархивируется файл, и далее обработать его.


Ответить.

Ответ 1:
Сделать можно примерно так:
uses
...,windows,...

procedure RunRarAndWait;
var
si: TStartupInfo;
pi: TProcessInformation;
begin
//подготовливаем записи si и pi к использованию
FillChar(si, SizeOf(si));
si.cb := SizeOf(si);
FillChar(pi, SizeOf(pi));
//попытаемся запустить рар
if CreateProcess('rar.exe', 'parameters',
nil, nil, //безопасность по умолчанию
false, //не наследовать хэндлов
0, //флаги создания по умолчанию
nil, //переменные среды по умолчанию
nil, //текущая директория по умолчанию
si, //стартовая информация
pi) //а в эту запись получим информацию о созданом процессе
then
begin //удалось запустить рар
//подождем пока рар работает
WaitForSingleObject(pi.hProcess, INFINITE);
//убираем мусор
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end else
//выдаем сообщение об ощибке
MessageDlg(SysErrorMessage(GetLastError), mtError, [mbOK], 0);
end;
Ответ 2:
function WinExecute(CmdLine: string; Wait: Boolean): Boolean;
var
StartupInfo: TStartupInfo;
ProcessInformation: TProcessInformation;
begin
Result := True;
try
FillChar(StartupInfo, SizeOf(StartupInfo), 0);
StartupInfo.cb := SizeOf(StartupInfo);
if not CreateProcess(nil, PChar(CmdLine), nil, nil, True, 0, nil,
nil,
StartupInfo, ProcessInformation) then RaiseLastWin32Error;
if Wait then WaitForSingleObject(ProcessInformation.hProcess,
INFINITE);
except
Result := False;
end;
end;
Ответ 3:
Нашел статью:
Запуск внешнего приложения и ожидание его завершения
Автор: Fabrнcio Fadel Kammer

Пример показывает как из Вашей программы запустить внешнее приложение и
подождать его завершения.

function ExecAndWait(const FileName, Params: ShortString; const
WinState:
Word): boolean; export;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: ShortString;
begin
{ Помещаем имя файла между кавычками, с соблюдением всех пробелов в
именах
Win9x }
CmdLine := '"' + Filename + '" ' + Params;
FillChar(StartInfo, SizeOf(StartInfo), #0);
with StartInfo do
begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WinState;
end;
Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil,
false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil,

PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);
{ Ожидаем завершения приложения }
if Result then
begin
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
{ Free the Handles }
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;
end;


А вот пример вызова этой функции:

ExecAndWait( 'C:\windows\calc.exe', '', SH_SHOWNORMAL)

Параметр FileName = Имя внешней программы.
Параметр Params = Параметры, необходимые для запуска внешней программы
Параметр WinState = Указывает - как будет показано окно:
Для этого параметра мы можем так же использовать
следующие
константы:
SW_HIDE, SW_MAXIMIZE, SW_MINIMIZE, SW_SHOWNORMAL

PS: Этот код тестировался в delphi версий 3, 4 и 5.
Ответ 4:
function TForm1.StartWithShell(Prog, par, Verz: string; var hProcess :
THandle) : DWord;
var
exInfo: TShellExecuteInfo;
begin
hProcess := 0;
FillChar( exInfo, Sizeof(exInfo), 0 );
with exInfo do begin
cbSize:= Sizeof( exInfo );
fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
Wnd := 0;
lpVerb:= 'open';
lpParameters := PChar(par);
lpFile:= Pchar(prog);
nShow := SW_HIDE;
end;
Result := ERROR_SUCCESS;
if ShellExecuteEx(@exInfo) then
hProcess := exinfo.hProcess
else
Result := GetLastError;
end;

function TForm1.StartProgramm : Boolean;
var
r, ExitCode : DWord;
err : string;
hProcess : THandle;
begin
Result := False;
r := StartWithShell('rar.exe', <parametr>, 'c:\windows\system',
hProcess);
if r = ERROR_SUCCESS then begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(hProcess, ExitCode);
until (ExitCode <> STILL_ACTIVE);
result := true;
end else begin
case r of
ERROR_FILE_NOT_FOUND : err:='The specified file was not
found.';
ERROR_PATH_NOT_FOUND : err:='The specified path was not
found.';
ERROR_DDE_FAIL : err:='The DDE transaction failed.';
ERROR_NO_ASSOCIATION : err:='There is no application associated
with the given filename extension.';
ERROR_ACCESS_DENIED : err:='Access denied';
ERROR_DLL_NOT_FOUND : err:='DLL not found';
ERROR_CANCELLED : err:='The function prompted the user for the
location of the application, but the user cancelled the request.';
ERROR_NOT_ENOUGH_MEMORY: err:='Not enough memory';
ERROR_SHARING_VIOLATION: err:='A sharing violation occurred.';
else err:='Unknown';
end;
MessageDlg('Error: ' + err, mtError, [mbOk], 0);
end;
end;
Ответ 5:
В голове мелькнула следущая сумасшедшая идея решения задачи -))))))
Перед запуском архиватора создайте на диске временный файл с уникальным
именем (не важно, что у него внутри). Сам архиватор запускайте через
bat-файл, в котором последним делом удалите наш временный файл. А в
программе после оператора запуска пакета, запустите таймер на тикание. В
обработчике тиков проверяйте наличие временного файла. И как только его
не станет, это будет означать, что архиватор отработал.

Вопрос 298:

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

Доброе время суток!

Господа, подскажите как из Delphi правильно сделать отчёт в Word'e по
шаблону, (а то методом научного тыка ни фига не получается) или
подскажите где взять имено такую документацию (в смысле: создание
отчётов по шаблону).

Заранее благодарен.

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


Ответить.

Ответ 1:


Вопрос 299:

От: Galya M. Fedorkiv

Работая с Delphi 5, столкнулась со следующей проблемой. Она состоит в следующем.
Для построения отчетов использую компонент QuickRep. Если на компе
установлен драйвер к матричному принтеру все работает и печатает
нормально. Если же установить драйвер к лазерному принтеру -
невозможно ни запустить exe-шник данного проекта, ни даже открыть
проект в самом Delphi (не открывается модуль, который содержит этот
компонент). Возникает конфликт с драйвером принтера и программа
закрывается.
Если установить одновременно драйвера к матричному и лазерному
принтеру, поставив по default-у матричный принтер - можно работать
(проект запускается, exe-шник запускается и работает нормально) пока
дело не доходит до распечатывания отчета. Если руками поменять драйвер
принтера на лазерник - он отчет напечатает, но потом все равно
вывалится.
Может Вы можете что-то посоветовать. Заранее благодарна.:


Ответить.

Ответ 1:
Возможно проблема в самом драйвере лазерного принтера.
Сам видел как валился PowerBuilder при попытке печати на Epson принтер,
поменяли драйвер все заработало нормально.
Ответ 2:
У меня была такая проблема, когда не было установлено ни одного
принтера. Мне кажется, что дело в размере и ориентации страницы в
свойстве OPTION в этом компоненте. Т.е. если там установлена страница
А3, а принтер этого не поддерживает, то отчет само собой работать не
будет. Возможно дело и в отступах сверху, слева, ...
Ответ 3:
Посоветовать можно только одно - не используй QuickRep. В свое время мы отказались от него по причине страной
глюкавости последнего. Отчеты мы делаем просто - генерим rtf файл, а потом запускаем ворд. Таким образом получается
намного проще и красивее. И от версии оффиса как бы не зависим. .)
Ответ 4:
У меня тоже такое, но только с разными лазерными принтерами -если HP
LJ-5p -
все нормаально, а если Xerox DocuPrint - не работает. Лечится установкой
драйвера PostScript (в моем случае играла роль даже версия драйвера)


Вопрос 300:

От: Vladimir Zabludovsky

Не налетал ли кто на такую штуку :
Delphi5 + MSSQL 7 - Вызываю хранимую процедуру через компонент ADO.
Если просто запускаю скомпилированный .exe - все работает,а если проделываю
то-же самое под delphi , то SQL возвращает синтаксические ошибки (как будто в
SP просто не дописана).
Может кто знает как с этим бороться.


Ответить.

Ответ 1:
Нет не налетал, а процедуры вызываю не через
TADOStoredProc, а через TADOQuery - может здесь собака порылась?
Ответ 2:
Поставь асинхронный доступ к базе, но работать с
асинхронным доступом довольно хлопотно - много
проверок на завершенность кверей и т.п., например если
к квере привязан грид и ты после открытия квери хочешь
изменить ширину колонки - то сразу получишь ошибку - в
первый момент после открытия, результата еще нет,
следовательно и колонок в гриде нет, а ты их меняешь...


Вопрос 301:

От: "Лобастов Николай"

Доброе время суток.

Я пытаюсь создать объект:

TDocument = class(TComponent)
end;

Так вот, в этом классе должны быть поля BrowseForm и EditForm
Вот так:

TDocument = class(TComponent)
BrowseForm: TBrowseForm
EditForm: TEditForm
end;

Это обычные окна. BrowseForm содержит DBGrid и несколько Button.
Объект Document должен иметь метод Browse для открытия окна BrowseForm.
Вот тут-то и проблема. Окна я использую fsMDIChild. Они при создании
сразу же являются миру.
Поэтому я не могу их создавать при создании Document. Да это и не нужно.
Лучше создавать по мере надобности и уничтожать после использования.
Теперь создаем объект
TPlatejka = class(TDocument).
Окно BrowseForm уже не
отвечает своим требованиям и нужно окно TPlatBrowseForm =
class(TBrowseForm).
И как мне подключить это окно к объекту TPlatejka. Я пробовал создать
свойство
BrowseForm. Но присваивать BrowseForm := TPlatBrowseForm.Create(Self) не
могу, т.к.
Окно сразу же появляется. И как в таком случае описать метод Browse в
объекте
Document и в объекте Platejka. И вообще нужно ли инкапсулировать объект
BrowseForm в
Document.
И как создать такой компонент? Возникает куча проблем. Можно ли в одном
компоненте использовать несколько окон. Насколько я понимаю производные
от TForm нельзя поместить на палитру. Их можно только вызывать из меню
New.
Если кто такое уже делал, буду очень признателен за
предоставленный код.

С уважением, Николай.


Ответить.

Ответ 1:


Вопрос 302:

От: Mikhail A. Loginov

Вопрос имеющим опыт написания ISAPI-приложений, работающих с базами данных.
Решил ли кто-нибудь проблему постраничного вывода выборки данных в таких
библиотеках?
Речь идет о возможности просмотра многострочной выборки порциями, по
страничкам. Видел решения средствами SQL, но они работают в определенных
условиях (есть ключ и выборка отсортирована по этому ключу).
В ASP имеется возможность использовать методы ADODB.RecordSet такие как
PageSize, AbsolutePage, PageCount, которые позволяют осуществить свободную
постраничную навигацию по выборке любой длины.
Я не нашел в Delphi интерфейса к таким методам ни для ADO ни для BDE.



С уважением,

Mikhail Loginov








Ответить.

Ответ 1:


Вопрос 303:

От: Nikiforov V.A.

Существует ли возможность уже работать с результатом запроса
к БД, пока он ещё до конца не выполнился? (по принципу Интернета)


Ответить.

Ответ 1:
Это зависит от запроса, базы данных и драйвера.

Иногда индексы позволяют определить порядок записей в наборе, не
получая всех записей. Например, в SQL Oracle есть директивы,
позволяющие указать оптимизатору, как выполнять запрос: вернуть
управление после первой записи или перекачать все записи набора
данных.
В библиотеке Direct Oracle Access у объекта Query есть такие свойства.
Они и влияют на выдаваемый запрос.

Возмём самый простой пример.
TTable подключенная к серверу.

TTable точно так же работает как TQuery.
Он просто выдаёт запрос
select * from .... order by ....

Но ведь мы не получаем всю таблицу, перекачанную по сети !
Данные возвращаются по мере необходимости.
Это потому, что выбранный индекс прозволяет определить порядок
записей, не считывая всю таблицу !


Вопрос 304:

От: "Бузуверов Михаил"

Подскажите пожалуйста, как сделать взаимодействие между
двумя Delphi-приложениями в локальной интрасети, работающей по протоколу
TCP/IP. Если можно, пришлите пример с исходником на e-mail.


Ответить.

Ответ 1:
Есть интересный пример пересылки сообщений по TCP протоколу, наподобие
программы WINPOPUP, только скорость у этой гораздо больше.
Смотреть:
%КАТАЛОГ_DELPHI%\DEMOS\INTERNET\MSG


Вопрос 305:

От: oilplant

Возможно ли при загрузке файла в RichEdit
автоматически использовать перекодировку символов DOS -> Windows,
если это не возможно, подскажите,
как это лучше сделать.
А то при обработке каждого символа этот процесс занимает много
времени.


Ответить.

Ответ 1:
Я использовал в своей программе след. ф-цию
.........................................................
procedure ConvertText;
var Src,Str:PChar;
begin
with Form1 do
if OpenFileForm2.CheckBox1.Checked then
// Convert to 1251
begin
Src:=RichEdit1.Lines.GetText;
Str:=RichEdit1.Lines.GetText;
OemToChar(Src,Str);
RichEdit1.Lines.SetText(Str);
end;
end;
.................................................
В ней есть маленький недочет - вместо символа 'Ѓ' она пишет '?'.
Чую я, что можно сделать как-нибудь еще проще и быстрее, но руки не доходят, а
результаты вполне устраивают.


Вопрос 306:

От: Igor Tolstik (www.irop.de)

Слышал, что существует программа, которая показывает текст кода
программы.
Это правда? Знает кто-нибудь где можно её найти и опробовать?
Я не хочу взламывать другие программы, а хочу быть уверенным в своей
защите.


Ответить.

Ответ 1:
Программа называется SoftIce.Производитель Numega
Ответ 2:
Вашу программу (и не только Вашу) при большом желании можно всегда
взломать. Еще не создана такая защита которая не была бы взломана!!!
 
Просто стоит вспомнить, что все что запускается на компьютере,
исполняется процессором. Язык процессора - это то же самый ассемблер. А
уж дизассемблеров пруд пруди! Вот небольшой список:
 
SoftICE
IDA (Interactive DisAssembler)
Hiew
 
Так что не стоит создавать сложную защиту, если стоимость разработки
этой защиты, выше стоимости её взлома :-)
 
Вспомните хотя бы приложения которые Вы используете повсеместно (WinRAR,
ReGET, Windows Commander, The Bat, Windows 95/98/ME :-)!!! ). Обычно
через неделю после выхода очередной версии таких программ в Интеренте
можно найти либо рег/ключ, либо крякер который меняет пару байтиков в
программе и она становится и регистрированной и лицензионной и какой
угодно :-)))

Вопрос 307:

От: Nostradamus

:Здравствуйте,

У меня такая проблема: я сделал ловушку :
SetWindowsHookEx(WH_Shell, ... и тд). Эта ловушка ловит создание и удаление
окон других приложений и посылает сообщение основной программе (ловушка в dll конечно). Проблема состоит в том что все пойманные ловушкой окна не
появляются в трее как будто у них isLibrary в True стоит. Как этого избежать?



Ответить.

Ответ 1:


Вопрос 308:

От: Jura Goliakov

Пытаюсь написать 3D-game.
Необходимо сделать быстрый вывод на экран или форму прямоугольника пикселов
из массива TColor? Поточечный вывод, ScanLine, перевод в BMP - слишком
медленны. Вроде, надо как-то использовать память (Z-буфер), но я в этом
чайник. Нужен пример.


Ответить.

Ответ 1:
Примера будет мало. Нужно почитать литературу по OpenGL или DerectX для Delphi. Тема очень серьезная и требует
длительного изучения.
Ответ 2:
Просто для вывода изображения используйте DirectDraw.
Если вы хотите сделать именно 3d, то используйте Direct3d
или OpenGL. Рекомендую OpenGL.

Вопрос 309:

От: Vladimir

Может, кто-то поможет
1) Дано: проект с формой, на ней компоненты (rxtrayicon, rxpopupmenu, timer)
Можно ли сделать проект с этими компонентами, но без формы, чтобы программа
сразу лезла в трей,
а при необходимости можно было бы вызывать форму (с другими компонентами)
например, из DLL?
Конечно, если такое возможно.
2) Можно ли закрасить форму с переходом цветов не по горизонтали или
вертикали, а под углом?


Ответить.

Ответ 1:
1) Можно. Applcation.ShowMainForm := False; и форма твоя главная при запуске не будет появляться на экран,
но сущетвовать будет. А там вызывай что угодно и откуда угодно.

Вопрос 310:

От: Oleg Klimchuk

Для построения отчетов использую QReport.
Но появилась необходимость печатать не на листовую
бумагу, а на рулонную, т.е. без разделений на листы.
Подскажите как это сделать. В хелпах я не обнаружил.


Ответить.

Ответ 1:








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

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

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

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

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



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться Рейтингуется SpyLog

В избранное