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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.048 c
14-1081793805
ЧупаЧупс
2004-04-12 22:16
2004.05.02
Аж страшно становится -- 11 число - число неудач?


1-1081485773
EvgeniyR
2004-04-09 08:42
2004.05.02
ToolBar в MDI


3-1080814223
wer
2004-04-01 14:10
2004.05.02
поиск


7-1079334850
comwad
2004-03-15 10:14
2004.05.02
Как послать сообщение неактивному приложению ?


1-1081967236
tytus
2004-04-14 22:27
2004.05.02
Почему сворачивается окно главной формы?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский