← Ноябрь 2001 → | ||||||
2
|
3
|
4
|
||||
---|---|---|---|---|---|---|
5
|
6
|
7
|
9
|
10
|
11
|
|
12
|
13
|
14
|
15
|
17
|
18
|
|
19
|
20
|
21
|
23
|
24
|
25
|
|
26
|
27
|
28
|
30
|
За последние 60 дней 2 выпусков (1-2 раза в 2 месяца)
Сайт рассылки:
http://www.interface.ru, www.itshop.ru
Открыта:
16-01-2001
Адрес
автора: comp.soft.win.mydelphi-owner@subscribe.ru
Статистика
-3 за неделю
Проблемы и решения в Delphi #29
Проблемы и решения в Delphi - выпуск 36 от 16.11.2001.
Человек - это звучит гордо!
Человек! - водки мне и огурчик!
ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС
Доброго Вам времени суток уважаемый читатель.
Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Очередные вопросы.
2. Отвеченные вопросы.
~~~~~~~~~~~~~~~~~~~
1. Очередные вопросы.
---------------------
Вопрос 556:
От: Yashkin Denis
Есть база на MS SQL и несколько
клиентов. Пусть один клиент в ней
чего-нибудь делает (например удаляет запись).
Как сделать чтобы этот факт отразился у
всех остальных клиентов автоматически, а
не после того как они нажмут кнопку Refresh
(например)?
Ответить.
Ответ 1:
Вопрос 557:
От: Leonid A. Zimin
Кто может подсказать адрес, с которого можно скачать исходные коды INAP
(Informix Native Access Pack) или, если таковые имеет, может выслать.
Версия
особого значения не имеет, но, естественно, 2.1.4 Build 130 или 2.1.5
Build
131 предпочтительнее.
Ответить.
Ответ 1:
Вопрос 558:
От: Dmitry S. Kosarev
как заначения ListBox записать в файл, а если
этот
файл существует, то переписать. По идее SaveToFile это и делает, но у
меня
ничего не получилось... Выдаётся ошибка.
Вот пример:
ListBox1.Items.SaveToFile('file.txt');
Подскажите в чём ошибка.
Ответить.
Ответ 1:
Вопрос 559:
От: Dush Dushin
есть форма, на форме DBGrid.
Находясь в DBGrid-е нажимая ESC происходит удаление записи, а
нужно закрытие формы. Если это актуально, то работаю
под СУБД INTERBASE.
Ответить.
Ответ 1:
Вопрос 560:
От: Izotko Sergej
Подскажите пожалуйста как пользоваться EnableHardwareInput. Моя прога
отрубает по времени мышку и клаву. У меня загвоздка в отрубании.
Перепробовал несколько способов, но нифига не выходит. Как быть не
знаю. Если можно пришлите примерчик. Может есть какая-нибудь
альтернатива EnableHardwareInput? Если есть, то пришлите.
Ответить.
Ответ 1:
Вопрос 561:
От: Ovtchinnikov Kirill
Недавно начал читать рассылку, и у меня уже родилось множество вопросов.
Вот они:
-> Как сделать на Delphi программу, которая работает как прокси-сервер
(я имею в виду на локальном компьютере) (например Naviscope, GetSmart и
т.д.)? Желательно пример.
-> Как узнать, какие процедуры есть в DLL-ке?
-> Есть ли у кого-нибудь компонент или модуль для работы с архиватором
ACE?
-> Для уменьшения размера программ, я включил опцию Build Run-time
Packages (или что-то типа такого, не помню точно). В help system
написано, что с программой необходимо распространять какую-то
библиотеку. А какую?
Ответить.
Ответ 1:
Вопрос 562:
От: zmv
У меня к уважаемым метрам два вопроса:
1) В компоненте StringGrid ставлю возможность редактирования.
Естественно, при вводе данных должен отображаться курсор (и он
отображается в большинстве случаев!!!). Но на
некоторых машинах он не отображается, и я даже не могу понять, что
между этими машинами общего - вроде мониторы разные, разрешение не
специфическое, операционные системы тоже стоят Windows 98 или 2000.
Может, кто-нибудь знает, в чем тут фишка?
2) Не может ли мне кто-нибудь подсказать хороший и правильный подход
для того, чтобы при максимизации окна все содержимое формы тоже
адекватно расширялось? Я понимаю, что можно обрабатывать событие
OnResize и проверять WindowState, но это событие меняется как-то
заторможенно. Вроде бы оно по OnResize уже должно измениться - ан нет,
ничего подобного!!! Кроме того, не очень приятно все компоненты каждый
раз заново выравнивать. А другого пути нет?
Ответить.
Ответ 1:
Вопрос 563:
От: -= MTsv =-
1.
Программа работает в цикле, в свернутом состоянии.
Как перехватить нажатие клавиши "Esc", чтобы остановить цикл ???
2.
Столкнулся с проблемой увеличения приоритета для программы.
ПРЕДИСЛОВИЕ:
При нажатии кнопки происходит запуск процедуры.
В процедуре длинный, однообразный цикл (который постоянно вызывает
одну и туже функцию).
Как увеличить приоритет выполнения процедуры ??? (Если можно по
шагам)
Ответить.
Ответ 1:
Вопрос 564:
От: Ivan
я получаю письмо, допустим стандартным компонентом Delphi,
он
сразу сохраняет вложение в файл. А как можно получить email и сохранить
вложение, например, при нажатии на определённую кнопку... Какой лучше
компонент использовать( Freeware).
Ответить.
Ответ 1:
Вопрос 565:
От: Koda666
Подскажите как из Дельфи создать или изменить макросы в вордовском
документе,как работать с шаблонами,например сделать проверку на
присутствия в макросах
определённой строки текста ?
Ответить.
Ответ 1:
Вопрос 566:
От: banov
1. Как узнать, запущено ли другое приложение, зная его адрес на винте?
2. Как запустить прогу и дождаться её завершения?
Ответить.
Ответ 1:
Вопрос 567:
От: Богер Александр
Как из Дельфи просмотреть какие функции экспортирует DLL?
Эсли кто может дайте ссылки на готовые программы.
Ответить.
Ответ 1:
Вопрос 568:
От: Воробьев Сергей
Подскажите как с помощью Open Tools Api, отследить момент, когда идет
переключение между формами, не прибегая к таймеру и не вешая на OnTimer
ToolServices.GetCurrentFile?
Ответить.
Ответ 1:
2. Отвеченные вопросы.
----------------------
Вопрос 516:
От: Andrey
Привет, у меня вопрос не совсем по Delphi он по Turbo Pascal. У меня
проблема надо запустить несколько процедур как отдельные процессы. Т.е.
каждая процедура должна выполнятся как отдельный процесс независимо от
других частей программы. Я думаю, что для этого необходимо перехватить
прерывание от таймера (int 8h). Как это сделать не знаю. Если кто знает
как
это сделать то подскажите нужно позарез.
Ответить.
Ответ 1:
вообще я перехватывал помоему так...
давно правда это было,но могу поискать какие-нибудь исходники
{$M 10240,0,0}
uses dos,crt;
var
Vector : Procedure;
r:registers;
procedure Running; interrupt;
var
r:registers;
begin
{тут делаешь свою процедуру, только когда будешь
использовать прерывания сохраняй значения регистров,
а то все взвиснет намертво}
inline ($9C);
end;
begin
swapvectors;
GetIntVec($08,@Vector);
swapvectors;
SetIntVec($08,Addr(Running));
Keep(exitcode);
end.
Вопрос 517:
От: ТВ
Подскажите как в DBGrid, используя список PickList поля для
выборки заготовленных значений, запретить пользователю
вводить значения вручную(т.е. чтобы можно было только из
заготовленного списка)? Если это возможно.
Или, может другой Grid какой это умеет?
Ответить.
Ответ 1:
Для того, чтобы кнопка списка показалась, а само значение поля записи не изменилось, напишите обработчик TDBGrid.OnKeyPress:
procedure TfrmCreateDB.dbGrid1KeyPress(Sender: TObject; var Key: Char);
begin
.....................
Key := #0;
end;
Я, правда, не знаю, как программно "вывалить" сам список.
Ответ 2:
Попробуй воспользоватьтся DBGridEh из библиотеки EhLib
http://www.farpost.com/personal/dmitryb
Ответ 3:
:'Существуют Lookup поля. По аналогии с вычисляемыми. И там же и
настраиваются, где вычисляемые. Посмотри, там все просто.
Вопрос 518:
От: Sergey Smirnow
Мне надо чтобы при нажатии на Button1 на моей форме, в консольном
приложении(сеанс "мс-дос") зная его handle был нажат enter(то есть
осуществлен переход на следующую строку). Знаю что это делается через
виртуальные коды, но не знаю как. икто исходник не подкинет?
Ответить.
Ответ 1:
Не понял, а где ты видел виндовою форму и к тому же с кнопкой в
консольном приложении????
Ответ 2:
SendMessage(Handle,...)
параметры посмотри для сообщения WM_KEYDOWN
Ответ 3:
SendMessage(Handle, wm_KeyDown, 13, lParam);
13-виртуальный код Enter
lParam должен нести дополнительныю информацию его необходимо
подготовить под конкретную ситуацию (подробнее см. Help на
wm_KeyDown), но можно использовать такой: $00000001.
Вопрос 519:
От: Алекперов Ровшан
Господа не подскажете адреса сайтов с компонентами для Delphi с
лицензией типа freeware for commercial use.
Ответить.
Ответ 1:
www.torry.net
Ответ 2:
А вообще на yandex.ru введи 'компоненты Deplhi', а далее смотри по
контексту, только при скачивании смотри на размер файла, если просто
TLabel2001 будет занимать >100Kb, значит в архиве либо
скомпилированн EXE, демонстрирующий работу компонента, либо сам
компонент в виде DCU, что не есть гуд, т.к. он может не подходить к
твоей версии Delphi и автор не публикует исходники, что в большинстве
случаев указывает на платность компонента
Вопрос 520:
От: Tsatur
Как мне перехватить обращение какой-либо программы к CD и
переслать на винт.
Например, я запускаю прогу, она обращается к файлу на CD ( напрмер,
E:\games\x.exe). Как мне перехватить обращение и переслать к файлу на
винте(c:\games\x.exe)?
Ответить.
Ответ 1:
Попробуй прошпионить сообщения (WinSight)
Отловишь своё - заменить букву привода - дело техники
Вопрос 521:
От: Boris G. Bark
Такой вопрос: как при свернутом приложении на панели задач что-либо
вписать в кнопку (например как в FARе проценты при копировании).
Ответить.
Ответ 1:
Application.Title := 'что-то' - вот и все
Вопрос 522:
От: Игорь Маринин
Возможо ли читать, писать голос в модем используя TAPI ?
Если да, то где можно найти русское описание.
Ответить.
Ответ 1:
Вопрос 523:
От: Yashkin Denis
Как работать с СОМ портом (открыть, закрыть, настроить,
записать, считать). Понятно, что программно это выглядит
как специфичное открытие текстового файла. Однако хотелось
бы прочитать конкрктный элементарный пример. Спасибо.
Ответить.
Ответ 1:
Вопрос 524:
От: Для отправки
Очень хочу прочитать предыдущие сессии CDROM. Подскажите чем можете.
Ответить.
Ответ 1:
Вопрос 525:
От: Vampir
Не подскажите как запретить изменения размера окна формы (например по
горизонтали)?
Ответить.
Ответ 1:
Не пропускать сообщение о изменении дальше в диспетчере сообщений
Ответ 2:
Нужно обрабатывать сообщение WM_GETMINMAXINFO.
Ответ 3:
Если у тебя Delphi 5 то у формы есть такое свойство Constraints
Если поставить MaxWidth = 240 и MinWidth = 240 то изменений не будет
Либо воспользоваться компонентой FormPlacement или FormStorage из
библиотеки
RxLib.
Ну на крайний случай можно перекрыть событие WM_GETMINMAXINFO.
Ответ 4:
Как ограничить изменение размера только по горизонтали или вертикали не
знаю, а вот как вообще ограничить изменение размеров формы
В object Inspector у формы измени свойство BorderStyle на bsDialog -
размеры
изменить не удастся. Вообще поиграйся с этим свойством.
В свойстве BordeerIcons можешь убрать кнопки в верхнем правом углу
формы,
тогда пользователь не сможет и расширить форму на весь экран.
Ответ 5:
в событии OnResize пишешь, например, Form1.Width=200
Ответ 6:
Используй Form->Constraints
Constraints.MaxWidth=Constraints.MinWidth=(то че нать больше нуля)
Ответ 7:
По-моему надо перехватывать событие WM_SIZING.
Это событие посылается форме при любых изменениях
размеров(сворачивании,разворачивании т.д)
пишем
procedure WMSIZING(var Msg:TMessage); message WM_SIZING;
Как только это сообщение окажется в очереди вызовется на обработку
наша фия WMSIZING(при ее раскрытии писать message WM_SIZING не
нужно).
в одном из параметров (wParam )переданных в эту фию будет код произошедшего
события. Если это не нужное нам изменение то мы просто обнуляем его
(параметр через var передается).
procedure WMSIZING(var Msg:TMessage);
begin
if Msg.WParam=WMSZ_LEFT then Msg.WParam=0
esle
inherited;//вернуть обработку по умолчанию
end;
Рядом нет Дельфи -проверить не могу, поэтому лучше еще раз прочитайте Programmers
Refererence на ключ WM_SIZING.
Ответ 8:
Если у тебя 4.0-5.0 то в свойстве формы Constraints есть MaxWidth amp& MinWidth. Поставь им одинаковые значения.
Если версия Delphi ниже - пиши обработчик для обработки WM_NCHITTEST. Это что-то вроде:
...
TForm1 = class (TForm)
...
private
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHitTest;
....
end;
...
procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
var res: integer;
begin
res := DefWindowProc(TForm1.Handle, Msg.Msg, Msg.Unused, integer(Msg.Pos));
if (res = HTLEFT) or (res = HTRIGTH) then // курсор над левой/правой границей формы
res := HTNOWHERE
Msg.Result := res;
end;
Вопрос 526:
От: Кабанов Артур Александрович
Как при выводе MDIChild окна запретить кнопку закрытия основного окна
программы.
Ответить.
Ответ 1:
на OnClose проверять
if MDI.Child.Handle=nil then Action=caClose
else Action=caNone
Ответ 2:
Насколько я правильно понял Вам надо запретить
закрытие главного окна если в нем есть дочерние.
Используйте событие OnCloseQuery главного окна.
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if MDIChildCount>0 then CanClose:=false;
end;
При входе в метод CanClose=true.
Если установить CanClose:=false; и завершить метод, то окно TForm1 не может быть закрыто никаким нормальным способом, кроме как
аварийным звершением всего приложения.
Тут же можно предупредить пользователя о необходимости закрыть дочерние окна.
Вопрос 527:
От: Артем Колодяжный
1) Подскажите как в Делфи вызвать Outlook Express, так чтобы при его
открытии создавалось сообщение с вписанными : адресами(кому и от кого) и
темой, а также текстом сообщения (считываемом с заданного текстового
файла).
2) И подскожите как в Делфи сделать, чтобы вызвался Outlook Express и
при
его
открытии доставлялась почта, причем копии полученных сообщений, если
сообщения есть, записывались в заданные текстовые файлы.
Ответить.
Ответ 1:
Без Outlook можно
TNMSNTP компонент
Ответ 2:
1.
var em:subject,em_body,em_mail:String;
begin
em_subject:='This is a subject line';
em_body:='Message body text goes here';
mailto:em_mail:='mailto:coolsong@mail.ru?subject='+em_subject+'amp&body='+em_body">
mailto:em_mail:='mailto:coolsong@mail.ru?subject='+em_subject+'amp&body='+em_body">mailto:em_mail:='mailto:coolsong@mail.ru?subject='+em_subject+'&body='+em_body
ShellExecute(Handle,'open',PChar(em_mail),nil,nil,SW_SHOWNORMAL);
end;
2. Второе через дельфи реализовать нельзя. Но можно поставить галочку в Outlook Express чтобы он получал почту автоматически при старте
программы. А сам аутлук запускать из дельфи таким образом:
ShellExecute(Handle,'open','путь_к_аутлуку_вместе_с_именем_файла_аутлука',nil,nil,SW_ShowNormal);
Далее настроить фильтры аутлука таким образом, чтобы он записывал
сообщения в зависимости от свойств письма(from, to, subject, attaching и
т.д.) в разные свои папки. Только так. А как дельфи чтобы ещё их
обрабатывал, я не знаю.
Ответ 3:
1)uses ..., ShelAPI;
var
SomeStr,SubjStr,BodyStr:string
begin
SomeStr:='mailto:AlexVVH%20<delphi@australia.edu>?Subject='+SubjStr+'amp&body='+BodyStr;
ShellExecute(form1,'open',PChar(SomeStr),'','',SW_SHOW);
end
Поле от кого заполняется почтовиком; в строке SomeStr ВСЕ пробелы
замени на '%20', а ВСЕ символы #13#10 - на '%13%10'.
2)Может проще самому написать почтовый клиент?
P.S. Ориентироваться только на Outlook не стоит, если ты сможешь
решить свой второй вопрос с аутлуком, то на машине с TheBat! твоя
программа работать не будет
Вопрос 528:
От: Den Timets
не работает ф. regconnectregistry (подключение к реестру на удал. комп.)
пробовал с разрешением удаленного управления- тот же рез.
не хочет подключаться к компу
Делфи 5, сеть аркнет(ipx) вин98
//////////////////////////
var name:pchar;
key1,key2:hkey;
begin
name:=pchar(edit1.text);
key1:=HKEY_LOCAL_MACHINE;
if (regconnectregistry(name,key1,key2)<>ERROR_SUCCESS) then ...
//////////////////////////
Ответить.
Ответ 1:
Вопрос 529:
От: Astrov Alseos
Известно, что, например, в FoxPro существует понятие
макроподстановки. Т.е., когда стоковая паременная содержит в себе
фрагмент
"понятного" транслятору (ну не компелятор он...) FoxPro текта. В таком
случае
транслятор заменяет эту переменную ее "содержимым"...
А теперь внимание, вопрос... А как, собственно, что-то подобное
утворить в
Delphi?
Ответить.
Ответ 1:
v delfi eto nevozmozhno.
Tak kak on srazu kompiliruet kod.
Ответ 2:
Никак, в Дельфи макросы не поддерживаются.
Ответ 3:
Фактически макроподстановки нет, но можно например пойти
по пути использования Dll, когда заранее создаешь библиотеки с
процедурами, а пользователю даешь возможность настраивать
какими процедурами он будет пользоваться, в общем
мини интерпритатор .
Вопрос 530:
От: Кабанов Артур Александрович
Как скрыть заголовок в MDIChild окне.
Ответить.
Ответ 1:
смотри CreatParams
Вопрос 531:
От: В.А.Крашенинников
Думаю, не только мне будет интересно :
Чтобы CD-юк открыл\закрыл варежку, я использую команды (спасибо вашей
рассылке) :
mciSendString('Set cdaudio door open wait', nil, 0, handle);
mciSendString('Set cdaudio door closed wait', nil, 0, handle);
- Но, как оказалось, этого недостаточно - в некоторых случаях (
WinCommander
и еще что-то ) происходит обращение к драйву, и получаем синий экран -
не
фатально, но приятного мало. Есть, наверное сигнал, которым надо
задобрить
систему - ШАМАНЫ, помогите !!!
Когда щелкаю ( MsOE.5 ) адрес
'Спросить -mailto:DTarasov@kms.dvgd.ru?subject=delphiVamp&body=Вопрос:',
появляется готовая форма со странной строчкой в теле письма "чПРТПУ" -
полагаю соответствует "Вопрос"
Так вот, такой чПРТПУ - если моя писанина приходит к вам в таком
неудобочитаемом виде, то что я (не я) делаю неправильно |:?)
Ответить.
Ответ 1:
Вопрос 532:
От: strannik
Кто-нибудь знает такой компонент, который позволял бы
отображать
математические формулы, как в Mathcad?
Ответить.
Ответ 1:
Вопрос 533:
От: Ivan
Пришлите мне пожайлуста код программы, которая содержит две label или
два
edit'а, не в том суть и две ОБЫЧНЫЕ BitBtn. При нажатии на одну из них
убирается caption у меток или у edit'ов.!! При ОДИНАРНОМ нажаии на
другую же
в одном из edit'ов пишется "Привет", а при ДВОЙНОМ щелчке на неё же во
втором Едите пишется "Привет again".
Последовательность нажатий любая( сначала - 1, потом - 2, или сначала -
2,
потом - 1).
Отследить надо мне события onclick и ondlbclick у BITBUTTON. Сразу
говорю,
читал в прошлом номере рассылки ответ на почти тот же вопрос... он
неработает... Попробуйте сделать так как там указано и судите...
Действительно надо использовать таймер... но что в нём надо
обрабатывать...
Я не знаю как сделать такую простую задачку.
Да! не пишите, типа поставь SpeedButton - событие OnDblClick у неё
работает
только при отсутствии события OnClick.
Ответить.
Ответ 1:
На самом деле проблема решается довльно просто.
Ставишь в обработчике события OnClick кнопки такой код:
if Counter=0 then Edit1.Text:='Hello!!!'
else Edit1.Text:='Hellllloooooo!!!!!';
Counter:=1;
Здесь Counter -- счетчик, необходимый для проверки двойного нажатия на кнопку.
Ставишь интервал у таймера примерно 350 (поэкспериментируй, поподбирай) в обработке OnTimer пишешь такой код (всего одну строчку):
Counter:=0
Счетчик не забудь сделать глобальной переменной!!!
Ответ 2:
procedure TForm1.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
t1:integer=0;
dt=200; // Подобрать интервал между кликами
var
t2:integer;
begin
t2:=GetTickCount;
if t2-t1<dt
then Caption := 'DblClick '+intToStr(t2-t1)//Можно еще сбрасывать t1
else Caption := 'Click '+intToStr(t2-t1);
t1:=t2;
end;
Ответ 3:
Заведи у себя _глобальную_ переменную типа TTimeStamp,
например LastClickTime и обработай так:
var
Form1: TForm1;
LastClickTime : TTimeStamp;
implementation
{$R *.DFM}
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Now : TTimeStamp;
i : integer;
begin
Now := DateTimeToTimeStamp(Time);
i := now.Time - LastClickTime.Time;
if i < 1000 // время на дблклик в мс.
then edit1.Text := 'Привет again'
else edit1.Text := 'Привет';
LastClickTime := DateTimeToTimeStamp(Time);
end;
В Д5 работает.
Вопрос 534:
От: President
Я использую NMHTTP, чтобы отправлять по какому-то одному адресу
данные из формы. Подскажите, пожалуйста, как можно отправлять данные
сразу
по нескольким адресам одновременно, т.е. реализовать сразу несколько
потоков или как это правильно сказать не знаю... Заранее благодарен.
Ответить.
Ответ 1:
Вопрос 535:
От: Алекс Чебыкин
Имею писанную в Дельфи 6 ДЛЛку со следующим кодом:
library Sample;
uses Dialogs;
type
TPluginInfo = record
PType: Byte; //Plugin type.
PName: String; //Plugin name
Copyright: String; //Copyright information
Version: String; //Plugin version
MinITBuild: Word; //Minimal build which can work with plugin
Description: String; //Plugin description
end;
//exported procedures and functions declarations
function GetPluginInfo: TPluginInfo; export;
begin
with Result do
begin
PType := 1;
PName := 'Plugin name';
Copyright := 'Copyright string';
Version := 'Version';
MinITBuild := 97;
Description := 'Simplest plugin.';
end;
end;
procedure PluginAbout; export;
begin
ShowMessage('Plugin About');
end;
function IncomeString(Host, TextString: String): Boolean; export;
begin
ShowMessage('Received Message from host "' + Host + '" : ' +
TextString);
Result := true;
end;
exports //Exported functions and procedures
PluginAbout name 'PluginAbout',
IncomeString name 'IncomeString',
GetPluginInfo name 'GetPluginInfo';
var
SaveExit: Pointer;
procedure LibExit;
begin
// ... // library exit code
ExitProc := SaveExit; // restore exit procedure chain
end;
begin
// ... // library initialization code
SaveExit := ExitProc; // save exit procedure chain
ExitProc := @LibExit; // install LibExit exit procedure
end.
и программу её использующую приблизительно вот так:
...
Объявления TGetPluginInfo также как и в ДЛЛ
...
procedure TForm1.btnGetPluginInfoClick(Sender: TObject);
var
GetPluginInfo: TGetPluginInfo;
t: TPluginInfo;
begin
@GetPluginInfo := GetProcAddress(TestHandle, 'GetPluginInfo');
if @GetPluginInfo <> nil then
begin
memLog.Lines.Add('Plugin info:');
t := GetPluginInfo;
memLog.Lines.Add(t.PName);
memLog.Lines.Add(t.Copyright);
memLog.Lines.Add(t.Version);
memLog.Lines.Add(t.Description);
memLog.Lines.Add(inttostr(t.PType));
memLog.Lines.Add(inttostr(t.MinITBuild));
end;
memLog.Lines.Add('End of plugin info');
end;
И при каждом обращении она окаянная выдаёт 'Invalid Pointer
Operation'...
Где я неправ?
В Дельфи 3 всё работало...
Ответить.
Ответ 1:
safecall , stdcall
соглашение о вызовах поштудируй
Ответ 2:
Возможно проблема с передачей в ДЛЛ строк string - пишите uses sharemem
(криво работает) или передавайте pchar или widestring.
Ответ 3:
Не надо ставить собаку ("@") перед функцией
т.е. не
@GetPluginInfo := GetProcAddress(TestHandle, 'GetPluginInfo');
а просто
GetPluginInfo := GetProcAddress(TestHandle, 'GetPluginInfo');
Ответ 4:
Так ты же экспортируешь структуру с типом String! Читать надо предисловие к
создаваемым DLL
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's uses clause and your project's (select
Project-View Source) uses clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. to avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
(╘ Borland)
соответственно надо писать
1) library Sample;
uses ShareMem, Dialogs;
2) type
TPluginInfo = record
PType: Byte; //Plugin type.
PName: ShortString; //Plugin name
Copyright: ShortString; //Copyright information
Version: ShortString; //Plugin version
MinITBuild: Word; //Minimal build which can work with plugin
Description: ShortString; //Plugin description
end;
Вместо ShortString можно смело писать PChar. Если нужны строки, то можешь
попробовать тип WideString, может поможет.
Вопрос 536:
От: nubsaybot
:Проблема подключить к проету СУБД Pervasive SQL 2000
Ответить.
Ответ 1:
Вопрос 537:
От: Ovtchinnikov Kirill
: Как сделать на Delphi программу, которая работает как прокси-сервер
(я имею в виду на локальном компьютере) (например Naviscope, GetSmart и
т.д.)? Желательно пример.
Ответить.
Ответ 1:
Вопрос 538:
От: postbald
Нужно подключить MS Access-вскую базу к Table.
При Table.Active:=True спрашивает имя юзера и пассворд
затем возникает ошибка "Cannot load an IDAPI servise library"
Вопрос: Как в BDE-ке подключить этот драйвер? И откуда он юзера берет
с пассвордом (мож стандартный какой есть как в Парадоксе?)
Ответить.
Ответ 1:
Извините, как можно подключить к таблице базу?
Вы хотите сделать LookUp ? Или как?
Пароль может спрашивать если таблица подключена к Database.
А у Database есть свойство LoginPromt сделать False.
Ответ 2:
Чтобы поключить таблицу Access необходимо на форму перетащить
компонент DataBase. В нем прописать Alias или путь и указать
loginPromt=false, тогда пароль спрашиваться не будет. Alias лучше
делать в ODBC.
Ответ 3:
Насчет драйвера не знаю, попробуй переставить БДЕ
с поддержкой Access.
Пароль в Access по умолчанию пустой - сразу кликай на ОК.
Чтобы не спрашивали пароля, помести в проект TSession, TDatabase
и скажи скажи всем элемента Dataaccess, что у них SessionName
от этой сессии.
Ответ 4:
Если Access 2000 то никак - BDE просто не имеет
драйвера под него. Надо использовать либо предыдущие
версии Access, либо на выбор ADO, ODBC или DAO
компоненты доступа вместо BDE TTable.
Вопрос 539:
От: Alexander Prishchepa
Пишу в Com порт следующим кодом:
strComPort:='COM4';
hndComHandle := CreateFile(PChar(strComPort),
GENERIC_WRITE or GENERIC_READ,
0,nil,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED or
FILE_ATTRIBUTE_NORMAL,
0);
if hndComHandle=INVALID_HANDLE_VALUE then
begin
ShowMessage('Не могу открыть '+ strComPort);
exit;
end;{if}
NumberWritten:=0;
if WriteFile(hndComHandle,PChar('ATZ'+#13)^,4,NumberWritten, nil) =
False
then
ShowMessage('Не могу записать в порт ' + strComPort);
NumberWritten:=0;
strNumber:='ATDP'+strNumber+#13;
if WriteFile(hndComHandle,PChar(strNumber)^,
Length(strNumber),NumberWritten, nil) = False then
ShowMessage('Не могу записать в порт ' + strComPort);
После исполнения этого кода не происходит НИЧЕГО!!! Не набирается номер,
не
показываются никакие ошибки. Очень нужно знать, в чем дело. Ответьте.
Ответить.
Ответ 1:
'Возьми portmon с sysinternals.com и проследи все обращения к порту.
Насчет набора номера сказать не могу, но у меня под Delphi 3 обе
записи проходят нормально.
Ответ 2:
Для работы с модемом этого когда не достаточно. Что бы не изобретать велосипед -
возьми библиотеку Async pro 3.0 Она тебе поможет.
Вопрос 540:
От: Игорь Маринин
На Майкрософте скачал SpchApi.exe. После импортирования (с ActivX -
Microsoft Telephony ) появился компонентик TPhone. Может кто работал с
ним. Хоть кусочек кода. Вроде интересная штука, помогите pleas...
Ответить.
Ответ 1:
Вопрос 541:
От: bigmir
Подскажите пожалуйста как в режиме RunTime изменить текст
всплывающей подсказки? Пробовал просто св-ву Hint присвоить значение
строковой переменной, не получается(подсказка вообще исчезает).
Ответить.
Ответ 1:
должно все работать. для проверки положи на форму BitButton, обзови ее
BitBtn1 и повесь на ее обработчик OnClick такую процедуру:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if BitBtn1.Hint = '1' then BitBtn1.Hint := '2'
else BitBtn1.Hint := '1'
end;
Вопрос 542:
От: Andy
У меня есть база данных (*.dbf), которая содержит
название документа (*.doc-поле FILENAME), директорию где хранится
документ (поле FILEPATH) и другие поля. Как мне по нажатию на Button1
загружать из проги word-вский документ, именно с тем названием и путем,
который именно в данный момент выбран у меня в БД?
Если сделать так,
procedure TForm1.Button1Click(Sender: TObject);
begin
shellexecute(0, nil, TABLE1FILENAME, nil, TABLE1FILEPATH, sw_restore);
end;
end.
то он выдает ошибку ('Incompatible types:'TStringField' and 'PCar').
Наверное надо преобразовать строку string в PChar, но как это сделать?
Ответить.
Ответ 1:
Тебе нужно написать так:
shellexecute(0, nil, PChar(TABLE1FILENAME.Value), nil,
PChar(TABLE1FILEPATH.Value, sw_restore);
Ответ 2:
Вопрос 543:
От: Dizzer
Как поменять цвет выделения ячейки в StringGrid? По yмолчанию он синий.
Можно ли поменять цвет ScrollBar в StringGrig?
Как закpасить цветом отдельнyю ячейкy в StrigGrid?
Ответить.
Ответ 1:
В свойствах StringGrig нужно поменять DefaultDrawing в false
и добавить процедуру OnDrawCell:
procedure TfmMain.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
with StringGrid1.Canvas do
begin
{Как закpасить цветом отдельнyю ячейкy в StrigGrid}
if ((ACol=3) and (ARow=2)) or ((ACol=4) and (ARow=4)) then
Brush.Color:=clRed
else Brush.Color:=clBlue;
FillRect(Rect);
{Как поменять цвет выделения ячейки в StringGrid}
if gdSelected in State then Brush.Color:=clYellow
else Font.Color:=clBlack;
FillRect(Rect);
end;
end;
Вопрос 544:
От: Hitman
по TADO - MS JET 4.0, база ACCESS'97.
Для вставки новой записи делаю:
TAdoConnection.BeginTrans;
TAdoConnection.Execute('INSERT...');
TAdoConnection.CommitTrans;
Запись действительно добавляется (вижу через SELECT), но на экране
в TDBGrid ее можно увидеть, только в следующем запуске программы.
Как мне обновить набор данных на экране.
TAdoTable.Refresh не помагает.
Можно, конечно, сделать
TAdoTable.Close;
TAdoTable.Open; (и это срабатывает).
Но врядли это хорошо.
Подскажите, как быть.
Ответить.
Ответ 1:
Все дело в том, что в базе данных то строка добавляется, а вот в
датасет она не подгружается. Для этого нужно обновить датасет, это
можно сделать во-первых действительно закрыв и открыв заново датасет,
а во-вторых вызвать метод датасета TDataSet.ReQuery.
Ответ 2:
Вообще то это правильно ! Т.к получение Recordset'a происходило под другой
транзакцией.
Но по-моему, если использовать метод Recordset'a AddNew переоткрытие не
потребуется.
На VB это выглядело так:
Dim m_cnnMain as NEW ADODB.Connection;
Dim m_rstMain as ADODB.Recordset;
' Открываем Connection
.
.
.
' Имеем соединение с таблицей
set m_rstMain.Connection = m_cnnMain
m_rstMain.Open "table_name",,,adCmdTable
' grdMain -браузер (грид)
set grdMain.DataSet = m_rstMain
' Добавляем в грид
m_rstMain.AddNew
m_rstMain!first_field = "first_field_value"
m_rstMain!second_field = "second_field_value"
m_rstMain.Update
' Это должно записать новую строку и в базу и соответственно в m_rstMain,
что
' и будет отображено в гриде.
' Код возможно не совсем рабочий т.к VB под рукой нет,
' но принцип по-моему верен.
Вопрос 545:
От: strannik_
У меня несколько вопросов
1.Можно ли средствами Delphi создать полупрозрачную форму под W2k?
2.Как под W2k управлять питанием (выключить,перезагрузить комп)?
Ответить.
Ответ 1:
1. на onFormCreate
Brush.Style:=bsClear;
2. Нужно выполнить функцию библиотеки RunDll32 через ShellExecute или ещё проще: запустить их напрямую через модуль Windows (сам же
дельфи при этом делает это по первому способу, просто геморроя меньше):
ExitWindowsEx(EWX_REBOOT,0); // Перезагрузка
ExitWindowsEx(EWX_SHUTDOWN,0); // Рестарт
Вопрос 546:
От: gruzdewfam@mtu-net.ru
как узнать имя загруженной Dll
Я пишу микро отладчик, запускаю процесс,
CreateProcess(...)
Жду отладочного сообщения
WaitForDebugEvent(DebugEvent,INFINITE)
Смотрю, что за сообщение, если загрузилась DLL
if DebugEvent.dwDebugEventCode=LOAD_DLL_DEBUG_EVENT
then {что-то делаю}
Проблема заключается в том, как узнать имя загруженной Dll
А вообще, можно как-нибудь перехватить у приложения загрузку DLL
Ответить.
Ответ 1:
Вопрос 547:
От: Sasha_300
мне необходим компонент, который
позволяет создавать отчеты всевозможного плана, с возможностью
автоматического изменения структуры в ходе выполнения программы по
желанию пользователя. QReport для этих целей абсолютно не подходит, а
про другие я к сожалению не слышал. Подскажите чего есть в этом плане
хорошего, и где можно взять.
Ответить.
Ответ 1:
Советую обратить внимание на FastReport.
Последняя версия этого набора компонент (по-моему 2.4) дает
разработчику по-моему просто дикие возможности в построении отчетов.
Мало того что там можно строить отчеты, с помощью FR можно строить
диалоговые формы для создания отчетов и многое другое. Этакий
ReportDelphi внутри Delphi. И это не просто красное словцо. Очень
советую посмотреть.
Ответ 2:
Есть такой RBuilder, поищите, поспрашивайте, может кто работал.
Ответ 3:
Вопрос 548:
От: 280176
Очень нужны компоненты и пример программы который бы считывал и
просматривал файлы с расширением *.bmp; *.jpg; *.gif
Может ссылки, сами примеры, компоненты, подкинешь. Буду очень
признателен.
Ответить.
Ответ 1:
Вопрос 549:
От: John
Стоит "сервер удаленного доступа".
Подключается народ, дык как получить количество принятых/переданных
байт и время подключения? Копался в RASAPI вроде ничего такого нету.
Ответить.
Ответ 1:
Вопрос 550:
От: Eugeny A. Emelyanchikov chat
Ребята подскажите как правильно написать в Дельфях алгоритм
поиска минимального пути (например для машины)?
Ответить.
Ответ 1:
Советую полазить на сайте www.algolist.by.ru - если я правильно понимаю
задачу, то это с теории графов - классическая задача "коммивояжера". Там
есть специальный раздел про это.
Вопрос 551:
От: Михаил Логинов
Возникла необходимость написать программу для взаимодействия с Lotus
(чтение/запись и др.). Существует-ли способ такой работы кроме прямых
COM-вызовов? А может встречались кому доступные компоненты для работы с
базами
Lotus Domino 5?
Ответить.
Ответ 1:
DNotes от Винсента Парета http://www.vsoft-tech.com.au
и Notes/Delphi class library от Сергея Колчина
http://www.geocities.com/SiliconValley/Peaks/8307/
DNotes - добротно сделан, но коммерческий. А у Колчина фри, но не сильно
поддерживаемый, но тоже неплох.
Вопрос 552:
От: Roman Baranov
Есть проблема - Приложение запускает процесс (CreateProcess) и
мониторит его - жив ли он? Отследить не закрылся ли он легко - по коду
выхода, а вот как отследить не висит ли он для того, что-бы прибить и
запустить по новой?
Ответить.
Ответ 1:
Легко, если твой процесс периодически посылает Windows-овое сообщение:
const
WM_KeepAlive = WM_USER + 100;
...
PostMessage(Application.Handle, WM_KeepAlive, 0, 0); //Можешь даже толковое что-нибудь передавать
или через Dispatch;
А родитель его обрабатывает
...
private
procedure WMKeepAlive(var Message: TMessage); message WM_KeepAlive;
Вопрос 553:
От: Ilya Solovyov
Хочу написать свой клиент серверов новостей. Стандартный компонент
TNMNNTP имеет слишком мало возможностей. Поэтому использую
TClientSocket. И имею с ним проблемы... Как обрабатывать ответы
сервера? Не всегда понятно, закончил ли сервер передачу ответа или
собирается ещё что-то передать вдобавок. И вообще дайте, пожалуйста,
какие-нибудь примеры использования TClientSocket. Как организовывать
передачу информации? Ну, короче, чем больше полезной информации
(примеры, мнения, ссылки в Инете, книги), тем лучше...
Ответить.
Ответ 1:
Вот пример использования ClientSocket и ServerSocket.
http://www.nick372.pisem.net
Скачать RemoteDisk (source)
Вообще-то это должна была быть программа пересылки файлов.:)
Работает там в результате только получение списка файлов с удаленной
машины.
Но писал я это настолько давно что даже не помню рабочий это код или
нет. Но то что в режиме сервера и в режиме клиента это все работает
это точно :).
Плюс там как раз предложены решения связанные с собственными
протоколами прикладного уровня.(т.е оформление информации для передачи
клиенту со стороны сервера)
Еще есть такой вариант. Если есть желание то можно залезть на сайт
Королевства Дельфи и найти исходники программ подобного плана. Там
много.
Вопрос 554:
От: Виталий (aka Night)
Имеется Application.OnMessage
Очень хотелось бы увидеть фрагмент кода где было бы показано как
отлавливать
сообщения и их обрабатывать. Буду благодарен за любую информацию,
фрагменты
кода, URL на доки...
Ответить.
Ответ 1:
Объявляешь процедуру (точнее метод формы):
procedure RestoreApp(var Msg: TMessage); Message
WM_RESTORENE;
Внутри процедуры обрабатываешь сообщение, процедура
вызывается если соответствующее сообщение было
послано, в переменной Msg - само сообщение, делай с
ним что хочешь. Все вопросы можно мне по email.
procedure TMainForm.RestoreApp(var Msg: TMessage);
begin
Application.restore;
Application.bringtofront;
end;
Вопрос 555:
От: LYNX
Как создать вспомагательную процедуру и потом вызывать её из других
процедур?
Ответить.
Ответ 1:
:Создать в приложении модуль Module1, в нем написать нужную процедуру,
а потом в секциях implementation в разделе uses описать ссылку на
Module1.
Типа
unit Form1
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
StdCtrls, Buttons;
type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Module1;
здесь можно вызывать процедуру, описанную в Module1
Ответ 2:
procedure TFORM_номер_формы. Procedure_Name(Параметры);
begin
{body}
end;
Запуск из других процедур: Form_номер_.Procedure_Name(параметры); // Если запуск идёт из того же модуля имя формы можно опустить
-----
Ответ 3:
Что такое вспомогательная процедура? Если просто
процедура то ее можно вызвать из любой другой соблюдая
при соблюдении правила:
Вызываемая процедура должна отвечать одному из
приведенных правил
- объявлена до вызывающей или
- являться методом того-же класса или
- объявлена как Public метод доступного (и уже
созданного) класса или
- обявлена в секции interface доступного модуля
Если Вы хотите как можно скорее получить ответ на свой вопрос, то
укажите в теме письма - delphiV,иначе письмо будет прочитано значительно
позже, если же у вас есть предложения то в теме письма укажите delphiP.
Для интересующихся - немного о себе. Работаю на
железнодорожном транспорте ведущим программистом.
Основные мои разработки - это сбор и доставка клиентам
информации о вагонах и поездах: где находится(по России),
куда едет. В связи с этим программировал для e-mail,Socket,БД,ISAPI.
За сим прощаюсь - скорых Вам и качественных программ.
Автор рассылки - Дмитрий.
ICQ - 89533941.
ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||