Форум: "Основная";
Текущий архив: 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