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

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

  Все выпуски  

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


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

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


...и Borland сын ошибок трудных,
и Delphi Paradox-a друг.........


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


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

Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Вот и увидел я 6-ю Delphi.
2. Ищу подельника.
3. Очередные вопросы.
4. Отвеченные вопросы.
~~~~~~~~~~~~~~~~~~~


1. Вот и увидел я 6-ю Delphi.
-----------------------------
Дошел, таки, и до нашего захолустья Delphi6.
Естественно, обойти такое событие в рассылке я не мог.
Что, же это такое? По порядку - то, что успел накопать и увидеть.
Прежде, чем ставить следующую версию Delphi, всегда спрашиваешь себя -
а есть ли поддержка любимых RX в новой версии и как быть с готовыми,
работающими проектами, требующими сопровождения и редкого дополнения?
Надо - ли, переносить все на новую версию?

Итак, мучаясь всеми этими вопросами я принес и поставил 6-ю на свою
машинку. Причем 5-ю я не удалял, и правильно сделал - сейчас они
прекрасно уживаются на одной машине. По занимаемому месту на диске
Delphi6 не сильно убежал от своего предшественника - 350Мб при полной
инсталяции. Это радует. То, что 6-я и 5-я версии дружат, то же неплохо,
это несколько разряжает обстановку. На вид это почти то-же самое.
Добавилось только окошко-'Object TreeView'. А вот с RX-ами хуже.
Официальной версии для Delphi6 нет. Но есть 2-е ссылочки, где лежат
rx275 переделанные под 6-ю. Вот они:

http://www.oxygensoftware.com/download/rx275d6.zip - эту я уже проверил,
и еще одна
http://codecentral.borland.com/codecentral/snippets/16277.zip .

В коде программ сразу бросилось в глаза, что вместо Null нужно теперь
определять тип переменной и сравнивать с varNull, тоже и состальными
типами. В остальном больших изменений нет, т.е. как минимум
названия и функциональность старых компонентов сохранились. Не долго
думая я переложил один из своих проектов с 5-й на 6-ю и все заработало.
Практически влет.

А вот, что действительно понравилось - это обещанные компоненты Indy.
Как не крути, а имеющимся Delph-и компонентам с анологичными свойствами
до этого набора далеко. Добавились и еще кое-где новые компоненты, в
частности 'ApplicationEvents' которого так недоставало, хотя RX-ы
это исправляли.

Несколько разочаровал нашумевший наборчик dbExpress. Честно говоря
думал, что это будет несколько более мощная вещь. Вообще, что касается
баз данных, огромного скачка вперед не видно. Я бы сказал, что в этой
сфере немного навели порядок. Выглядит все примерно так. Локальные базы
Paradox и др. это пож. BDE, SQL сервера - dbExpress, Access - ADO....

А общее впечатление - побольше стало компонент.


2. Ищу подельника.
------------------
Я сам сейчас разбираюсь с Делфями, но тупо ковыряя очень тяжело
добиться каких либо результатов. Хотелось бы найти какого нибудь
компаньёна который мог бы предложить написать что нибудь совмесное,
а я буду стараться оказать посильную помощь.
Мой mail: nks13@ukrpost.net .


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


Вопрос 383:

От: Суханов Александр Владимирович

Подскажите, пожалуйста, можно ли каким либо образом узнать Handle
программы запускаемой функцией CreateProcess.
Не псевдо Handle как у GetCurrentProcess, а истинный.


Ответить.

Ответ 1:


Вопрос 384:

От: Andrey Kochetov

Люди добрые, помогите исходниками двух проектов (или
понятными объяснениями): как запихнуть формы в DLL, а
потом вызывать их из приложения ? Если примеры будут
на C++ Builder, границы моей благодарности будут
беспредельны; но можно и на Delphi.


Ответить.

Ответ 1:


Вопрос 385:

От: бОДТiК сВМПОУШЛЙК

У меня такая проблема:
запускаю 2 внешних програми из Delphi
WinExec(PChar('export.exe '+FileName3),SW_HIDE);
WinExec(PChar('arh '+FileName2+' *.damp'),SW_HIDE);

причем вторая должна запускатся после того как первая
завершит роботу. Как ето отследить?


Ответить.

Ответ 1:


Вопрос 386:

От: spater

В обшем пишу:
procedure TForm2.Label4Click(Sender: TObject);
begin
ShellExecute(h,'open','mailto:spater@host.kz',nil,SW_RESTORE);
end;
а Delphi выдаёт следующее:
[Error] Unit2.pas(33): Incompatible types: 'Integer' and 'PChar'
Что за ерунда,подскажите плиз.


Ответить.

Ответ 1:


Вопрос 387:

От: М/О г.Каховка


Как вызвать с помощью команды Shellexecute OutlookExpress с
заполненными полями [Кому:] и [Тема:] я знаю. А вот как еще и программно
присоединить к OutlookExpress указанный файл (вложить в письмо) в
синтаксисе Shellexecute я в FAQах не нашел. Помогите, плиз, ну
очень-очень нужно!!!


Ответить.

Ответ 1:


Вопрос 388:

От: бОДТiК сВМПОУШЛЙК

У меня такая проблема:
запускаю 2 внешних програми из Delphi
WinExec(PChar('export.exe '+FileName3),SW_HIDE);
WinExec(PChar('arh '+FileName2+' *.damp'),SW_HIDE);

причем вторая должна запускатся после того как первая
завершит роботу. Как ето отследить?


Ответить.

Ответ 1:


Вопрос 389:

От: Ivan

Не знаю, может этот вопрос Вам покажется простым , но всё-таки: почему
при работе с TButton на моей форме я могу поменять её регион, на эллипс
например, но не могу поменять регион кнопки в винде, зная про неё
всё(регион, width, handle и т.д.).


Ответить.

Ответ 1:


Вопрос 390:

От: Гавриленко Ю.Н.

Возник следующий вопрос. Работаю с базами Paradox. После добавления или
редактирования записей использую функцию Post. Однако все изменения в
базу вносятся только после закрытия таблиц. Поэтому если виснет
компьютер, то все пропадает. В чем проблема, как в этих таблицах
функционирует Post. Может чего делаю не правильно. При работе с DBase
все было ОК.


Ответить.

Ответ 1:


Вопрос 391:

От: Shark

В текстовом файле, который обрабатывает программа, неоднократно
встречается признак конца файла (как этот файл создавался никто и
понятия не имеет), и как следствие если читать файл while not (eof), то
он будет прочитан до первого встреченного символа конца файла :(.

Как прочитать весь файл?



Ответить.

Ответ 1:


Вопрос 392:

От: sasa@hawk1.marka.net.ua

как создать надстройку для Word 97 c расширением .WLL,
что бы в итоге к основному меню Word 97 было добавлено
мое меню. Похоже на то как делают программы переводчики,
например Рута 3.01


Ответить.

Ответ 1:


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


Вопрос 233:

От: CyberZone

Здравствуйте. У меня проблема - я не хочу, чтобы из меню "пуск" в
Windows при нажатии на правую кнопку мыши нельзя было выключить
программу, а также как можно убрать программу при завершении программы
через Ctrl+Alt+Del.
С большой благодарностью Владимир.


Ответить.

Ответ 1:


Вопрос 234:

От: Енин Сергей Иванович

Как вытащить содержимое Stringgrid в QuickRep?
Через QRRichText туфта какая-то получается...


Ответить.

Ответ 1:
К ячейкам StrinGrid можно обращаться как к содержимому двухмерного
маиссива через команду StringGrid1.Cells[0,0]:='***', где:
- SrtingGrid1-название объекта
- Cells-свойство объекта SrtingGrid
- [0,0]-координаты ячейки
- ***-содержимое ячейки
Так все кладется и достается из SrtingGrid.


Вопрос 235:

От: Andrew

При работе с InterBase столкнулся со следующей проблемой:
Создаю индекс create index iNAME on books (NAME)
по объявленному следующим образом полю -
NAME varchar(200) not null collate PXW_CYRL
возникает ошибка:
Statement failed, SQLCODE = -607
unsuccessful metadata update
-key size too big for index INAME

а таким образом: NAME varchar(250) not null нет.
Как с этим бороться?


Ответить.

Ответ 1:


Вопрос 236:

От: Andrew Slobodyanyk

Вопрос: Как обработать событие - выход мыши за пределы формы?
Спасибо.


Ответить.

Ответ 1:
Можно через события OnMouseEnter/OnMouseLeave:
...........................................................................
TYourObject = class(TAnyControl)
...
private
FMouseInPos : Boolean;
procedure CMMouseEnter(var AMsg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var AMsg: TMessage); message CM_MOUSELEAVE;
...
end;

implementation


procedure TYourObject.CMMouseEnter(var AMsg: TMessage);
begin
FMouseInPos := True;
Refresh;
end;


procedure TYourObject.CMMouseLeave(var AMsg: TMessage);
begin
FMouseInPos := False;
Refresh;
end;
...........................................................................
Затем считывать параметр FMouseInPos.

Вопрос 237:

От: Станислав (GhostKeeper)

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

Меня зовут Станислав. Я программирую в Делфи уже 2 года. И я
столкнулся с таким вопросом, как можно сделать в Делфи АОН, то есть,
что бы он мог определять телефон звонящего. Может для этого надо
какой-нибудь компонент??? Или вы знаете адрес, по которому можно его
скачать??? Если можно, то пожалуйста, ответ продублируйте по e-mail'у.


Ответить.

Ответ 1:


Вопрос 238:

От: yuron

Вопрос: что такое Async Pro, где ее взять и как с ней работать?


Ответить.

Ответ 1:
AsyncPro - это отличный набор компонент для работы с портами.
Ответ 2:
Очень качественный набор компонентов, стоит дорого -
больше 300 долларов, подробнее можно посмотреть на их
сайте www.turbopower.com


Вопрос 239:

От: bigmama

Подскажи, как вставлять в базу данных *.db картинки.
я создаю поле формата Graphic, копирую картинку в буфер
и вставляю комбинацией Ctrl+V или Shift+Ins, при этом винт
что-то пишет, но при проверке оказывается, что это поле пустое.
Не хотелось бы в приложении делать Load from file.
Еще вопрос: какой хороший редактор *.db - файлов.
если можно кинь ссылку на его дистрибутив.


Ответить.

Ответ 1:
После комбинации Ctrl+V поле переходит в Edit.
Для сохранения надо выполнить Post.
Ответ 2:
Из програмы загружаешь картинку из файла в поле базы -
всякие двоичные поля имеют свойство LoadFromFile...


Вопрос 240:

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

у меня 2 вопроса.
1) У меня DELPHI 5 я использую следущий код:
function HookProc(Code: integer; WParam: word; LParam: Longint):
Longint; stdcall;
var
begin
if Code >= 0 then
begin
result := 0;
FORM1.Label1.Caption:=char(wparam);
end
else
result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
HookHandle := SetWindowsHookEx(WH_keyboard, @HookProc, HInstance, 0);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if HookHandle <> 0 then
UnhookWindowsHookEx(HookHandle);
end;
При нажатии клавиши в моей программе всё работает нормально, а при
нажатии в другом выскакивает сообщение "Программа выполнила
недопустимую операцию... " и тд. Что делать amp&# 8'-(
2) Где можно скачать компоненты для программирования формы произвольной
формы :)


Ответить.

Ответ 1:
Когда инсталлируешь хук , то Callback процедура становится "сама по
себе" , и не знает Form1 ! Попробуй так :
Объяви константу
WM_KEYHOOK=WM_USER+600;

В форме
type
TForm1 = class(TForm)
...
public
procedure HookReaction(var M:TMessage);message WM_KEYHOOK;
end;

procedure TForm1.HookReaction;
begin
Label1.Caption:=char(M.wparam);
end;

function HookProc(Code: integer; WParam: word; LParam: Longint):
Longint; stdcall;
var
h:Hwnd;
begin
if Code >= 0 then
begin
result := 0;
h:=FindWindow('TForm1','caption формы');
if h<>0 then
sendmessage(h,WM_KEYHOOK,wparam,lparam);
end
else
result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;

Писал сходу , может где ошибка синтаксиса , но идея та !
[KingPin]
Ответ 2:
Компоненты для программирования форм непрямоугольной формы поищи на http://www.torry.net, в разделе
VCL/Forms/NonRectangular или что-то типа этого.
Ответ 3:
О-о, Евгений, ты попал... :-))

Это целый геморрой, ловить клавиши, нажатые в другой
программе и отправлять их своей. Я как-то месяц головой об
стену бился с этим "...выполнила недопустимую операцию..."

Вся беда в том, что процедура-обработчик HookProс должна
резидентно сидеть в памяти. Т.е. нужно писать DLL-ку с этой
процедурой (File, New, DLL), а из основной
программы ставить хук с указанием адреса этой процедуры.
А пойманные процедурой клавиши через виндовые сообщения
сплавлять своей программе.

Короче, вот тебе работающий кусок программы и DLL-ки (Delphi4):



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

const
{пользовательские сообщения}
wm_kbrd_Event = wm_User + 133;

type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure WM_KBRD (Var M : TMessage); message wm_kbrd_Event;
public
{ Public declarations }
end;

var
lh:HINST;
handl:hhook;
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
hkprcKeyboard: TFNHookProc;

begin
lh:=LoadLibrary('keybrd.dll');
hkprcKeyboard := GetProcAddress(lh, 'HookProc');
handl:=SetWindowsHookEx(WH_KEYBOARD, hkprcKeyboard, lh, 0);
if handl=0 then ShowMessage('Какие-то проблемы с перехватом клавиш');
end;


procedure TForm1.WM_KBRD (Var M : TMessage);
begin
FORM1.Label1.Caption:=char(M.wparam)+' - Работает, зараза!';
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if handl<>0 then UnHookWindowsHookEx(handl);
FreeLibrary(lh);
end;

end.





library Keybrd;

uses Windows, Messages;

const
{пользовательские сообщения}
wm_kbrd_Event = wm_User + 133;
{handle для ловушки}
HookHandle: hHook = 0;


var saveexit:pointer;


{собственно ловушка}
function HookProc (Code: integer; wParam: LongInt; lParam: Longint): Longint; far; stdcall;
var
H: HWND;
begin
{если Code>=0, то ловушка может обработать событие}
if Code >= 0 then
begin
Result:=0;
{это те клавиши?}
if wParam = VK_NUMPAD5 then // здесь указываем, какую клавишу ловим
// - в данном случае цифру 5 на
// цифровой клавиатуре при вкл Numlock.
// Если ловим все клавиши, то условие
// убираем. Список кодов виртуальных
// клавиш (Virtual key codes) см. в win32.hlp
begin
{ищем окно по имени класса и по заголовку}
H := FindWindow('TForm1', 'Form1');
if h<>0 then
begin
{посылаем сообщение}
SendMessage(H, wm_kbrd_Event, wparam, 0);
result:=0;
end;
end
end
else
{если Code<0, то нужно вызвать следующую ловушку}
Result := CallNextHookEx(HookHandle,Code, wParam, lParam);
end;


exports HookProc;


{Это восстановление цепочки ловушек при выгрузке DLL}
procedure LocalExit;
begin
ExitProc:=saveexit;
end;

{Секция инициализации DLL, в данном случае -
присоединение DLL-ки к цепочке ловушек}
begin
saveexit:=exitproc;
exitproc:=@localexit;
end.




Усе. Все это компилируется и работает, только что проверил.

В Delphi 5 в принципе проблем быть не должно - один черт
работает WINAPI.


Вопрос 241:

От: Alexandr Sulimov

:Вопрос на тему Формы в ДЛЛ.

С бубном танцевать надоело в чем ошибка не пойму.
Ситуация такая.
В длл у меня форма, которую я показываю иногда показывается несколько
сразу из разных участков программы есть список с их хэндлами, она там работает, а когда
пользователю нужно закрыть он нажимает TForm.btOkClick и посылает сообщение
главной форме чтобы ее закрыли. (главное чтобы была оповещена главная
форма а потом убито окно).

Теперь достаем бубен.
Пример 1.
1. TMainForm.Button1Click - создали
2. TMainForm.Button2Click - убили (Все ок)
3. TMainForm.Button1Click - создали
4. TMainForm.Button2Click - убили (Все ок)
До бесконечности

Пример 2.
1. TMainForm.Button1Click - создали
2. TForm.btOkClick - на форме в ддл нажимаем Ок сообщение
попало в TMainForm (1 раз)
3. TMainForm.ApplyCloseMessage - убили (Все ок)
4. TMainForm.Button1Click - создали
5. TForm.btOkClick - на форме в ддл нажимаем Ок сообщение
попало в TMainForm (2 раз)
6. Ошибка Abstract Error
И ошибка будет появлятся все время, но если убить через
TMainForm.Button2Click то все пучком.
Если в процедуру FreeForm добавить пункы 1 и 2 тогда ошибка
возникнет на третий раз.

Поможите чем могеете хоть бубном другим!!!!!!!!!!!!!!!!!!Хельп. %)))

Кусок кода:

library xxx;

type Form1 = TTorm .....

var Form1 = Tform1; ....

{Отсылаем сообщение что можно закрывать}
procedure TForm.btOkClick(Sender: TObject);
begin
SendMessage(MainForm, WM_APPLYCLOSEWINDOW,
cntWindow, LongInt(Form1));
Close;
end;

{Содаем показываем форму}
Function ShowForm(AppHandle, MainFormHandle: THandle; thePathes: TUnAppPathes): LongInt; stdcall;
Begin
Pathes:=thePathes;
MainForm:=MainFormHandle;
Application.Handle:=AppHandle;
Form1:=TForm.Create(Application);
Result:=LongInt(Form1);
Form1.Show;
End;

{Убиваем форму}
Procedure FreeForm(aHandle: LongInt); stdcall;
Begin
If aHandle < 0 Then Exit;
{1} TfmSubNews(aHandle).Release;
TfmSubNews(aHandle).Free;
{2} CloseHandle(aHandle);
End;

In Project;

unit MainForm;

type
TMainForm = class(TForm).....
public
{ Public declarations }
procedure ApplyCloseMessage(var T: TMessage); message WM_APPLYCLOSEWINDOW;
end;

var
H: LongInt;

{Созлаем и Показываем Форму из ДЛЛ}
procedure TMainForm.Button1Click(Sender: TObject);
begin
H:=ShowForm(Application.Handle, MainForm.Handle, AppState.cfgPathes);
end;

{Получаем сообщение и закрываем форму}
procedure TMainForm.ApplyCloseMessage(var T: TMessage);
begin
T.Msg:=WM_APPLYCLOSEWINDOW;
FreeForm(LongInt(T.LParam));
end;

{Убиваем форму нажатием на кнопку}
procedure TMainForm.Button2Click(Sender: TObject);
begin
hdr_dlls.FreeFormNNTPSubscribe(StrToInt64(appState.cfgAccountCurItem.SubItems.Strings[4]));
end;




Ответить.

Ответ 1:


Вопрос 242:

От: Аргын Каиржанов

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





Ответить.

Ответ 1:


Вопрос 243:

От: Аргын Каиржанов

Не создается таблица!
В чем причина?
Ответьте, пожалуйста!

procedure TForm1.Button1Click(Sender: TObject);
var
MyQuery: TQuery;
begin
MyQuery:=TQuery.Create(self);
with MyQuery do begin
DatabaseName:='bigbud';
SQL.Clear;
SQL.Add('SELECT num,name FROM dept');
Open;
// сохранить результат SQL-запроса
DbiMakePermanent(MyQuery.Handle, 'c:\arc\temp.db',true);
end;
end;


Ответить.

Ответ 1:


Вопрос 244:

От: Sergey Butakov

Здравствуйте, уважаемый редактор рассылки Проблемы и решения в Delphi.
Хотелось бы задать в рассылку следующий вопрос:

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

С уважением Сергей. swb@agtu.secna.ru

:




Ответить.

Ответ 1:


Вопрос 245:

От: Ольга

Здравствуйте. У меня при открытии параметрического запроса

'select pole1, pole2, pole3 from'+Name+
'where pole1=:Param1 and pole2=:Param2 order by pole3'

возникает ошибка EDBEngineError:
'Invalid parametr. File or directory does not exist.
File: c:\..\PDOXUSRS.lck
File: c:\..\PARADOX.lck'

(C:\..\- локальный путь, здесь находится таблица, из которой делается запрос)

Причем в 80-ти % случаев запрос выполняется успешно.
Ошибка начала возникать после того, как я стала использовать
файлы Paradox в сети. В чем может быть дело?
С уважением Ольга.




Ответить.

Ответ 1:

Попробуйте после переменной Name в вырыжении SQL добавить
+ '.db' + , если тип базы данных не указан в переменной
Name. Можно также попробовать поменять тип базы данных,
используемых по умолчанию в ваших DB - компонентах
(DBase, Paradox) может быть здесь что-то не так.


Вопрос 246:

От: Евгений



Проблема для меня сложная но, наверное, набившая Вам оскомину.

Мой любимый шеф поставил задачу написать одну программку.
Т.к. программист из меня как из собачьего... я взял учебники по ТП
6.0, 7.0 и погнал (я когдато на нем "писал"). Сначала писал прос-
то. Потом вычитал про объектное программирование. Попробовал -
понравилось. Все это время я потихоньку приближался к заветной
цели. Но т.к. мой шеф так до конца и не понял, что он хотел, то я
предвидел возможные варианты изменения "требований". В результа-
те, я писал по ДОСовский интерфейс (извиняюсь, если ошибаюсь в
терминологии), и программку строил так, что все "расчетные" цацки
делают одни объекты а интерфейсная часть должна была делаться
другими. За это время я сумел "наворотить" почти все необходимые
мне "расчетные" библиотечные модули. Буквально вчера я начал пи-
сать первый метод интерфесного объекта (естественно с использова-
нием модулей Crt и Windows), как мой шеф вспомнил, что писать
програмки под ДОС не "солидно" и ему нужен виндовый интерфейс.
Проблема вот в чем. Я попытался с использованием TP for Win-
dows подключить свои старые модули написанные с использованием
стандартнык досовских модулей Dos.tpu и других. На что мне компи-
лятор сказал, что он не видит моих модулей, но с расширением TPW.
Попытка перекомпилировать все ни к чему не привела т.к. он захо-
тел перекомпелировать все модули в том числе и DOS.PAS но не на-
шел. Простое переименование модулей из tpu в tpw естественно ни к
чему не привело. Вставка ссылки на новый модуль WinDos вместо Dos
привелок тому что масса переменных и функций стали неизвестными а
при попытке редактировать я понял, что поменялись не только имена
процедур и функций, но и параметры передаваемые им.

Исправлять почти 1500 строк кода не хочется. Кроме того воз-
можно, что эти процедуры работают не так как их "прадеды" и полу-
чу весьма неожиданный результат. Плюс ко всему в TP for Windows,
я так понял, нет стандартных наборов объектов как в Delphi.

Вопрос следующий как мне использовать мои откомпилированные
библиотеки *.tpu с процедурами, функциями и объектами в Delphi.

Извиняюсь за сумбурность и длительность изложения.

Если можно, ответ пришлите мне на адрес jeckp@mai.ru или в
рассылке Проблемы и решения в Delphi. Я недавно на нее подписался
(правда пока почти не читал).

С уважением,
Евгений



Ответить.

Ответ 1:
Это очень сложно (через thumb) - причина в том чтo
Delphi 32 битный а твои модули - 16 битные, еще и под
ДОС, исправить процедуры и перекомпиллировать как DLL
под Делфи гораздо легче чем организовать эти вызовы
(если конечно ваш код не больше нескольких миллионов строк...)


Вопрос 247:

От: Comp_otdel

Здравствуйте!
У меня вопросик. Есть программа - EXE-шник.
Запускаешь ее - садится спокойно в трей, никого не трогает.
Щелкаешь по ней 2 раза мышкой - вываливается окно (логично!).
Так вот можно ли как-то из моей программы на Delphi заставить
ее не разворачиваться при щелчке мышкой. Или в Windows какие
настройки есть? И можно ли как-то прогу вообще из трея выкинуть,
но не из памяти?
Спасибо.
Вадим.


Ответить.

Ответ 1:
По-моему, чтобы ее убрать из трэя, надо просто разобраться вот с этим
примером: в нем и удаление, и щелчки мышкой в трэе написаны:

В программах для Windows 95 и выше часто используется TrayIcon –
иконка справа на TaskBar, которая позволяет программе почти
не занимать места на экране и при этом быть всегда доступной.
Для работы с TrayIcon используется функция Shell_NotifyIcon,
в которую передается команда: NIM_ADD, NIM_MODIFY или NIM_DELETE
для создания изменения и удаления соответственно,
и структура TNotifyIconData. У каждой TrayIcon в вашем приложении
должен быть свой uID.

const

WM_NOTIFYTRAYICON = WM_USER + 1;
...
private
procedure WMTRAYICONNOTIFY(var Msg: TMessage);
message WM_NOTIFYTRAYICON;
...
uses ShellAPI;

procedure TForm1.WMTRAYICONNOTIFY(var Msg: TMessage);
var
s: String;
begin
case Msg.LParam of
WM_MOUSEMOVE: s := 'Мышь сдвинута';
WM_LBUTTONDOWN: s := 'Левая кнопка нажата';

WM_LBUTTONUP: s := 'Левая кнопка отпущена';
WM_LBUTTONDBLCLK: s := 'Два раза нажата левая кнопка';
WM_RBUTTONDOWN: s := 'Правая кнопка нажата';
WM_RBUTTONUP: s := 'Правая кнопка отпущена';
WM_RBUTTONDBLCLK: s := 'Два раза нажата правая кнопка';
else s := IntToStr(Msg.LParam);
end;
ListBox1.Items.Add(s);
ListBox1.ItemIndex := ListBox1.Items.Count - 1;
end;

procedure TForm1.FormCreate(Sender: TObject);

var
tray: TNotifyIconData;
Ic: TIcon;
begin
Ic := TIcon.Create;
Ic.LoadFromFile('Icon1.ico');
with tray do begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Form1.Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_NOTIFYTRAYICON;
hIcon := Ic.Handle;
szTip := ('Это наша иконка');
end;
Shell_NotifyIcon(NIM_ADD, Addr(tray));

Ic.Destroy;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
tray: TNotifyIconData;
Ic: TIcon;
begin
Ic := TIcon.Create;
Ic.LoadFromFile('Icon2.ico');
with tray do begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Form1.Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_NOTIFYTRAYICON;
hIcon := Ic.Handle;
szTip := ('Это другая иконка');

end;
Shell_NotifyIcon(NIM_MODIFY, Addr(tray));
Ic.Destroy;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
tray: TNotifyIconData;
begin
with tray do begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Form1.Handle;
uID := 1;
end;
Shell_NotifyIcon(NIM_DELETE, Addr(tray));
end;



Вопрос 248:

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


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

Я пишу БД, в BLOB-поле которой помещаю мультимедийный файл mp?, wav.
Можно ли проиграть содержимое этого поля каким-то образом? То есть,
сделать что-то вроде TDBImage для музыки.

Спасибо! Вадим. vadims@mksat.net <mailto:vadims@mksat.net>



Ответить.

Ответ 1:
Все очень просто:


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;


Вопрос 249:

От: Hecht Andreas

Hecht Andreas

Люди, поможите!

Очень нужен простейший исходник SEA BAT (морской бой) на С++
или DELPHI !
Очень срочно.

<mailto:hecht@chat.ru> hecht@chat.ru


Ответить.

Ответ 1:


Вопрос 250:

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

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

У меня есть программа с TreeView. В дереве много узлов и подузлов.
Пользователь, естественно, по ним перемещается.
Подскажите, пожалуйста, как реализовать навигатор, то есть пару кнопок с
выпадающим меню для того, чтобы быстро перейти в предыдущий топик -
следующий топик, как в MS Internet Explorer'е (Назад-Вперед)?

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


Ответить.

Ответ 1:
Ну так в чем проблема? Запоминаешь историю передвижения по дереву в массив и вперед.
Ответ 2:
По-моему, надо хранить в переменной типа TList список указателей на
последние объекты, кнопки с выпадающими меню создаются на панели
управления, а чтобы добавлять или удалять пункты этих меню - изменяй
массив Items у TPopupMenu:


Вопрос 251:

От: "Пуфик"

Хочу раскрасить колонку в DBGrid в зависимости от имеющегося значения
в ячейке. ВИGridDrawColumnCell прекрасно работает, однако при установке
курсора на ячейку она рисуется тем же цветом, что и невыбранная.

Как с этим бороться?

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



Ответить.

Ответ 1:
Лучше использовать компонент rxDBGrid из пакета RxLib. В этом компоненте
есть событие OnGetCellsParams, где и можно раскрашивать таблицу во все
цвета радуги ;)))
Ответ 2:
Чтобы в TDBGrid нарисовать выделенную ячейку другим цветом, надо
проанализировать свойства SelectedRows и (SelectedField или
SelectedIndex) и если рисуемая ячейка из списка выделенных - рисуем ее
по-другому или ваще сами не рисуем...
Ответ 3:
Проверяй, является ли строка той, на которой находится курсор. А вообще
купи себе книгу Шумакова "Проектирование БД в DELPHI" (или что-то в этом
роде :), в ней это очень подробно и на примерах описано.
ЗЫ: Это - не реклама, а книга мне помогла написать дипломный проект и
создать методички для студентов.


Вопрос 252:

От: alx

Я пишу консольный почтовый клиент. Как мне инициализировать TNMSmtp ?
(У меня нет ни одной формы). Про такой метод как Create я слышал, но
что указать в параметре Owner ? Напишите пример, пожалуйста, а то я
ещё только начинающий программист.


Ответить.

Ответ 1:
Можно в консольный проект добавить DataModule и класть невизуальные
компоненты на него.
Ответ 2:
У любого компонента Owner всегда можно оставить nil, если более
подходящего значения не находится. Только освобождать его тогда тоже
придётся самому. Если же Owner указан и не nil, то соответственно он и
будет заботится об освобождении всех своих подопечных.
Например:
если создать компонент так:
SomeComponent1:= TSomeComponent.Create(nil);
то по окончании использования его надо удалить примерно так:
SomeComponent.Free();

если же компонент создан так:
SomeComponent1:= TSomeComponent.Create(Form1);
то о дальнейшей его судьбе беспокоится не стоит - форма сама освобождает
все подчинённые ей компоненты перед тем, как сама удалится из памяти
например при выходе из программы или при вызове Form1.Free();
Ответ 3:
var Smtp : TNMSmtp;

begin
Smtp := TNMSmtp.Create(nil);
try
// All work stuff here
finally
Smtp.Free; // <- it's very important
end;
end;
Ответ 4:
Способ, который точно работает:
К проекту консольной прикладухи
добавить форму, например, TNMSmtpForm,
и положить туда нужные компоненты.
Потом из консолького кода вызывать
TNMSmtpForm.Create(nil) и работать
с ее компонентами.


Вопрос 253:

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

Здрасте!
Это опять я надоедаю со своими глупостями...
А можно как-то форму сделать невидимой, а кое-что, что на ней, видимым?
Н-р: 100 кнопок и только одна закроет форму...
А как сделать форму круглой и красивой, с круглыми кнопками?
Благодарю, если пойму!


Ответить.

Ответ 1:
Уф! :-) Лучше всего для такого рода приколов (еще бы, 100 кнопок!)
использовать специфические компоненты - аля 1stClass или что-нить похожее
(енто для круглых кнопок, к примеру).
Если нет ничего под рукой, то пользуйтесь функциями WinAPI для нестандартной
формы:
* CreateRectRgn
* CreateEllipticRgn
* CombineRgn и пр.
и прочими. (По WinAPI есть замечательная справка, на английском, ну и что!
Там все хорошо описано - пусть не всегда, но вот по поводу этих - все в
порядке).


Вопрос 254:

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

Я бы хотел очень плохому человеку посылать воспоминания обо мне.
Но он поставил защиту...
Как мне быть анонимным? Или может есть уже где-то такая
e-mail-программка,
но не с "русским" лицом и просто "To" "From" "Subject" "Attachment"
"Text".
Может кто-то напишет и мне подарит!? Размещу у себя на странице и
обязательно укажу источник!
Danke www.irop.de <http://www.irop.de> Игорь



Ответить.

Ответ 1:


Вопрос 255:

От: anton

Здравствуйте.
Скажите я сделал ScreenSaver,перевёл из *.exe в *.scr.Как написать процедуру
чтобы он работал как настоящий ScreenSaver,чтобы при движении мыши он
исчезал и выполнял бы другие функции.
Антон.


Ответить.

Ответ 1:
TfmMain.OnMouseMove(...)
begin
Close;
или
Hide;
end;
Ответ 2:
Чтобы он исчезал, нужно переопределить у Application метод OnMessage и
в нем ждать прихода сообщения WM_MOUSEMOVE...






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

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

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

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

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



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

В избранное