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

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

  Все выпуски  

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


Служба Рассылок Subscribe.Ru

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


Что-то не нравится мне это
Subscribe,с их заморочками.


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


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

Подскажите, может кто в курсе, а то от Subscribe правды не добьешься -
у всех все нормально с подпиской по почте? Например на команду
Help или List в сторону subscribe@subscribe.ru приходит то, что надо?

Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Очередные вопросы.
2. Отвеченные вопросы.
~~~~~~~~~~~~~~~~~~~




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


Вопрос 569: 

От: Т

В гриде хотел отрисовывать строки по своему,
в том числе и выделенную и текущую.
Стал обрабатывать событие OnGetCellParams,
но оно возникает при перерисовке
конкретной строки, а не всех и когда я просто
перемещаюсь с единожды перересованной строки
на новую предыдущая свой цвет не меняет.
На данный момент делаю по таймеру Refresh,
но ведь изврат полный!!!


Ответить.

Ответ 1:


Вопрос 570: 

От: Alex Zhuravlev

Как проверить наличие установленного шрифта и как из программы
установить свой шрифт



Ответить.

Ответ 1:


Вопрос 571: 

От: Alex Zhuravlev

Можно ли получить доступ к портам ввода-вывода, памяти по абсолютному
адресу (например D0000-D7000), перехватьить прерывание. Должны ведь быть
какие-то ворота...


Ответить.

Ответ 1:


Вопрос 572: 

От: vj

Есть умные люди которые могут помочь определить версию MS-DOS? Только
не говорите, что ее можно определить с помощью стандартной API-функции
"GetVersion", она уже давно не работает под 32-битными Delphi. В связи
с этим, Майкрософт рекомендует использовать ассемблер. Я попытался
подобрать эквивалент на Delphi, но столкнулся с проблемой
инициализации ассемблерной функции DOS3Call. Где и как ее
инициализировать? При замене эквивалента int 21h вместо DOS3Call
выдается ошибка: "программа KRNL386.exe выполнила недопустимую..." и
т.д. Вот алгоритм:

procedure TForm1.Button1Click(Sender: TObject);
var
nMajor, nMinor, nOEMNumber: Byte;
begin
asm
mov ax, 3000h
call DOS3Call {int 21h}
mov nMajor, al
mov nMinor, ah
mov nOEMNumber, bh
end;
Label1.Caption:=Format('%d.%d.%d',[nMajor, nMinor, nOEMNumber]);
end;


Ответить.

Ответ 1:


Вопрос 573: 

От: Savinov

Подскажите пожалуйста, как сделать, чтоб программа в панели задач
возле часов ( как бы резидентно) или чтоб она вообще не была видна в
панели задач :)))


Ответить.

Ответ 1:

Вопрос 574: 

От: Ivan

Господа хорошие, очень прошу дать пример работы c внеэкранным буфером:
нарисовать в нём что-нибудь и кинуть на какой-либо объект (форму,
Image...).



Ответить.

Ответ 1:



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



Вопрос 556: 

От: Yashkin Denis

Есть база на MS SQL и несколько
клиентов. Пусть один клиент в ней
чего-нибудь делает (например удаляет запись).
Как сделать чтобы этот факт отразился у
всех остальных клиентов автоматически, а
не после того как они нажмут кнопку Refresh
(например)?


Ответить.

Ответ 1:
Думаю что в общем случае только по таймеру, а вообще
это не очень хорошо поставленная задача - представим
себе базу данных с несколькими миллионами записей,
сложные запросы через несколько таблиц и пару сотен
пользователей, делающие Insert и Update query на много
записей сразу - при такой постановке задачи ясно, что
получить в реальном времени ничего не получиться -
просто мощности сервера и сети не хватит, стало быть
проблему можно решить только для каких-то частных
случаев - или посылкой сообщений или перезагрузкой
квери по таймеру...
Ответ 2:
Данный пример - УДАЛЕНИЕ

1. делаешь триггер на удаление, например
CREATE TRIGGER AD_T1 for T1 AFTER DELETE POSITION 1 as
begin
post_event "EV_EI_UPD"
end !!

2. На форму кидаешь компонент ЕIBEvents
3. В его свю-ве Events прописываешь событие EV_EI_UPD
4. и при получении этого события делаешь обновление необходимых
dataset'ов

Подробности читай в help'е


Вопрос 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:
Приведенный код правильный, и файл
сохраняется. Приведи код ошибки, или
появляющуюся мессагу. IMHO дело не
в этой строке.
Ответ 2:
var
s:String;
PathName:String;
f:TextFile;
begin
SaveDialog1.FileName:=PathName;
if SaveDialog1.Execute then
begin
PathName:=SaveDialog1.FileName;
Caption:=ExtractFileName(PathName);
AssignFile(f,PathName);
end;
Ответ 3:
'Скорее всего, Вы пытаетесь сохранить в
несуществующую директорию.
Попробуйте так:

FileName := 'blablabla';
if not DirectoryExists(ExtractFileDir(FileName)) then
ShowMessage('Bad directory')
else
ListBox1.Items.SaveToFile(FileName);


Вопрос 559: 

От: Dush Dushin

есть форма, на форме DBGrid.
Находясь в DBGrid-е нажимая ESC происходит удаление записи, а
нужно закрытие формы. Если это актуально, то работаю
под СУБД INTERBASE.


Ответить.

Ответ 1:
На форме KeyPreview поставить True. На OnKeyPress - if Key=#27 then
Close;(или ModalResult:=mrCancel)

Ответ 2:
Выполни следующее

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=chr(vk_Escape) then
form1.close;
end;

Тип СУБД кстати никакой роли не играет и посмотри настройки DBGrid,
если это не пройдет хотя я сомневаюсь.
Ответ 3:
Лучше всего так:
Заведите TActionList, в нем Action ACloseForm c обработчиком

procedure TForm1.AcloseFormExecute(Sender: TObject);
begin
Close;
end;

В свойстве ShortCut укажите Esc
Ответ 4:
Ну допустим удаление записи происходит только если она
была создана, но таблица не получила метод Post.
Решение очень простое - добавьте меню или Action с
горячей клавишей Esc по ней проверяйте статус таблицы
или квери на "Edit Mode" если таковой усановлен то
делайте Post или Cancel по необходимости, а затем
что-то типа Form1.close;


Вопрос 560: 

От: Izotko Sergej

Подскажите пожалуйста как пользоваться EnableHardwareInput. Моя прога
отрубает по времени мышку и клаву. У меня загвоздка в отрубании.
Перепробовал несколько способов, но нифига не выходит. Как быть не
знаю. Если можно пришлите примерчик. Может есть какая-нибудь
альтернатива EnableHardwareInput? Если есть, то пришлите.


Ответить.

Ответ 1:
Есть процедура заменящаю EnableHardwareInput

procedure BlockInput(ABlockInput : boolean); stdcall; external 'USER32.DLL';

BlockInput(true); {отрубаем клаву и мышку}
BlockInput(False); {Врубаем клаву и мышку}


Вопрос 561: 

От: Ovtchinnikov Kirill

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

-> Как сделать на Delphi программу, которая работает как прокси-сервер
(я имею в виду на локальном компьютере) (например Naviscope, GetSmart и
т.д.)? Желательно пример.

-> Как узнать, какие процедуры есть в DLL-ке?

-> Есть ли у кого-нибудь компонент или модуль для работы с архиватором
ACE?

-> Для уменьшения размера программ, я включил опцию Build Run-time
Packages (или что-то типа такого, не помню точно). В help system
написано, что с программой необходимо распространять какую-то
библиотеку. А какую?


Ответить.

Ответ 1:
-> Как узнать, какие процедуры есть в DLL-ке?

Процедуры узнать не сложно - используй tdump из
дельфи, а вот с их параметрами загвоздка - никак не
узнать.

-> Для уменьшения размера программ, я включил опцию
Build Run-time
Packages (или что-то типа такого, не помню точно). В
help system
написано, что с программой необходимо распространять
какую-то
библиотеку. А какую?

Все BPL файлы которые и установлены в этой опции, так
что с размером пожалуй много не выиграешь.

Ответ 2:

'Если включить опцию 'Build with run-time packages', то с программой
надо поставлять и некоторые .BPL файлы. Точный список можно посмотреть
в окне опций проекта под галочкой 'Build with run-time package',
например у меня там стоит 'VCL50;VCLX50;VCLSMP50' это значит, что
файлы VCL50.BPL,VCLX50.BPL,VCLSMP50.BPL (находятся в
c:\windows\system\) надо либо поместить в директорию с программой,
либо в директорию c:\windows\system\. Кстати, для одиночных проектов
это бесполезно, т.к. размер EXE-файла уменьшится на ~300Kb, а
указанные файлы весят >2Mb

Насчет DLL, есть прога PE Explorer (http://www.heaventools.com/), она
может показывать импортируемые/экспортируемые функции


Вопрос 562: 

От: zmv

1) В компоненте StringGrid ставлю возможность редактирования.
Естественно, при вводе данных должен отображаться курсор (и он
отображается в большинстве случаев!!!). Но на
некоторых машинах он не отображается, и я даже не могу понять, что
между этими машинами общего - вроде мониторы разные, разрешение не
специфическое, операционные системы тоже стоят Windows 98 или 2000.
Может, кто-нибудь знает, в чем тут фишка?
2) Не может ли мне кто-нибудь подсказать хороший и правильный подход
для того, чтобы при максимизации окна все содержимое формы тоже
адекватно расширялось? Я понимаю, что можно обрабатывать событие
OnResize и проверять WindowState, но это событие меняется как-то
заторможенно. Вроде бы оно по OnResize уже должно измениться - ан нет,
ничего подобного!!! Кроме того, не очень приятно все компоненты каждый
раз заново выравнивать. А другого пути нет?


Ответить.

Ответ 1:
В Delphi 5 появилось довольно замечательное свойство Ancors - якоря...
В общем и целом довольно неплохой способ решения Вашей проблемы.
Не все так гладко, есть некоторые проблемы, но по-крайней мере это
готовое решение данной проблемы.
Все масштабирование довольно просто организуется при помощи этих
якорей и объектов TPanel, которые можно использовать, как контейнеры
для компонентов типа TWinControl.
Очень советую поэксперементировать в этом направлении.
Но есть проблема: Если Вы запустили свой проект, затем при
запущенном проекте меняете разрешение экрана, то последствия не особо
предсказуемые (хотя возможно этот эффект происходит только при оладке
приложения в Delphi, а при запуске конечного приложения такого эффекта
не будет).
Ответ 2:
2) Ну попробуй хотя бы свойство Align.
Ответ 3:
Отвечаю на вопрос 2 - если у вас Дельфи 5 или 6 то
используйте свойства компонентов - Anchor и Constrains
-они именно для этого и предназначены, для версий
более ранних 1 и 2 - такого не было - надо делать
ручками, првдо я видел какое-то количество компонентов
для этого про Дельфи 3 и 4 - не скажу, не помню
появились ли в них Anchor и Constrains или еще нет..

Вопрос 563: 

От: -= MTsv =-

1.
Программа работает в цикле, в свернутом состоянии.
Как перехватить нажатие клавиши "Esc", чтобы остановить цикл ???

2.
Столкнулся с проблемой увеличения приоритета для программы.
ПРЕДИСЛОВИЕ:
При нажатии кнопки происходит запуск процедуры.
В процедуре длинный, однообразный цикл (который постоянно вызывает
одну и туже функцию).
Как увеличить приоритет выполнения процедуры ??? (Если можно по
шагам)


Ответить.

Ответ 1:
всё просто: и в том и в том случае вставляй в цикл функцию TApplication:

Application.ProcessMessages;
Ответ 2:
Для того чтобы увеличить приоритет процесса используйте
функции SetPriorityClass (для увеличения приоритета процесса) и
SetThreadPriority (для увеличения приоритета рожденного потока).
Например, в файл .dpr проекта вставляется вызов этих двух функций:

begin
....
....
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
....
....
end.

При этом программа получает максимальный приоритет при выполнении
(можно пронаблюдать в Task Manager если используете NT). Параметры
этих двух функций для задания приоритета варьируются (см. Help).
Ответ 3:
1. Надо просто зарегистрировать горячую кнопку с кодом 27
делам так (можно в принципе и компонентом, но если это не VCL прога а
консоль?)

.....
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure wmhotkey(var msg:Tmessage);message wm_hotkey;
......
......
const
ID_ESC=12345;

procedure Tform1.wmhotkey(var msg:Tmessage);
begin
if msg.WParam=ID_ESC
then
showmessage('нажата кнопочка ESC!');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if not registerhotkey(handle,ID_ESC,0,27) then showmessage('не удается зарегить Hot key "Esc"!!!');
end;


Вопрос 564: 

От: Ivan

я получаю письмо, допустим стандартным компонентом Delphi,
он
сразу сохраняет вложение в файл. А как можно получить email и сохранить
вложение, например, при нажатии на определённую кнопку... Какой лучше
компонент использовать( Freeware).


Ответить.

Ответ 1:


Вопрос 565: 

От: Koda666

Подскажите как из Дельфи создать или изменить макросы в вордовском
документе,как работать с шаблонами,например сделать проверку на
присутствия в макросах
определённой строки текста ?


Ответить.

Ответ 1:


Вопрос 566: 

От: banov

1. Как узнать, запущено ли другое приложение, зная его адрес на винте?
2. Как запустить прогу и дождаться её завершения?


Ответить.

Ответ 1:
'Что значит 'зная его адрес на винте'? Ты что, знаешь в каких
секторах записан EXE-файл программы? Если так, то после первой
дефрагментации твои данные будут неверны. Если известен заголовок
проги, то используй FindWindow, например:
if findwindow(nil,'1.txt - Блокнот') then ShowMessage('Блокнот запущен');

Вопрос 567: 

От: Богер Александр

Как из Дельфи просмотреть какие функции экспортирует DLL?
Эсли кто может дайте ссылки на готовые программы.


Ответить.

Ответ 1:
{DELPHI}\Bin\tdump.exe ;-)))


Вопрос 568: 

От: Воробьев Сергей

Подскажите как с помощью Open Tools Api, отследить момент, когда идет
переключение между формами, не прибегая к таймеру и не вешая на OnTimer
ToolServices.GetCurrentFile?


Ответить.

Ответ 1:







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

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

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

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

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



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное