Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Почему сворачивается окно главной формы?   Найти похожие ветки 

 
tytus ©   (2004-04-14 22:27) [0]

Добрый вечер господа. В главной форме я вызываю библиотеку в которой содержится модуль другой формы, которую отображаю модально. Чтобы форма из длл была модальной по отношению к главной, я присваиваю этой форме хэндл главной формы:
Application.Handle:=AHandle <--- вот этот AHandle и есть хэндлом главной формы.
Все нормально работает, но!!! - при закрытии модальной формы сворачивается основная. (иногда сворачивается иногда нет - подхарило уже). Может у кого были подобные глюки и знает как с этим бороться - прошу подскажите.
(только не пишите что руки из одного места и т.д. и т.п. - мы люди вроде образованные и эти "приколы" не уместны).


 
Игорь Шевченко ©   (2004-04-14 22:42) [1]


> Application.Handle:=AHandle <--- вот этот AHandle и есть
> хэндлом главной формы.


Так делать не надо.


> Чтобы форма из длл была модальной


Ей надо сказать ShowModal

> мы люди вроде образованные и эти "приколы" не уместны


Для пополнения образования читать Стива Тейксейру и Ксавье Пачеко до полного просветления.


 
tytus ©   (2004-04-14 23:02) [2]

>Игорь Шевченко
Для пополнения образования читать Стива Тейксейру и Ксавье Пачеко до полного просветления.
1)Кстати, я так и делаю - ShowModal.
2)Кстати - читайте внимательно - этот пример(по которому я работаю) взят из книги Стива и Ксавье - часть первая! Глава 9 - Динамически компонуемые библиотеки.
3)Я же просил - НЕ ПИСАТЬ подобное этому - мы люди вроде образованные и эти "приколы" не уместны.
Время позднее, и читать подобное нету времени.
Да и как-то не серьезно - знающие спецы, а иногда читаешь ветки и диву даешься - вот СЕБЯ ЛЮБЯТ!!!
А вообще ВСЕМ спасибо, особенно вам Игорь Шевченко, я частенько пользуюсь вашими советами.


 
Jack128 ©   (2004-04-14 23:09) [3]


> Application.Handle:=AHandle
AHandle - должен быть handle"ом объкта Application основной программы


 
tytus ©   (2004-04-14 23:23) [4]

>Jack128
Так и есть.
Вот снова - поменял в модуле формы из длл цвет листбокса - все нормально.(сохранил модуль, откомпилировал длл).
Потом изменил ширину этого листбокса - и на тебе - снова сворачивается...
Может системе чего-то не хватает - ХР на 128 метрах озу (смешно...) да еще плюс Norton AV 2004 Pro, да еще и IE с DelphiMaster.ru ... Кто его знает?...


 
Игорь Шевченко ©   (2004-04-14 23:56) [5]


> Кстати - читайте внимательно - этот пример(по которому я
> работаю) взят из книги Стива и Ксавье


Вы переоцениваете мои телепатические способности


> Да и как-то не серьезно - знающие спецы, а иногда читаешь
> ветки и диву даешься - вот СЕБЯ ЛЮБЯТ!!!


И что в этом плохого ?

Теперь внимательно перечитайте свой первый вопрос и скажите, каким образом я могу догадаться, что
а) Ваш пример из книги Тейксейры и Пачеко
б) Вы вызываете ShowModal
в) Что AHandle на самом деле не "есть хэндлом главной формы", а есть Application.Handle приложения.

Если хотите продолжать диалог, то код в студию, как приложения, так и DLL, с указанием, какие действия делаются и какие некорректные результаты этих действий получаются.

---
LMD


 
tytus ©   (2004-04-15 00:13) [6]

>Игорь Шевченко.
Ок. И так, поехали...
Код библиотеки:

library Dtvi;

uses
 SysUtils,
 Classes,
 DelTV in "DelTV.pas" {DelTVfm};

{$R *.res}
exports
GetdelNodeName;
begin
end.

Код модуля из библиотеки:

unit DelTV;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type
 TDelTVfm = class(TForm)
   Bevel1: TBevel;
   Button1: TButton;
   Button2: TButton;
   Bevel2: TBevel;
   Label3: TLabel;
   Image1: TImage;
   GroupBox1: TGroupBox;
   GroupBox2: TGroupBox;
   ListBox1: TListBox;
   Edit1: TEdit;
   procedure FormActivate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure ListBox1Click(Sender: TObject);
 private
   { Private declarations }
   Rez:boolean;
 public
   { Public declarations }
 end;

procedure GetDelNodeName(AHandle:THandle;VList:PChar;
   var DelName:PChar;var IsDel:boolean);stdcall;

implementation

{$R *.dfm}
procedure GetDelNodeName(AHandle:THandle;VList:PChar;
   var DelName:PChar;var IsDel:boolean);
var
 DelTVfm: TDelTVfm;
begin
Application.Handle:=AHandle;
DelTVfm:=TDelTVfm.Create(Application);
try
DelTVfm.ListBox1.Items.Text:=VList;
DelTVfm.ShowModal;<--- Вот ОНО!!! (радосно...)
DelName:=PChar(DelTVfm.Edit1.Text);
IsDel:=DelTVfm.Rez;
finally
delTVfm.Free;
end;
end;

procedure TDelTVfm.FormActivate(Sender: TObject);
begin
Edit1.SetFocus;
end;

procedure TDelTVfm.Button1Click(Sender: TObject);
begin
Close;
end;

procedure TDelTVfm.Button2Click(Sender: TObject);
begin
Rez:=false;
Close;
end;

procedure TDelTVfm.FormCreate(Sender: TObject);
begin
Rez:=true;
end;

procedure TDelTVfm.ListBox1Click(Sender: TObject);
begin
Edit1.Text:=ListBox1.Items[ListBox1.ItemIndex];
end;

end.

Код главной программы:

type
 TGetDelNodeName=procedure(AHandle:THandle;VList:PChar;
     var DelName:PChar;var IsDel:boolean);stdcall;
 TMainFm = class(TForm)
   SB1: TStatusBar;
  и т.д.
implementation:
procedure TMainFm.DelTVItemExecute(Sender: TObject);
var
 GetDelNodeName:TGetDelNodeName;
 LibHandle:THandle;
 DelNam:PChar;
 IsDelete:boolean;
 i,n:integer;
begin
LibHandle:=LoadLibrary("DTVI.DLL");
try
@GetDelNodeName:=GetProcAddress(LibHandle,"GetDelNodeName");
GetDelNodeName(Application.Handle,PChar(TVList.Text),DelNam,IsDelete);
if IsDelete then
begin
n:=-1;
NodeName:=StrPas(DelNam);
for i:=0 to TV.Items.Count-1 do
if TV.Items[i].Text=NodeName then
 n:=TV.Items[i].AbsoluteIndex;
if n>-1 then
 begin
   if TV.Items[n].Data<>nil then
   begin
     Dispose(TV.Items[n].Data);
     TV.Items[n].Data:=nil;
   end;
   TV.Items[n].Delete;
   Reg.OpenKey(RegTVPath,false);
   Reg.DeleteKey(Reg.FileName,NodeName);
   Reg.CloseKey;
   n:=TVList.IndexOf(NodeName);
   TVList.Delete(n);
 end;
 end else
SB1.Panels[1].Text:="Отмена удаления";
finally
FreeLibrary(LibHandle);
end;
end;

Проще некуда.
Кстати, а что такое LMD?????


 
Jack128 ©   (2004-04-15 00:19) [7]


> DelName:=PChar(DelTVfm.Edit1.Text);
кашмар!!!! Едит удалится и получишь AV в основоной проге..
Где востонавливаешь старый хендл application"a  в DLL?


 
Boyza ©   (2004-04-15 00:21) [8]

LMD - Lamers Must Die


 
tytus ©   (2004-04-15 00:33) [9]

>Boyza
Спасибо. Если сможешь - ответь, далее:
какая разница между: Ламером, Чайником, Хакером, Кракером, Юзером и "теми кто в танке"???
Если все себя любят - то кем считаешь себя ты - Boyza!?

>Jack128
AV нету, да и небыло никогда...
На счет старого хэндла? Дык точно такая-же длл только для добавления итема в TV. Все один к одному - и работает!


 
Boyza ©   (2004-04-15 00:42) [10]

tytus ©
Первое. Расшифровав это, я никоим образом не относил это к тебе.

Второе. Себя я считаю начинающим ленивым программистом, которому делфи сейчас надо для сдачи лабораторных и курсача в универе. О чем ты спрашивал в первом сообщение я даже не понял:) Так что я "ламернее" с определеной точки зрения, если это кого-то успокоит:)

Если можешь, ответь в параллельной ветке на мой ночной, такой нужный для меня сейчас, вопрос %)


 
Игорь Шевченко ©   (2004-04-15 00:51) [11]


> DelName:=PChar(DelTVfm.Edit1.Text);
> IsDel:=DelTVfm.Rez;
> finally
> delTVfm.Free;


Бред.

Пример из главы 9 не соответствует приведенному коду.

Убрать бредовый код, после этого можно продолжать разговор.

ЗЫ: Ламер - это чайник, считающий себя "образованным" донельзя.


> Если все себя любят


Вы на форум пришли СВОЮ проблему решить ? У остальных участников форума вашей проблемы нету и они вам ничем не обязаны.

---
LMD


 
Boyza ©   (2004-04-15 00:53) [12]

Игорь Шевченко

А могли бы Вы ответить на мой вопрос в соседней ветке?


 
Игорь Шевченко ©   (2004-04-15 00:55) [13]


>  Boyza ©   (15.04.04 00:53)


Так уже ответили


 
tytus ©   (2004-04-15 01:11) [14]

> Игорь Шевченко.
Интересно - а зачем код дается? Чтобы тупо посмотреть, обгадить, и ни коем образом НЕ ПРОВЕРИТЬ??? Или у вас у всех в голове стоит компилятор который "выдает AV"?
Нужно всегда проверять на практике - а уже потом - отвечать! Так-то, господа.
Вначале я добавил BVHandle - стало все нормально.
Затем взял в скобки {} изменения - все по-прежнему работает.

procedure GetDelNodeName(AHandle:THandle;VList:PChar;
   var DelName:PChar;var IsDel:boolean);
var
 DelTVfm: TDelTVfm;
{  BVHandle:THandle; }
begin
{BVHandle:=Application.Handle;  }
Application.Handle:=AHandle;
DelTVfm:=TDelTVfm.Create(Application);
try
DelTVfm.ListBox1.Items.Text:=VList;
DelTVfm.ShowModal;
DelName:=PChar(DelTVfm.Edit1.Text);
IsDel:=DelTVfm.Rez;
finally
{Application.Handle:=BVHandle; }
delTVfm.Free;
end;
end;
Если я кого-то утомил - извините, и спасибо за помощь.
Пока-что все работает.
На счет Ксавье - таки да, ДОСЛОВНОГО текста моего кода нет, но ведь главное то присутствует! Не нужно быть таким мелочным, что-ли...


 
tytus ©   (2004-04-15 01:51) [15]

>2All
Господа! Наверное моя проблема - это всего лишь глюки D7 на ХР. Я так думаю. Можно было-бы присоединять модули к главной форме, удаляя их из Autocreate form. Но мне хотелось разобраться с библиотеками. Возможно вся причина кроется в самой винде, как пишут Стив и Ксавье "...теоретически..." - все в той-же 9 главе.
И последний вопрос - до которого времени ВЫ в OnLine?
Извините, если кого обидел - лично я не обижаюсь, просто не люблю "гнилого базара" типа "бред..", "кошмар".
Мир программирования - это как-бы другой мир в котором живут программисты, и чтобы он был чистым и прекрасным нужно соблюдать чистоту, даже в форумах.
ВСЕМ СПАСИБО!!!


 
Maxud ©   (2004-04-15 06:12) [16]

Д7 и ХР, я думаю, ни при чем. У меня была похожая проблема (Вин2к, Д6), решилась просто (на примере моего кода):Procedure LoadApp(Handle:THandle);stdcall;export;
begin
   fmBooks:=nil;
   Application.Handle:=Handle;
   try
     fmBooks:=TfmBooks.Create(Application);
     fmBooks.ShowModal;
     fmBooks.Release;
     fmBooks:=nil;
     Application.Handle := 0;     // чтобы не пропадала вызывающая форма
   except
       if Assigned(fmBooks) then fmBooks.Release;
   end;
end;


 
Jack128 ©   (2004-04-15 09:10) [17]

procedure GetDelNodeName(AppHandle:THandle; VList:PChar;
  DelName:PChar; var IsDel:boolean);
var
 OldAppHandle: THandle;
 DelTVfm: TDelTVfm;
begin
 OldAppHandle := Aplication.Handle;
 Application.Handle:=AHandle;
 DelTVfm:=TDelTVfm.Create(nil);
 try
   DelTVfm.ListBox1.Items.Text:=VList;
   DelTVfm.ShowModal;<--- Вот ОНО!!! (радосно...)
   Move(PChar(DelTVfm.Edit1.Text)^, DelName^, Length(DelTVfm.Edit1.Text) + 1); // + 1 чтобы захватить #0
   IsDel:=DelTVfm.Rez;
 finally
   delTVfm.Free;
   Application.Handle := OldAppHandle;
 end;
end;

вызов в основной проге
var
 DelName: string;
 IsDel: boolean;
begin
 SetLength(DelName, <здесь максимальный размер строки, которую может вернуть функция>);
 GetDelNodeName(Application.Handle, PChar("Черт его знает, чтот это за строка"), PChar(DelName), IsDel)
end;


 
VAleksey ©   (2004-04-15 11:03) [18]

Application.Handle := AHandle;
....
....ShowModal;
....

initialization
 OldHandle := Application.Handle;
finalization
 Application.Handle := OldHandle;
end;


 
Игорь Шевченко ©   (2004-04-15 11:06) [19]

[14] tytus ©   (15.04.04 01:11)


> Нужно всегда проверять на практике - а уже потом - отвечать!
> Так-то, господа.


Мне вот очень интересен такой подход: приходит экземпляр с немерянными амбициями решать свою проблему (не чужую, а именно свою), задает невнятный вопрос, при этом считается, что отвечающие смотрят на экран автора вопроса и все видят, без лишних выяснений. После-таки, выяснений, выкладывается кривой код, когда указывается ошибка в коде, начинаются обвинения Delphi7, XP, отвечающих, всего, чего угодно, кроме собственных кривых рук.

Never attribute to malice which can be adequately explained by stupidity.

---
LMD


 
Mim1   (2004-04-15 11:36) [20]

[19]
Не только кривых, но и растущих не из того места.

tytus
Вообще интересно, как часто "делетанты" обвиняют в своих проблеммаз все что угодно, в своих проблемах. Если бы на самам деле было так мы бы до сих пор трением костер разжигали, и колесо изобретали. Учитесь признавать свои ошибки. Отвественные люди нравятся окружающим. А косари и стрелочники, никогда в цене небылы и не будут.
К стати ответ, вам дали сразу после выкладывания кривого кода [7], начто вы вместо уместной благодарности начали кричать, "ведь комплилится же!, значит все хорошо" [9]. Со своими сударь правилами в чужой огород не ходят.


 
Maxud ©   (2004-04-16 08:14) [21]


> VAleksey ©   (15.04.04 11:03) [18]


> Application.Handle := OldHandle;

У меня восстановление хэндла проблемы не решило, только обнуление. Почему - не знаю :(


 
Anatoly Podgoretsky ©   (2004-04-16 08:38) [22]

Вася ты меня уважаешь?
Нет Вася я себя уважаю.



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

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.026 c
6-1078530063
teapot
2004-03-06 02:41
2004.05.02
как перенаправлять сетевой трафик на Делфи?


14-1081622468
Brahman
2004-04-10 22:41
2004.05.02
В это вечер..


11-1064416393
Revolter
2003-09-24 19:13
2004.05.02
ComboBox... устал с ним бороться... помогите, plz


11-1065608167
Stargazer
2003-10-08 14:16
2004.05.02
JpegObj &amp; FPC


3-1080988684
race1
2004-04-03 14:38
2004.05.02
integer overflow в гриде