Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Вниз

VCL и KOL   Найти похожие ветки 

 
AlexM ©   (2007-01-19 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   (2007-01-19 14:31) [1]

Какая ошибка? Или отладчик ничего не говорит?


 
AlexM ©   (2007-01-20 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   (2007-01-20 10:40) [3]

А  если отлаживать со стороны dll, подключая основное приложение как host?


 
AlexM ©   (2007-01-21 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 ©   (2007-01-21 08:50) [5]

Но и ведут себя основное и модальное окна неправильно,
даже если вызывать модальное ShowModalEx.

Пример:
запускаю VCLProject, открываю модальное окно.
Запускаю другую программу.
Если переключиться на VCLProject Alt+Tab появляется одно модальное окно,
если кликнуть значок на панели задач появляется одно основное окно.
А когда закрываю модальное,основное прячется за другими окнами, если они есть.


 
Fregl ©   (2007-04-06 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 ©   (2007-04-10 00:47) [7]

Если выполнять приложение через отладчик Дельфи, то после возникновения ошибки загляните в меню (щас не помню хоть убейте название и расположение). Кароче там есть пункт для поиска ошибки по адресу. Введите в окне адрес, который вам сообщается, и вас "ткнут носом" в строку кода, на которой возникла ошибка.


 
Barloggg   (2007-04-10 08:51) [8]

... которая иногда бывает в недрах самой винды...

такое случается при работе с динамическими массивами и ошибками с их длиной.


 
Fregl ©   (2007-04-10 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   (2007-04-12 20:00) [10]

Контролы уничтожаются автоматом вместе с родиетелем. Пример смотрели? Разве там так написано?


 
Dmitry___   (2007-04-27 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___   (2007-04-27 12:45) [12]


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

А рассказать?


 
Dmitry___   (2007-04-27 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___   (2007-04-29 21:12) [14]

Короче, не знаю, что и делать... Чётвёртый день пытаюсь найти ошибку, но нет, не нахожу. То всё работает, то программа вылетает.

Владимир, на вас надежда, помогите! Хелп! Или моя затея пойдёт прахом ;(


 
kol tasarım   (2007-07-23 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=   (2007-07-24 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   (2007-08-08 20:29) [17]

Удалено модератором


 
Dawn-qh   (2007-11-27 04:26) [18]

Удалено модератором


 
Dawn-qh   (2007-11-27 04:26) [19]

Удалено модератором


 
имя   (2008-01-18 00:18) [20]

Удалено модератором


 
имя   (2008-02-08 23:22) [21]

Удалено модератором


 
имя   (2008-02-09 07:06) [22]

Удалено модератором


 
имя   (2008-05-04 00:35) [23]

Удалено модератором



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.006 c
15-1255365742
Игорь Шевченко
2009-10-12 20:42
2009.12.13
Ставлю Windows 95. Pan european edition. С дискет :)


10-1121666059
YuriS
2005-07-18 09:54
2009.12.13
Borland Socket Server


15-1255816936
POOP
2009-10-18 02:02
2009.12.13
Помогите с Latex


2-1256728258
kirat
2009-10-28 14:10
2009.12.13
cp866


2-1256109863
RWolf
2009-10-21 11:24
2009.12.13
AnsiExtractQuotedStr(PChar(str), ...)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский