• AlexM © (19.01.07 07:45) [0]
    Почему когда в
    demomodalvcl2koldll.7z
    вместо

    procedure CallKOLFormModal; external 'KOLDll.dll' name 'CallKOLFormModal';

    {$R *.DFM}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
     CallKOLFormModal;
    end;

    написать

    //procedure CallKOLFormModal; external 'KOLDll.dll' name 'CallKOLFormModal';
    {$R *.DFM}

    procedure TForm1.Button1Click(Sender: TObject);
    type
     PCallKOLFormModal=procedure;
    var
     hDll:THandle;
     CallKOLFormModal:PCallKOLFormModal;
    begin
    if(FileExists('KOLDLL.dll' ))then
     begin
       hDll:=LoadLibrary('KOLDLL.dll');
       @CallKOLFormModal:=GetProcAddress(hDll,'CallKOLFormModal');
       CallKOLFormModal;
       freeLibrary(hDll);
     end;
    end;

    при выходе вылазит ошибка?
    Как это исправить?
  • Vladimir Kladov (19.01.07 14:31) [1]
    Какая ошибка? Или отладчик ничего не говорит?
  • AlexM © (20.01.07 07:44) [2]
    Project VCLProject1.exe raised exception class EACcessViolation
    with message 'Access violation at address 003C20C0. Read of address 003C20C0.'

    Если freeLibrary(hDll) не делать, то ошибки нет.
  • Vladimir Kladov (20.01.07 10:40) [3]
    А  если отлаживать со стороны dll, подключая основное приложение как host?
  • AlexM © (21.01.07 08:08) [4]
    Ошибка появляется с любой стороны.

    Нашел одно решение,если в dll добавить:

    function TKOLForm1.KOLForm1Message(var Msg: tagMSG;
     var Rslt: Integer): Boolean;
    begin
     Result:=false;
     if Msg.message=WM_CLOSE then
     begin
       Applet.Close;
     end;
    end;

    то ошибка исчезает.
  • AlexM © (21.01.07 08:50) [5]
    Но и ведут себя основное и модальное окна неправильно,
    даже если вызывать модальное ShowModalEx.

    Пример:
    запускаю VCLProject, открываю модальное окно.
    Запускаю другую программу.
    Если переключиться на VCLProject Alt+Tab появляется одно модальное окно,
    если кликнуть значок на панели задач появляется одно основное окно.
    А когда закрываю модальное,основное прячется за другими окнами, если они есть.
  • Fregl © (06.04.07 14:04) [6]
    У меня та же проблема.
    Притом, метод от AlexM на счет WM_CLOSE не помогает.
    Вот часть кода

    //program settings;
    library settings;

    uses
     KOL, Windows, Messages,
     advTypes in '..\..\FlexTest\advTypes.pas';

    type

       PForm1 = ^TForm1;

       TForm1 = object(TObj)
         Form1             : PControl;
         ButtonOk          : PControl;
         ButtonCl          : PControl;
         Panel             : PControl;
         Tabs              : PControl;
         ConPortLabel      : PControl;
         ConSpeedLabel     : PControl;
         cboxPort          : PControl;
         cboxSpeed         : PControl;
         lblLogMode        : PControl;
         cboxLogMode       : PControl;
         lblCacheRecords   : PControl;
         lblLastEvents     : PControl;
         cboxCacheRecords  : PControl;
         cboxLastEvents    : PControl;
         chbxAutoLoad      : PControl;
         chbxArchTrace     : PControl;
         editDBHost        : PControl;
         editDBPort        : PControl;
         editDBName        : PControl;
         editDBUser        : PControl;
         editDBPassword    : PControl;
         lblDBHost         : PControl;
         lblDBPort         : PControl;
         lblDBName         : PControl;
         lblDBUser         : PControl;
         lblDBPassword     : PControl;
         lblGuardColor     : PControl;
         lblAlarmColor     : PControl;
         lblSuspendColor   : PControl;
         btnGuardColor     : PControl;
         btnAlarmColor     : PControl;
         btnSuspendColor   : PControl;
         grpActiveList     : PControl;
         grpDisabledList   : PControl;
         btnActiveLColor   : PControl;
         btnActiveLFont    : PControl;
         btnDisabledLColor : PControl;
         btnDisabledLFont  : PControl;
         cboxLogFileMode   : PControl;
         cboxLogFileBuff   : PControl;
         lblLogFileMode    : PControl;
         lblLogFileBuff    : PControl;
         ColorDialog       : PColorDialog;
       procedure InitControlsWithSettings;
       procedure ApplySettings;
       function Form1Message(var Msg: TMSG; var Rslt: Integer): Boolean;
       end;

    {
    лишнее вырезано
    }


     var
       MainForm1 : PForm1;
       Applet    : PControl;
       _settings : PSettings;
       MustChange: Boolean;

    procedure OnCancelBtnClick(Stub, Sender: PObj);
    begin
    //  MainForm1.ApplySettings;
     MustChange:=True;
     MainForm1.Form1.Close;
    end;

    procedure OnOkBtnClick(Stub, Sender: PObj);
    begin
     MustChange:=False;
     MainForm1.Form1.Close;
    end;

    function  NewForm1(Parent: PControl):PForm1;
    var i:byte;
       s:String;
    begin
     New(Result,Create);
     with Result^ do
       begin
       Form1:=NewForm(Parent,'Íàñòðîéêè'). SetSize(500,350).CenterOnParent;
       Form1.Add2AutoFree(Parent);
       Form1.Font.FontName:='Arial';
       Form1.Font.FontHeight:=14;
       Form1.Font.FontStyle:=[];
       ButtonOk.OnClick:=TOnEvent(MakeMethod(nil,@OnOkBtnClick));
       ButtonCl.OnClick:=TOnEvent(MakeMethod(nil,@OnCancelBtnClick));
       btnGuardColor.OnClick:=TOnEvent(MakeMethod(nil,@OnGuardColorBtnClick));
       btnAlarmColor.OnClick:=TOnEvent(MakeMethod(nil,@OnAlarmColorBtnClick));
       Form1.OnMessage:=Form1Message; {без него тоже самое}
       end;
    end;

    function ShowSettingsForm(ptrSettings: PSettings):boolean;stdcall;export;
    begin
     Result:=False;
     _Settings:=ptrSettings;
     Applet:=NewForm(nil,'Íàñòðîéêè');
     Applet.Visible:=false;
     MainForm1:=NewForm1(Applet);
     Run(Applet);
    //  MainForm1.InitControlsWithSettings;
     MainForm1.Form1.ShowModal;
     MainForm1.Form1.Free;
     MainForm1.Form1:=nil;
     Result:=MustChange;
    end;

    exports
     ShowSettingsForm name 'ShowSettingsForm';

    function TForm1.Form1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
    begin
    Result:=false;
    if Msg.message=WM_CLOSE then
    begin
      Applet.Close;
    end;
    end;

    begin

    end.



    При вызове из VCL - форма отлично показывается, все работает, закрывается
    но при закрытии самого VCL приложения выскакиевает ошибка по адресу ...

    Где причина?
  • Dimaxx © (10.04.07 00:47) [7]
    Если выполнять приложение через отладчик Дельфи, то после возникновения ошибки загляните в меню (щас не помню хоть убейте название и расположение). Кароче там есть пункт для поиска ошибки по адресу. Введите в окне адрес, который вам сообщается, и вас "ткнут носом" в строку кода, на которой возникла ошибка.
  • Barloggg (10.04.07 08:51) [8]
    ... которая иногда бывает в недрах самой винды...

    такое случается при работе с динамическими массивами и ошибками с их длиной.
  • Fregl © (10.04.07 13:45) [9]
    хм, разобрался вроде... заработало
    при вызове, форма нормально отображается, кнопочки реагируют на события и тому подобное, но теперь возникла проблема - при освобождении библиотеки, память которая занималась под контролы не освобождается (около 30 Кб), и при последующих вызовах библиотеки память засоряется на ~30 Кб...

    здается мне что проблема в осовождении контролов

    посоветуйте как правильно их освободить (уничтожить)
    если объект формы выглядит так

    TForm1 = object(TObj)
         Form1             : PControl;
         ButtonOk          : PControl;
         ButtonCl          : PControl;
         Panel             : PControl;
    ....
         lblLogFileMode    : PControl;
         lblLogFileBuff    : PControl;
       procedure InitControlsWithSettings;
       procedure ApplySettings;
       end;



    процедура создания формы

    function  NewForm1(Parent: PControl):PForm1;
    var i:byte;
       s:String;
    begin
     New(Result,Create);
     with Result^ do
       begin
       Form1:=NewForm(Parent,'Íàñòðîéêè'). SetSize(500,350).CenterOnParent;
       Add2AutoFree(Form1);
       Form1.Font.FontName:='Arial';
       Form1.Font.FontHeight:=14;
       Form1.Font.FontStyle:=[];
       Panel:=NewPanel(Form1,esLowered).SetAlign(caBottom);
       Panel.Height:=40;
       ButtonOk:=NewButton(Panel,'Îê').SetSize(60,25).SetAlign(caRight);
       ButtonCl:=NewButton(Panel,'Cancel').SetSize(60,25).SetAlign(caRight);
    ...
    end;



    собственно процедура экспорта вызова формы из KOL DLL


    function ShowSettingsForm(ptrSettings: PSettings):boolean;stdcall;
    begin
     Result:=False;
     _Settings:=ptrSettings;
     if not Assigned(MainForm1) then MainForm1:=NewForm1(nil);
     Run(MainForm1.Form1);
     MainForm1:=Nil;
     Result:=MustChange;
    end;

    exports
     ShowSettingsForm name 'ShowSettingsForm';



    Где должны уничтожаться все контролы расположенные на форме?
    или они уничтожаются автоматически? или при уничтожении обьекта MainForm1?
    если дописывать MainForm1.Free то вылетает ошибка (скорее всего изза того что Form1 уже уничтожен при вызове Close)

    Вобщем как корректно осовободить всю память из под DLL?
  • Vladimir Kladov (12.04.07 20:00) [10]
    Контролы уничтожаются автоматом вместе с родиетелем. Пример смотрели? Разве там так написано?
  • Dmitry___ (27.04.07 12:40) [11]

    > при выходе вылазит ошибка?

    Сейчас я сам столкнулся с этим. И это первая проблема. Вторая в том, что в моей КОЛ программе есть два плагина, тоже на КОЛ, и когда я запускаю первый, всё работает (ну про то, что на выходе из хостового приложения вылазит AV, я не говорю). А когда я запускаю второй плагин, он вылетает со страшным треском. Причём не именно данный плагин, а любой ВТОРОЙ, т.е. после запуска первого что-то не так освобождается и т.п. Во время ShowModalEx форма не появляется, а появляются только некоторые контролы, без формы, а через  3-4 секунды плагин вылетает.

    Итак, вопросы. Первая проблема имеет место всегда, при любых обстоятельствах, плагинах и т.д. Как решить первую проблему? Вторая проблема возникает, когда на моей dll-форме имеется много контролов, среди них editbox, listview, pagecontrol, button, label. Как решить вторую проблему? Конкретного места с ошибкой я не нашёл. По адресу ошибки бывает то ShowModalEx формы, то какие-то строки в модуле КОЛ...

    Пояснение. В каждом моём плагине есть dpr, модуль с формой и модуль с тремя функциями. Вот та, которая выводит окно:

    function PluginRun(PlugInfo: PPluginInfo): integer; stdcall;
    var Form1: PForm1;
    begin
     Result := 0;
     ...
     Applet := NewApplet('');
     Applet.Hide;
     NewForm1(Form1, Applet);
     Form1.Form.ShowModalEx;
     Form1.Form.Free;
     Form1 := nil;
     Free_And_Nil(Applet);
     AppletTerminated := false;
    end;

    Специально вызов формы сделал в точности как в демо-примере.
  • Dmitry___ (27.04.07 12:45) [12]

    > хм, разобрался вроде... заработало

    А рассказать?
  • Dmitry___ (27.04.07 21:36) [13]
    Кажется, нашёл выход. В процедуре пишу:
    function PluginRun(PlugInfo: PPluginInfo): integer; stdcall;
    var Form1: PForm1;
    begin
     Result := 0;
     ...
     Applet := NewApplet('');
     Applet.Hide;
     NewForm1(Form1, Applet);
     Form1.Form.ShowModalEx;
     Form1.Form.Free;
     Form1 := nil;
     Free_And_Nil(Applet);
     AppletTerminated := false;
    end;


    При выходе, как известно, выпадает АВ. Я открыл модульформы_1.inc и в начале создающей окно процедуры вижу такой код:
    {$IFDEF KOLCLASSES}
     Result := PForm1.Create;
     {$ELSE OBJECTS}
     New( Result, Create );
     {$ENDIF KOL CLASSES/OBJECTS}
     Result.Form := NewForm( AParent, 'Form1' ).SetPosition( 476, 142 ){No MainMenu!}.SetClientSize( 564, 302 );
     Applet :=  Result.Form;
     Result.Form.Add2AutoFree( Result );



    Так вот, в предпоследней строке фигурирует апплет. Если закомментировать эту строчку, ошибка исчезает :)

    Правда, не знаю, насколько такой подход правильный.
  • Dmitry___ (29.04.07 21:12) [14]
    Короче, не знаю, что и делать... Чётвёртый день пытаюсь найти ошибку, но нет, не нахожу. То всё работает, то программа вылетает.

    Владимир, на вас надежда, помогите! Хелп! Или моя затея пойдёт прахом ;(
  • kol tasarım (23.07.07 21:19) [15]
    yaw arkadaşlar turkçe bilen yokmu
    neden kol projelerinde görsellik yok ben daha güzel formlar yapmak istiyorum lütfen yardımcı olun
  • =BuckLr= (24.07.07 00:14) [16]

    > yaw arkadaşlar turkçe bilen yokmu
    > neden kol projelerinde görsellik yok ben daha güzel formlar
    > yapmak istiyorum lütfen yardımcı olun

    Круто выгядит. И, главное, абсолютно всё понятно
  • Vilyamiw (08.08.07 20:29) [17]
    Удалено модератором
  • Dawn-qh (27.11.07 04:26) [18]
    Удалено модератором
  • Dawn-qh (27.11.07 04:26) [19]
    Удалено модератором
  • имя (18.01.08 00:18) [20]
    Удалено модератором
  • имя (08.02.08 23:22) [21]
    Удалено модератором
  • имя (09.02.08 07:06) [22]
    Удалено модератором
  • имя (04.05.08 00:35) [23]
    Удалено модератором
Есть новые Нет новых   [134431   +15][b:0][p:0.004]