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

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

Автор: greenpc
Дата сообщения: 26.06.2009 13:36
Grande
имелось в виду что когда запрос выполнится
if Query.active = true then .. запрос выполнился
а так volser прав.все команды идут последовательно
Автор: Grande
Дата сообщения: 26.06.2009 13:37
volser
То есть, метод Open возвращает управление ПОСЛЕ выполнения транзакции?
Автор: f3ka
Дата сообщения: 26.06.2009 13:42
Grande
скорее не транзакции, а того что было послано в качестве команды серверу... то есть управление вернется только после выполнения команды SQL... это при синхронном режиме работы...
З.Ы. кстати не только Open, но и ExecSQL
Автор: greenpc
Дата сообщения: 26.06.2009 13:42
Grande
обчно да. создайте на сервере процедуру задержки допустим на 1мин.
и сделайте open на приложении. а следующей командой
на приложении - выдать сообщение (hello world) и посмотрите
Автор: Grande
Дата сообщения: 26.06.2009 13:42
greenpc
Понял. Спасибо огромное

Добавлено:
f3ka
Я смутно подозревал оное, теперь убедился Спасибо!
Автор: SIgor33
Дата сообщения: 26.06.2009 14:31
есть главная форма с MSConnection1
Как можно это соеденения передать в Dll в формы
в MSQuery1, MSQuery2 и тп.
что бы каждая форма не соединялась по своему.
Автор: volser
Дата сообщения: 26.06.2009 14:37
SIgor33

Что за компонент MSConnection1?
Автор: SIgor33
Дата сообщения: 26.06.2009 14:41
volser
Это от SDAC ---Connection
Автор: volser
Дата сообщения: 26.06.2009 14:58
SIgor33

Сделайте в длл процедуру, и вызывайте ее перед созданием формы

Код:
procedure AssignConnection(MSConnection: TMSConnection); cdecl;
Автор: f3ka
Дата сообщения: 26.06.2009 15:02
volser
почему
Цитата:

Код: procedure AssignConnection(MSConnection: TMSConnection); cdecl;
Автор: volser
Дата сообщения: 26.06.2009 15:06
f3ka


Цитата:
почему


Просто скопировал с примера, работает или нет не проверял.

[more=Пример]


Код:
unit DLLMain;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, MemDS, StdCtrls, ExtCtrls, DBCtrls, DBAccess,
MSAccess;

type
TfmDllMain = class(TForm)
MSQuery: TMSQuery;
DBGrid: TDBGrid;
DataSource: TDataSource;
pnToolBar: TPanel;
btOpen: TButton;
btClose: TButton;
DBNavigator: TDBNavigator;
procedure btOpenClick(Sender: TObject);
procedure btCloseClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

procedure AssignConnection(MSConnection: TMSConnection); cdecl;
procedure ShowForm; cdecl;
procedure HideForms; cdecl;

implementation

{$R *.DFM}

var
ExternalMSConnection: TMSConnection;
FormList: TList;
FormCount: integer;

procedure AssignConnection(MSConnection: TMSConnection); cdecl;
begin
ExternalMSConnection:= MSConnection;
end;

procedure ShowForm; cdecl;
begin
with TfmDllMain.Create(Application) do begin
Inc(FormCount);
Caption:= IntToStr(FormCount) + '. ' + Caption;
MSQuery.Connection := ExternalMSConnection;
MSQuery.Active := True;
Show;
end;
end;

procedure HideForms; cdecl;
begin
while FormList.Count > 0 do begin
TForm(FormList[0]).Free;
FormList.Delete(0);
end;
end;

procedure TfmDllMain.FormShow(Sender: TObject);
begin
FormList.Add(Self);
end;

procedure TfmDllMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FormList.Remove(Self);
Action := caFree;
end;

procedure TfmDllMain.btOpenClick(Sender: TObject);
begin
MSQuery.Open;
end;

procedure TfmDllMain.btCloseClick(Sender: TObject);
begin
MSQuery.Close;
end;

initialization
FormCount:= 0;
FormList:= TList.Create;
finalization
HideForms;
FormList.Free;
end.
unit ExeMain;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Grids, DBGrids, Db, MemDS, DBCtrls, DBAccess, SdacVcl,
MSAccess;

type
TfmExeMain = class(TForm)
MSConnection: TMSConnection;
MSConnectDialog: TMSConnectDialog;
pnToolBar: TPanel;
btLoadDLL: TButton;
btFreeDLL: TButton;
DBGrid: TDBGrid;
btConnect: TButton;
btDisconnect: TButton;
btOpen: TButton;
btClose: TButton;
MSQuery: TMSQuery;
DBNavigator: TDBNavigator;
DataSource: TDataSource;
btShowForm: TButton;
btHideForms: TButton;
procedure btLoadDLLClick(Sender: TObject);
procedure btFreeDLLClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btConnectClick(Sender: TObject);
procedure btDisconnectClick(Sender: TObject);
procedure btOpenClick(Sender: TObject);
procedure btCloseClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btShowFormClick(Sender: TObject);
procedure btHideFormsClick(Sender: TObject);
private
hDLL:HModule;

public

end;

TAssignMSConnection = procedure (MSConnection: TMSConnection); cdecl;
TShowForm = procedure; cdecl;
THideForms = procedure; cdecl;

var
fmExeMain: TfmExeMain;

implementation

{$R *.DFM}

procedure TfmExeMain.btLoadDLLClick(Sender: TObject);
var
AssignMSConnection: TAssignMSConnection;
begin
if hDLL = 0 then begin
hDLL := LoadLibrary('MS_DLL.dll');
if hDLL <> 0 then begin
@AssignMSConnection := GetProcAddress(hDLL, 'AssignConnection');
if @AssignMSConnection <> nil then
AssignMSConnection(MSConnection);
MessageDlg('DLL is loaded', mtInformation, [mbOk], 0);
end
else
MessageDlg('Cannot load DLL', mtError, [mbOk], 0);
end;
end;

procedure TfmExeMain.btShowFormClick(Sender: TObject);
var
ShowForm: TShowForm;
begin
if hDLL <> 0 then begin
@ShowForm := GetProcAddress(hDLL, 'ShowForm');
if @ShowForm <> nil then
ShowForm;
SetFocus;
end
else
MessageDlg('DLL is not loaded', mtError, [mbOk], 0);
end;

procedure TfmExeMain.btHideFormsClick(Sender: TObject);
var
HideForms: THideForms;
begin
if hDLL <> 0 then begin
@HideForms := GetProcAddress(hDLL, 'HideForms');
if @HideForms <> nil then
HideForms;
end
else
MessageDlg('DLL is not loaded', mtError, [mbOk], 0);
end;

procedure TfmExeMain.btFreeDLLClick(Sender: TObject);
begin
if hDLL <> 0 then begin
FreeLibrary(hDLL);
hDLL:= 0;
end
else
MessageDlg('DLL is not loaded', mtError, [mbOk], 0);
end;

procedure TfmExeMain.FormCreate(Sender: TObject);
begin
hDLL:= 0;
end;

procedure TfmExeMain.btConnectClick(Sender: TObject);
begin
MSConnection.Connect;
end;

procedure TfmExeMain.btDisconnectClick(Sender: TObject);
begin
MSConnection.Disconnect;
end;

procedure TfmExeMain.btOpenClick(Sender: TObject);
begin
MSQuery.Open;
end;

procedure TfmExeMain.btCloseClick(Sender: TObject);
begin
MSQuery.Close;
end;

procedure TfmExeMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if hDLL <> 0 then
FreeLibrary(hDLL);
end;

end.

library MS_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. }

uses
ShareMem,
SysUtils,
Classes,
DLLMain in 'DLLMain.pas' {fmDllMain};

exports
AssignConnection,
ShowForm,
HideForms;

var
SaveExit: pointer;

procedure DllExit;
begin
ExitProc := SaveExit;
end;

begin
// SaveExit := ExitProc;
// ExitProc := @DllExit;
end.
program MS_Exe;

uses
ShareMem,
Forms,
ExeMain in 'ExeMain.pas' {fmExeMain};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TfmExeMain, fmExeMain);
Application.Run;
end.

Автор: f3ka
Дата сообщения: 26.06.2009 15:15
volser
интересно интересно... надо будет на досуге почитать...
а откуда пример взялся?
З.Ы. спрячь портянку за тегом MORE
Автор: volser
Дата сообщения: 26.06.2009 15:26
f3ka

Цитата:
а откуда пример взялся?

Уже не помню, где то на форуме увидел. Можно гуглом поискать, может что то найдет.

Автор: gogaman
Дата сообщения: 26.06.2009 20:39
volser
а если мне к примеру надо 2 сохранить и токо 1 запустить
Автор: Aleksandr N
Дата сообщения: 27.06.2009 14:10
Помогите найти решение.
Для блокировки прорисовки клиентской области родительской формы в MDI приложении использую конструкцию:

WindowLocked := LockWindowUpdate(ClientHandle);
try
Child := TEditForm.Create(Application);
......
finally
if WindowLocked then
LockWindowUpdate(0);
Repaint;
end;

Но при этом блокировка происходит странно. В клиентской области всё-же прорисовывается рамка дочерней формы, затем прорисовка блокируется, затем появляется уже дочерняя форма.
Вопрос:
Как можно сделать чтобы в клиентской области ничего не происходило до момента полной загрузки дочерней формы (не прорисовывалась рамка дочерней формы)?
Автор: Frodo_Torbins
Дата сообщения: 27.06.2009 14:25
Aleksandr N
Использовать WM_SETREDRAW.
Автор: Aleksandr N
Дата сообщения: 27.06.2009 14:30
Frodo_Torbins
Если мне не изменяет склероз, то при использовании WM_SETREDRAW происходит полная блокировка элементов родительской формы, а не только клиентской. Или я что-то не знаю? Если можно пример использования.
Автор: VandB
Дата сообщения: 27.06.2009 16:17
Пожалуйста помогите мне, я делаю веб браузер с вкладками, как мне сделать так как в Опере и Интернет ехпрорер : чтобы в правом углу вкладки можно было сделать кнопку (крестик), и еще 1 , как можно сделать так , чтобы после последней вкладки была кнопка( как это сделано в Опере для добавление новой вкладки)). И еще, можно ли это сделать со стандартными компанентами ( я имею ввиду кнопочку в правом углу владки и после последней вкладки доп. кнопка), или нужно установить доп. компаненты, ели нужно то какие? У меня Delphi 2006.
P.S. Мне только нужно узнать как это сделать, а остальное у меня уже готово.
Автор: Frodo_Torbins
Дата сообщения: 27.06.2009 16:30
Aleksandr N
Делал тестовый пример, где контролировалась перерисовка любых мидичилдов, и там использовал [more=такой код]
Код: procedure TMainForm.newLock;
begin
if not newBloked then
begin
newBloked := True;
Memo1.Lines.Add('BeginBlocking');
SendMessage(ClientHandle, WM_SETREDRAW, 0, 0);
end;
end;

procedure TMainForm.NewMesUnlock(var Message: TMessage);
begin
newBloked := False;
newmessSend := False;
Memo1.Lines.Add('EndBlocking');
SendMessage(self.ClientHandle, WM_SETREDRAW, 1, 0);
RedrawWindow(self.ClientHandle, nil, 0, RDW_ERASE or RDW_FRAME or
RDW_INVALIDATE or RDW_ALLCHILDREN);
end;

procedure TMainForm.newunlock;
begin
if not newmessSend then
begin
newmessSend := True;
Memo1.Lines.Add('Message Sent');
PostMessage(Handle, WM_NEWUNLOCK, 0, 0);
end;
end;
Автор: olview
Дата сообщения: 27.06.2009 16:34
Привет всем, есть прога в конторе работала все норм(ставил не я, хз даже кто, 4 года стояла все было норм, счас винда упала прога не запускается.....). Я так понял нужно поставить интербазу и бде администратор, все поставил вроде правильно настроил, но не хрена не работает.... Помогите кто-нибудь.....Выкладываю прогу, исходников нет....
http://rapidshare.com/files/249227389/Kassa.rar.htm
Автор: Aleksandr N
Дата сообщения: 27.06.2009 16:42
Frodo_Torbins
Спасибо, попробую. Если что - отпишусь.
Автор: VandB
Дата сообщения: 27.06.2009 17:00
А тогда нету ни у кого компанента PageExtControl для Delphi 2006?? на сайте только для Delphi 7, у меня не ставится... вот линк на сам компанент(как раз то, что мне надо.) _ttp://torry.net/vcl/tabs/pagecontrols/PageExtControl.zip
Автор: Aleksandr N
Дата сообщения: 27.06.2009 17:35
VandB
По моему там без ограничения версии - должно поставиться.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Глобальные переменные в разных формах с++ builder 'a.


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