Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 5

Автор: greenpc
Дата сообщения: 30.03.2010 15:31
Man_Without_Face

Код: var
LibHandle: THandle;
fDisplaySampleReport: procedure(appHandle : THandle; myconnection :Tdatabase );
Автор: Odysseos
Дата сообщения: 30.03.2010 16:53
AviDen

Хм, а я вот задумался - с чего бы это?

Уж скока раз этот вопрос обсуждали

Если мы будем пользовать BorlndMM.dll (или FastMM - который умеет и без отдельной dll находить свои копии и цепляться к ним) - то тогда передача объектов из exe в dll и обратно работать будет - но только в том случае, если и в dll, и в exe у классов этих объектов "симметричные" VMT (то есть - набор и последовательность методов в VMT у exe.MyClass и у dll.MyClass одинаковы), а так будет только в том случае, если и exe, и dll скомпилированы одной версией компилятора, с одинаковыми настройками, с одинаковыми условными ключами компиляции и с одинаковыми версиями VCL и сторонних библиотек. А это - гадание на кофейной гуще.

Есть более надежный способ - передавать объекты не как объекты, а как интерфейсы (кроме того - так можно передавать их и между Delphi-exe и C++-dll, например).
Автор: Cryogen2003
Дата сообщения: 30.03.2010 18:15
Добрый вечер. Есть ли в природе компоненты, которые позволяют работать с оборудованием Cisco (IP) (сеть у нас подключается тут через телефон)?
Нужно встроить в свой проект дополнительный функционал - автонабор номера из программы, определение номера звонящего и так далее. Есть в природе программа - WebAgent зовется, там все фичи реализованны, но за лицензию за каждого пользователя просят слишком много, плюс ко всему глючная по полной.
Автор: Frodo_Torbins
Дата сообщения: 30.03.2010 19:04
AviDen
Вы забываете про глобальные переменные, которые есть в системных модулях и по идее должны существовать в единственном экземпляре. Плюс в этом случае TButton в exe и dll - разные вещи, и проверка аналогичная Sender is TButton не сработает.
Автор: greenpc
Дата сообщения: 31.03.2010 07:22
Frodo_Torbins
а что мешает передать форму?

Код: Procedure PluginExec(appHandle : THandle; parForm : TForm); stdcall;
var
i : Integer;
TmpStr : string;
begin
Application.Handle := appHandle;
try
for i := 0 to parForm.ComponentCount - 1 do begin
TmpStr := TmpStr+ Format('Name - %s; class - %s', [parForm.Components[i].Name, parForm.Components[i].ClassName])+#13#10;
end; // for
showmessage(TmpStr);
finally
Application.Handle := 0;
end;
end; //
Автор: Frodo_Torbins
Дата сообщения: 31.03.2010 10:03
greenpc
Ничего, кроме кучи странных и трудно выловимых глюков, с которыми вы скорее всего столкнетесь, если реальный код будет немного сложнее того, что вы написали. В общем, имхо, если нужно активное взамодействие компонентов в dll и exe, то проще всего будет включить рантайм пакеты.
Автор: AviDen
Дата сообщения: 31.03.2010 10:05
Odysseos, Frodo_Torbins короче, понятно, такой метод годится разве что для энтузиастов и на спор (типа заработает-не заработает). BPL наше всё, как и было сказано изначально ))

greenpc, да ничего не мешает. Но в указанном случае объект класса exe.Forms.TForm будет явно приведен к типу dll.Forms.TForm (не забываем, что и dll, и exe имеют свои экземпляры модуля Forms, да и всех прочих). Если, как сказал Odysseos, оба бинарника скомпилированы из 100% одинаковых исходников и в 100% равных настройках окружения/компиляции и пр. - это будет работать. В противном случае получим массу увлекательных (и трудноуловимых) багов.

Например, вызывая в той же процедуре PluginExec метод parForm.Show мы передаём управление к методу dll.Forms.TForm.Show, но указатель на данные (Self) туда передаётся из exe.Forms.TForm. Если в этих двух структурах данных (exe.Forms.TForm и dll.Forms.TForm) есть хоть малейшие отличия (напр., по-разному выровнены поля в записях) - пиши пропало.
Автор: EugeneBoss3
Дата сообщения: 01.04.2010 07:27
Знатоки, помогите решить проблему.
Имеется главная форма и форма ввода кода доступа. Список пользователей хранится в таблице Users база Firebird.
Как сделать, чтобы при вводе пароля в окне форма ввода кода доступа, проводилась его проверка на корректность в базе данных, и в случае, если пользователь не найден в базе - программа завершается без вывода главной формы без противного мигания.
Автор: psa1974
Дата сообщения: 01.04.2010 07:59
EugeneBoss3

Цитата:
Знатоки, помогите решить проблему.

Что уже было сделано, в ходе чего возник вывод, что что-то не получается? Какие свои наработки в данном направлении?
И потом, что именно не ясно - как сделать политкорректность кода доступа, или как сделать, чтоб не было некоего противного мигания?
Автор: greenpc
Дата сообщения: 01.04.2010 08:13
EugeneBoss3

Код: procedure TForm1.RunP();
begin
if not Loginform.connected then begin
MessageDlg('Завершаю работу с программой', mtWarning, [mbOK], 0);
Application.Terminate;
end;
end; //
Автор: AviDen
Дата сообщения: 01.04.2010 10:19
EugeneBoss3

Цитата:
Имеется главная форма и форма ввода кода доступа. Список пользователей хранится в таблице Users база Firebird.
Как сделать, чтобы при вводе пароля в окне форма ввода кода доступа, проводилась его проверка на корректность в базе данных, и в случае, если пользователь не найден в базе - программа завершается без вывода главной формы без противного мигания.

В главной форме в обработчике OnCreate пишешь следующее:

Код:
Try
// Здесь делаем все необходимые действия по подготовке приложения к старту,
// в т.ч. и отображение формы логина. В случае, если возникает необходимость
// завершить работу приложения, так и не покзав главную форму - просто вызываем Abort
// напр.:
If Not ShowLoginForm Then Abort;
Except
Application.ShowMainForm:= False;
Application.HandleException(Self);
Application.Terminate;
Exit;
End;
Автор: OOD
Дата сообщения: 01.04.2010 10:59
Подскажите как сделать чтобы при нажатии на кнопку , она перемещалась:

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Top:=100;
end;
Автор: Frodo_Torbins
Дата сообщения: 01.04.2010 11:03
OOD
Button1.Top можно использовать и справа от знака присваивания. Или вам нужно случайное значение? Тогда читайте хелп по функциям Random и Randomize.
Автор: greenpc
Дата сообщения: 01.04.2010 11:04
OOD
case Button1.Top of
100 : Button1.Top :=200;
else Button1.Top:=100;
end;
или с тем же успехом if then

Добавлено:
AviDen
Abort на onCreate не работает(точнее работет как выход из процедуры). так же например как на onShow.
теория была на королевстве. жизнь формы.

Автор: AviDen
Дата сообщения: 01.04.2010 12:13
greenpc, там всё как бы обёрнуто в Try..Except, так что работает влёт. Это не с королевства, это из десятка рабочих коммерческих проектов ))
Автор: greenpc
Дата сообщения: 01.04.2010 12:45
AviDen

Код: procedure TForm1.FormCreate(Sender: TObject);
begin
try
abort;
lst1.ItemIndex := 1;
except
    on e: Exception do
        Application.HandleException(Sender);
end; // try/except
end;
procedure TForm1.FormShow(Sender: TObject);
begin
lst1.ItemIndex := 2;
end;
Автор: AviDen
Дата сообщения: 01.04.2010 13:51
greenpc, это, типа, первоапрелькие шутки такие или Вы в самом деле не понимаете?

В моём примере, приведённом выше, всё будет работать именно так, как описано, т.е., при возникновении любого исключения в блоке Try..Except будет отображено сообщение об ошибке (Application.HandleException(Self)), будет подавлено отображение главной формы (Application.ShowMainForm:= False) и приложение завершит свою работу (Application.Terminate), после чего будет произведен выход из обработчика (Exit), дабы не выполнялся дальнейший код обработчика, если он есть.

В Вашем примере (в котором секция Except..End совсем не такая, как в моём) действительно форма будет показана, т.к. 1) при вызове abort будет сгенерировано исключение EAbort, 2) оно будет перехвачено обработчиком "on e: Exception do ..." (т.к. EAbort есть наследник от Exception) 3) ничего не произойдёт, т.к. Application.HandleException просто игнорирует EAbort, в чём легко убедиться из исходников, плюс это следует и из самого определения EAbort ("тихое" исключение).

Т.о., в обработчике TForm1.FormCreate значение lst1.ItemIndex изменено не будет. А в TForm1.FormShow - напротив, будет установлено в 2.

Добавлено:
upd:

Цитата:

Цитата: обёрнуто в Try..Except
и что? я же не вызываю исключение.
Автор: tiberium23
Дата сообщения: 01.04.2010 23:01
Delphi 7 HELP
Здарова народ!!! Нужна помощ. Нужно помочь сделать лабы по делфи.
Буду очень благодарен))))
[more=Лаба №1]
только в этой лабе мой вариант 17
вот лаба: лаба1
задания нах-ся в конце.
[/more]

[more=Лаба №2]
Задания по вариантам: мой вариант 16
Примечание. Созданные программы необходимо сохранить. Они Вам понадобятся в

дальнейшем.

Задание 1. Составьте программу построения кусочно-заданной функции:


Задание 2. Составьте программу построение функции с учетом области

определения y=F(x):
y=lg((1+x)/(1-sinx))

Здесь вся лаба: лаба2
[/more]

[more=Лаба №3]
мой вариант 16
вот лаба: лаба3
задания нах-ся в конце.
[/more]

[more=Лаба №4]
мой вариант 16
вот лаба: лаба4
задания нах-ся в конце.
[/more]

[more=Лаба №5]
мой вариант 16
вот лаба: лаба5
задания нах-ся в конце.
[/more]
Если будет не сложно прошу сделать "каждую" строку с коментарием. Когда препод

проверяет лабу он спрашивает, что как сделал, за что отвечает эта команда (строка) и тд и

тп))) Спасибо!!!
Автор: volser
Дата сообщения: 01.04.2010 23:29
tiberium23
Сколько денег?
Автор: jonikDk
Дата сообщения: 02.04.2010 11:42
tiberium23
просто жесть ... или это первоапрельская шутка ...
Автор: apnss
Дата сообщения: 03.04.2010 00:48
tiberium23
стучи в личку. думаю договоримся
Автор: EugeneBoss3
Дата сообщения: 03.04.2010 03:34
greenpc
AviDen
Спасибо за участие! Помог вариант с запуском Loginform. Проблема в том что используется модуль данных, а когда создается главная форма, модуль данных еще не создан!
Автор: AviDen
Дата сообщения: 03.04.2010 09:35
EugeneBoss3, так Вам ничего не мешает в .dpr-файле строку, в которой создаётся модуль данных, поместить перед строкой, в которой создается главная форма.
Автор: EugeneBoss3
Дата сообщения: 03.04.2010 12:51
AviDen
Спасибо, попробую
Автор: EugeneBoss3
Дата сообщения: 06.04.2010 01:15
Коллеги! Помогите убрать мусор из базы Firebird. Использую компонент IBDAC. Как програмно сжать базу Firebird?
Автор: Tantos
Дата сообщения: 06.04.2010 03:36
EugeneBoss3
backup/restore через TIBCBackupService/TIBCRestoreService в Professional-редакции.
Автор: EugeneBoss3
Дата сообщения: 06.04.2010 04:07
Tantos
Пример настройки параметров backup/restore возможно?
Автор: Tantos
Дата сообщения: 06.04.2010 09:25
EugeneBoss3
Я могу сказать, как сделать это через стандартный gbak. А самих компонентов у меня нет - FIBPlus использую.
Автор: Man_Without_Face
Дата сообщения: 06.04.2010 10:10
Доброго времени суток, вопрос опять по Dll. Передаю параметры с маин формы (скомпилирована под DELPHI 5) в Dll (CodeGear2009).
Main:
[more]
PlugExec : Procedure (appHandle: Thandle; msAliasName, msUser, msPassword : pChar); stdcall; //Объявление функции, которая будет выполнять плугин
........................................................................................................................
try
msAliasName := 'CardCenter';
msUser := 'berlio';
msPassword := 'verlama';

PlugExec(application.handle, pChar(msAliasName), pChar(msUser), pChar(msPassword));
except
on e: Exception do
MessageDlg('Не могу соединиться с базой: ' + PChar(E.Message), mtError, [mbOK],0);
end;
[/more]
Dll:
[more]
procedure PluginExec(AppHandle:THandle; msAliasName, msUser, msPassword : pChar); stdcall;
begin
try
Application.Handle:=AppHandle;
frmReports := TfrmReports.Create(nil);
except
on e: Exception do ShowMessage('Ошибка при загрузке формы отчетов: '+E.message);
end;
try
frmReports.database1.Close;
frmReports.database1.AliasName:=strPas(msAliasName);
frmReports.database1.Params.Values['USER NAME']:=strPas(msUser);
frmReports.database1.Params.Values['PASSWORD']:=strPas(msPassword);
except
on e: Exception do ShowMessage('Ошибка передачи параметров для соединения с базой: '+E.message);
end;

try
showmessage(frmReports.database1.AliasName);
showmessage(frmReports.database1.Params.Values['USER NAME']);
showmessage(frmReports.database1.Params.Values['PASSWORD']);
frmReports.database1.Open;
except
on e: Exception do ShowMessage('Ошибка соединения с базой: '+E.message);
end;
end;
[/more]
В итоге параметры криво передаются (квадраты одни на showmessage).
Я так понимаю это из-за разных версий компиляторов, можно ли это как нибудь обойти?
Автор: Frodo_Torbins
Дата сообщения: 06.04.2010 10:14
Man_Without_Face
Обьявления в dll и exe должны различатся. В dll будет pAnsiChar.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.