Немодальные окна в Delphi
Доброго времени суток, уважаемые форумчане. Вопрос по поводу создания не модальных окон в делфи. В приложение при закрытии которого происходит сбой. Т.е. программа вызывает из dll библиотеки немодальное окно там пользователь совершает манипуляции и выходит из него. И если мы закрываем наше приложение, то выскакивает сообщение винды о сбое и в диспетчере задач остается в памяти процесс приложения и идет загруз ЦП на 50-60 процентов Уже все перепробовал даже не знаю что может быть.
Исходный код exe файла: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, ShockwaveFlashObjects_TLB, ExtCtrls, StdCtrls, ShellApi, AppEvnts, Menus, XPMan; function ADDBASE(Handle: THandle; connect: string):LongInt;stdcall; procedure FREEBASE(RefForm: LongInt);export;stdcall type TForm1 = class(TForm) PopupMenu1: TPopupMenu; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N4: TMenuItem; ShockwaveFlash1: TShockwaveFlash; ComboBox1: TComboBox; XPManifest1: TXPManifest; Label1: TLabel; ShockwaveFlash2: TShockwaveFlash; Button1: TButton; procedure FormCreate(Sender: TObject); procedure ShockwaveFlash1FSCommand(ASender: TObject; const command, args: WideString); function PoiskBD : TStringList; procedure ComboBox1Enter(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure ShockwaveFlash2FSCommand(ASender: TObject; const command, args: WideString); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; f : LongInt; function ADDBASE; external 'source1\add\bibl\Project1.dll'; procedure FREEBASE;external 'source1\add\bibl\Project1.dll'; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var R1 : HRGN; begin R1:= CreateRoundRectRgn(0, 0, Width-1, Height-1,40, 40); SetWindowRgn(Handle, R1, True); form1.Color:=$00999966; ShockwaveFlash1.Movie := ExtractFilePath(Application.ExeName) + '1.swf'; ShockwaveFlash2.Movie := ExtractFilePath(Application.ExeName) + 'source1\add\bibl\1.swf'; end; procedure TForm1.ShockwaveFlash1FSCommand(ASender: TObject; const command, args: WideString); begin if command = 'Click' then Form1.Close; end; function TForm1.PoiskBD: TStringList; var searchResult : TSearchRec; Find: String; Begin Find:=ExtractFileDir(Application.ExeName)+'\base\*.xml'; Result:=TStringList.Create; if FindFirst(Find, faAnyFile, searchResult) = 0 then begin repeat Result.Add(searchResult.Name); until FindNext(searchResult) <> 0; FindClose(searchResult); end; end; procedure TForm1.ComboBox1Enter(Sender: TObject); begin Form1.ComboBox1.Items:=Form1.PoiskBD; end; procedure TForm1.ComboBox1Change(Sender: TObject); begin ShockwaveFlash1.CallFunction('<invoke name="myFunction" returntype="xml"><arguments><string>base\'+Form1.ComboBox1.Text+'</string></arguments></invoke>'); end; procedure TForm1.ShockwaveFlash2FSCommand(ASender: TObject; const command, args: WideString); begin if command='exit' then Form1.Close; if command='add' then Begin end; if command='delete' then ShowMessage('Óäàëèòü'); if command='replace' then ShowMessage('Èçìåíèòü'); if command='new' then ShowMessage('Ñîçäàòü'); end; procedure TForm1.Button1Click(Sender: TObject); begin if f>0 then FREEBASE(f); f:=ADDBASE(Application.Handle, ExtractFilePath(Application.ExeName)+'base\'+Form1.ComboBox1.Text); end; end. Исходный код окна в dll библиотеки unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, jpeg, ExtCtrls, OleCtrls, ShockwaveFlashObjects_TLB,xmldom, XMLIntf, msxmldom, XMLDoc, AppEvnts; type TForm1 = class(TForm) Image1: TImage; Label1: TLabel; Edit1: TEdit; Label2: TLabel; Edit2: TEdit; Label3: TLabel; Edit3: TEdit; Button1: TButton; Label4: TLabel; Memo1: TMemo; OpenDialog1: TOpenDialog; ShockwaveFlash1: TShockwaveFlash; ApplicationEvents1: TApplicationEvents; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure ADD; procedure FormActivate(Sender: TObject); procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); procedure ShockwaveFlash1FSCommand(ASender: TObject; const command, args: WideString); private { Private declarations } procedure WMNCHitTest(var Message: TWMNCHitTest);message WM_NCHITTEST; public { Public declarations } end; var Form1: TForm1; Base : String; function ADDBASE(Handle: THandle; connect: string):LongInt;export;stdcall; procedure FREEBASE(RefForm : LongInt); export; stdcall; implementation {$R *.dfm} function ADDBASE(Handle: THandle; connect : string): LongInt; Begin Application.Handle:=Handle; Form1:=TForm1.Create(Application); Result:=LongInt(Form1); Base:=connect; Form1.Show; end; procedure FREEBASE(RefForm: LongInt); Begin if RefForm>0 then TForm1(RefForm).Release; end; procedure TForm1.FormCreate(Sender: TObject); var R1: HRgn; begin R1:= CreateRoundRectRgn(0, 0, Width-1, Height-1,40, 40); SetWindowRgn(Handle, R1, True); end; procedure TForm1.Add; var Xml: IXMLDocument; Summ : integer; begin xml:=TXMLDocument.Create(nil); xml.LoadFromFile(Base); xml.Active:=True; Summ:=xml.DocumentElement.ChildNodes.Count+1; with xml.ChildNodes['images'].AddChild('image') do Begin Attributes['id']:=IntToStr(Summ); ChildValues ['title'] := Edit1.Text; ChildValues['names']:=Edit2.Text; ChildValues['img']:=Edit3.Text; ChildValues['opis']:=Memo1.Text; end; xml.SaveToFile(Base); xml.Active:=False; Edit1.Text:=''; Edit2.Text:=''; Edit3.Text:=''; Memo1.Text:=''; end; procedure TForm1.Button1Click(Sender: TObject); begin if Form1.OpenDialog1.Execute=true then Edit3.Text:=Form1.OpenDialog1.FileName; end; procedure TForm1.FormActivate(Sender: TObject); begin Form1.ShockwaveFlash1.Movie:=ExtractFilePath(Application.ExeName)+'source1\add\bibl\1.swf'; end; procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest); begin inherited; Message.Result := HTCAPTION; end; procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); begin if msg.message = WM_RBUTTONDOWN then Handled := True; end; procedure TForm1.ShockwaveFlash1FSCommand(ASender: TObject; const command, args: WideString); begin if command='add' then ADD; if command='exit' then Form1.Close; end; end. И код самой библиотеки: library Project1; uses SysUtils, Classes, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} exports ADDBASE, FREEBASE; begin end. Помогите, в чем может быть проблема и как ее исправить. |
Вложений: 1
Прикладываю скрин ошибки которую выдает делфи
|
Greshnick, Судя по коду, валится на месте вызова виртуальной функции (скорее всего она вызывается в цикле, а объект ты удалил, значит нет указателя на виртуальную таблицу)
Попробуй: 1. добавь проверку или блокировку на все циклы в программе. При выходе подай сигнал, если есть активные циклы. 2. посмотри стек, возможно найдёшь в нём, что за цикл у тебя выполняется Полезно добавить (и пусть меня побьют) _глобальную_ булевую переменную, говорящую о завершении программы. Все циклы должны проверять, что она равна "не завершено". Можно выяснить, что за функция: 1. запускаешь проект 2. открываешь disassembly, находишь адрес ip=0x22331e, ставишь на него брейк-поинт 3. запускаешь отладку, делаешь что угодно (только не закрываешь). Рано или поздно на нём встаешь 4. Открываешь стек вызовов, смотришь, как туда пришло Скорее всего окажется какой-нибудь onPaint в флеше, но найдёшь к нему путь, разорвёшь внешний цикл, добавишь ему какой-нибудь stopFlash() |
Пытался сделать окно модальным, но...загвозка вот в чем я сделал кнопку во флеш портировал ее в делфи. Через нее вызываю dll. в коде видно. И дальше просто жесть когда вызвана dll идет загрузка проца 50-60 пока не закроешь окошко. Если вызываю это же окошко но со стандартной buttonки все норм. Такое ощущение, что первое окно становится не доступно, а анимация которая идет во флешке начинает кричать что мне нужен доступ и грузить проц. Ошибок при выходе нету.
Есть ли какое нить решение. "АткрИл я Америка!" узнал про GDIi+, но не умею пользоваться его функциями. Нашел в нете учебник ОСИПОВ графика в проектах делфи описание кричало что есть про GDI+ может по пробовать кнопочку так разработать. Уже очень хочется ВАУ эффекта в программе. |
Greshnick, поверьте — приложение должно 1) работать, 2) правильно и 3) эффективно. Оставьте «Wow!»-фефекты на долю MS, Apple и прочего «ширпотреба для избранных».
|
Iska, Да я бы давно написал эту программу и не парился. Без этой фигни я бы ее за 3 дня написал и все. Но хочется что бы препод увидел еще красивое оформление...Да и научится хочется самому делать красивые программы в стеле "прочего «ширпотреба для избранных»". Ну интересно мне...
|
Greshnick, можно вас попросить прикрепить проект в архиве?
Я в TurboDelphi посмотрю. ---- Цитата:
"Wow!" эффект - будет рассмотрен строго после того, как будет доказана работоспособность программы. Поупражняйтесь в составлении документации. Там все тоже не с первого раза :) |
lxa85, Я закончил колледж на техника программиста. Щас в универе. И это я пишу преподу не программирования, а с военной кафедры ему нужен журнал для хранения инфы о студентах и выставление оценок. А он в компах ноль и его понятие хороший прогер это когда круто выглядит. Потому что я компы не умею ремонтировать. Как ему надо "Взлом паролей, настройка сетей, ремонт железок итд" Мои интересы чисто прикладное программирование и веб программирование. Железо меня не интересует. А на его взкгля коли ты прогер должен уметь все. И никак ему не пояснишь что я тоже могу сказать коли ты военный то должен и танк водить и с парашюта прыгать и крейсером управлять.
http://files.mail.ru/7E467CA5F0D349A5935DCCF8802F56CA ссылка на архив. |
Greshnick, как веб-программист, ты должен понимать, что крутой интерфейс может жить отдельно от бизнес-логики. Логика на сервере, интерфейс на клиенте (насколько я понял это как раз в твоих интересах).
Поэтому: 1. следуй совету lxa85, делай прогу за 3 дня. 2. как заработает, приделай веб-интерфейс Ждём от тебя в среду пункт 1 ;) |
Вложений: 3
Greshnick, не волнуйся, мы и у военных, ежели чего, консультацию получить сумеем ;)
По секрету скажу. Все всегда хотят всего и сразу. В любой области есть узкоспециализированные специалисты, о наличии которых ты даже не подозреваешь до тех пор, пока не столкнешься лично. Отнюдь не в укор, все сталкиваются с этим. Допустим военный человек не разбирается в ПК. Ему и не надо. Ему нужен ты, который разбирается. Да, во всем. А если не разбирается, то должен дать аргументированный ответ, где следует искать решение (Не "почему ты не...", а "где искать решение"). Да, ему справедливо интересен "Взлом паролей, настройка сетей, ремонт железок итд" И ты, как прикладной программист широкого профиля (банально не успел получить узкую специальность) должен, хотя бы приблизительно представлять все процессы формирования, передачи и обработки информации, включая вопросы безопасности. (Что кстати говоря к web программированию имеет прямое отношение). Цитата:
Цитата:
---- К делу. Здесь люди, через руки которых прошло не одно и не два внедрения программных продуктов в корпоративную среду. Т.ч. прислушивайся и делай правильные выводы. Сейчас главная твоя ошибка - не правильно расставленные приоритеты. У военных все строго параллельно и перпендикулярно. Все должно быть четко прописано в инструкции по эксплуатации. Я сомневаюсь, что ты реально представляешься себе ПК, на которых будет выполняться твоя программа. Это очень старая, дважды и трижды списанная техника, которая, тем не менее, позволяет вести учет студентов. Флеш и wow эффект работникам абсолютно до лампады. Он мешает, тормозит работу, и будь уверен, через неделю тебя проклянут до 3его колена. Цветом повестки в военком :) Программа должна работать Надежно, Быстро и Просто. Будь она хоть вся в wow эффектах, но теряющая данные,то ну... хмм.. ну о чем тут говорить? ---- Программа. Хочется оторвать руки. Это дико. Не согласованность по глубине, цветовой гамме, градиентам. Огромные аляповатые кнопки (да, с "красивым" фокусом). "Выбрать" и "Выход" рядом никто не ставит. "Выберите базу" мы не с детьми общаемся, чтобы такие шрифты ставить. Основное окно пустое, как гладильная доска. Что в нем делать не ясно. Как осуществлять поиск и работу с базой данных студентов? Добавить: Это что за рюшки? В армии все должно быть функционально. Это не "развлекалка" для девочек, играющих в куклы. Форма плывёт ---- Код. По коду пока ничего сказать не могу. Не получается побороться с TShockwareFlash компонентами. Подключение dll библиотек, само по себе - есть хорошо. Комментариев нет. ---- Вывод. Пока это очень глубокая альфа, для своего собственного удовольствия. Ничего общего с рабочими программами она пока не имеет. Успехов! :) |
Вложений: 1
lxa85, программа пока еще не завершена. Поиск еще будет реализован. Равно как удаление и редактирование. На счет оформления наверное реально надо, как то переделать вид. На счет компов, это в его личное пользование. На его рабочем ноуте который не слабее моего. А на счет пустого окна прикладываю скрин как это выглядит когда база подключена. Спасибо за советы. Учту. И можно еще один вопрос. Есть ли какие нибудь хорошие книги про написание компонентов в среде делфи на GDI+. Потому что я так понял все эти вау эффекты грамотнее делать через GDI+ а, не через флеш иначе память жрет как удав. Даже в рабочем состоянии.
|
Greshnick, Вам рано думать о каких-либо Wow-эффектах, если Вы «плаваете» пока даже в простейших принципах построения пользовательских интерфейсов.
|
Greshnick, девочка на фотографии красивая, но не спасает ужасный интерфейс.
1. Цвет отвратительный (смотри рекомендации по сочетаниям цветов) 2. Текст нечитаемый (смотри рекомендации по выбору шрифтов) 3. Интерфейс не отражает процесс (ежедневно поиск ученика, выставление оценки, еженедельно распечатка ведомости) Попробой сам имитировать опрос 30 учеников (сгенерируй случайный список) - через 10 минут заболят глаза и руки ИМХО: 1. забудь временно про интерфейс, используй стандартные кнопки, стандартные формы 2. сконцентрируйся на функционале |
Вложений: 2
Iska, pva, lxa85 Вчера посидел и немного доработал интерфейс(прикрепляю 2 скрина), а также удаление, добавление и изменение записей. Лучше или нет выглядит внешка? Можете посоветовать учебники по построению интерфейса для начинающих? А также по GDI+ где идет описание создания компонентов?
|
pva, Iska, lxa85 посмотрел про построение интерфейса. Вот уже действительно век живи Век учись. Получается и правда иногда грамотно подобранное оформление и цветовые схемы помогут скрыть некоторые недоработки в плане функционала например. Т.е. то что нету будет считаться лишним и не нужным и наоборот неудобное оформление отпугнет пользователя. Спасибо Большое. Будем разбираться.
|
Время: 10:15. |
Время: 10:15.
© OSzone.net 2001-