← Август 2001 → | ||||||
1
|
3
|
4
|
5
|
|||
---|---|---|---|---|---|---|
6
|
7
|
8
|
10
|
11
|
12
|
|
13
|
14
|
15
|
17
|
18
|
19
|
|
20
|
21
|
22
|
24
|
25
|
26
|
|
27
|
28
|
29
|
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 #24
Проблемы и решения в 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 |
В избранное | ||