Форум: "Потрепаться";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
Внизпросто интересно. Найти похожие ветки
← →
Гаврила © (2005-10-31 14:21) [40]Проблема пересоздавания хендлов была у нас отмечена.
Но проблемой она стала исключительно благодаря кривизне самой программы
← →
Суслик © (2005-10-31 14:21) [41]хочу объекты-значения, как в java...
← →
GuAV © (2005-10-31 14:22) [42]jack128 © (31.10.05 14:08) [38]
> меньше писанины с выделением/освобождением памяти.
Почему ? от вызова конструктора и деструктора это не спасёт.
А если не нравитсяvariable := typename.Create;
try
finally
variable.Free;
end;
то так и надо говорить, а в стеке или нет - к этому не относится.
Игорь Шевченко © (31.10.05 14:16) [39]
> Они это редко делают.
Ну да. Если грабли будут бить по лбу часто, ошибки будут быстро выявлены.
Что, кроме хэндла, так удобно передать внешней подпрограмме (для запоминания во внешнем модуле) ?
← →
GuAV © (2005-10-31 14:35) [43]Да и не только HWND. VCL IMHO свойственно излишнее пересоздание.
Например,ShowMessageFmt("%X", [Image1.Canvas.Handle]);
ShowMessageFmt("%X", [Image1.Canvas.Handle]);procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then
FormStyle := fsStayOnTop
else
FormStyle := fsNormal;
Caption := IntToStr(Handle);
end;
или вот что иногда приходится делать:// обычный вызов TTabSheet.ImageIndex := Value приводит к
// пересозданию (и, возможно, перестановке) закладок, что нежелательно
//
procedure SetTabImageIndex(TabControl: TCustomTabControl; Tab, ImageIndex: Integer);
var Item: TTCItem;
begin
ZeroMemory(@Item, SizeOf(Item));
Item.mask := TCIF_IMAGE;
Item.iImage := ImageIndex;
if SendMessage(TabControl.Handle, TCM_SETITEM, Tab, LPARAM(@Item)) = 0 then
RaiseLastOSError;
end;
← →
Игорь Шевченко © (2005-10-31 14:36) [44]GuAV © (31.10.05 14:22) [42]
> Что, кроме хэндла, так удобно передать внешней подпрограмме
> (для запоминания во внешнем модуле) ?
Тэг ?
← →
GuAV © (2005-10-31 14:45) [45]
> Тэг ?
Ну пусть тэг. Только не так уж удобно, что когда внешнему модулю нужен таки хендл, он должем будет передавать тэг и callback функцию, которая получит хендл - видите, как всё сложно. (кстати, тогда уж лучше передать сам контрол, назвав его поинтером).
А если интерфейс уже спроектирован, и он предполагает передачу хендлов с их запоминанием ?
← →
jack128 © (2005-10-31 14:46) [46]GuAV © (31.10.05 14:22) [42]
Почему ? от вызова конструктора и деструктора это не спасёт.
Как раз от вызова деструктора - спасет. Деструктор вызывается автоматом, а-ля интерфейсы. От вызова конструктора - не спасет, но иногда конструктор и не нужен.. Лично меня устаивает то направление, в котором движется эволюция записей.
← →
jack128 © (2005-10-31 14:48) [47]GuAV © (31.10.05 14:45) [45]
А если интерфейс уже спроектирован, и он предполагает передачу хендлов с их запоминанием ?
Первое, что приходит на ум - AllocateHWnd с перенаправление всех сообщений целевому окну.
← →
GuAV © (2005-10-31 14:53) [48]
> Как раз от вызова деструктора - спасет.
От любого, в т.ч. неявного - никак, пока владеемые объекты и явно выделенная память освобождаются вручную.
От явного - скажи как - и можно таким же образом спастись и без размещения в стеке.
← →
Игорь Шевченко © (2005-10-31 14:56) [49]GuAV © (31.10.05 14:45) [45]
Странный ты. Хендлы и прочие "изменяемые" вещи изменяются же не по воле среды исполнения, а по той простой причине, что изменение ряда свойств возможно осуществить только повторным созданием объекта Windows. Есть два выхода - не изменяй эти свойства во время выполнения или передавай какой-то другой идентификатор. Впрочем, есть и самый первый выход - не желай странного :)
← →
GuAV © (2005-10-31 15:02) [50]jack128 © (31.10.05 14:48) [47]
> Первое, что приходит на ум - AllocateHWnd с
> перенаправление всех сообщений целевому окну.
Сообщений ? Ха. Разве работа с окнами сводится к исключительно сообщениям ?
Игорь Шевченко © (31.10.05 14:56) [49]
> ряда свойств возможно осуществить только повторным
> созданием объекта Windows.
Согласен, но
- Всё же почему бы не реализовать что-то вроде LockHandle/UnlockHandle и при FLockCount <> 0 генерить исключение заместо пересоздания окна.
- Случаев, где реально надо пересоздать меньше чем случаев, когда оно пересоздаётся.
> не желай странного :)
Ничего странного на самом деле. См. например [45] внизу.
Вспонил чего хочется "глобально". Сколько хошь обработчиков на события, чтобы и компоненты могли подписаться, и несколько своих модулей.
← →
Игорь Шевченко © (2005-10-31 15:08) [51]GuAV © (31.10.05 15:02) [50]
> Случаев, где реально надо пересоздать меньше чем случаев,
> когда оно пересоздаётся
пример в студию.
> Ничего странного на самом деле. См. например [45] внизу.
Не меняй свойств, ведущих к пересозданию объекта, при работе с такими интерфейсами, и всех делов.
> Вспонил чего хочется "глобально". Сколько хошь обработчиков
> на события, чтобы и компоненты могли подписаться, и несколько
> своих модулей.
Так оно вроде есть. Как минимум, в D2005 для .Net (да и вообще в .Net) multicasting delegates на уровне среды встроены.
А для Win32 такие конструкции пишутся в две-три строчки, если надо.
← →
evvcom © (2005-10-31 15:17) [52]
> Гаврила © (31.10.05 11:13) [19]
> А еще больше это не имеет отношения к QR после того ,как
> QR начинает в хвост и в гриву использовать глобальные переменные.
>
> Что следует из ситуации, когда один и тот же код в exe работает
> а в dll нет (при соблюдении борландовский правил передачи
> глобальных переменных Application и Screen в библиотеку)
Поди еще в dll передаются и другие объекты VCL без использования run-time packages? Это ж где ж такие правила у борланда описаны? Я неоднократно говорил, что это кривые методы, и если потом программа начинает глючить, то виноват программист, а не система. Не буду защищать QR в общем, но в данном случае он не виноват.
← →
GuAV © (2005-10-31 15:24) [53]
> > Случаев, где реально надо пересоздать меньше чем
>случаев,
>> когда оно пересоздаётся
>
>
> пример в студию
[43].
StayOnTop можно переключить без пересоздания через WinAPI.
TPageControl.Image (и некоторые другие св-ва) можно изменить без пересоздания закладок.
> Не меняй свойств, ведущих к пересозданию объекта, при
> работе с такими интерфейсами, и всех делов.
Именно. Проблема исключительно в том, что трудно следить, что пересоздаёт окно, что нет. А если компонент нестандартный и без исходников, то никак.
> А для Win32 такие конструкции пишутся в две-три
> строчки, если надо.
А чтобы такими были автоматически все события, с поддержкой средой и VCL ? В прочем, что уже имеем, то и имеем.
← →
Игорь Шевченко © (2005-10-31 15:37) [54]GuAV © (31.10.05 15:24) [53]
>
> ShowMessageFmt("%X", [Image1.Canvas.Handle]);
> ShowMessageFmt("%X", [Image1.Canvas.Handle]);
Ты ради интереса попробуй регулярно вызывать GetWindowDC у какого-нибудь окна :)
> StayOnTop можно переключить без пересоздания через WinAPI.
Разве SetWindowPos автоматом добавит стиль WS_EX_TOPMOST ? Или, наоборот, задание стиля WS_EX_TOPMOST автоматом вызовет поведение окна вида StayOnTop ? Для любого окна ?
← →
GuAV © (2005-10-31 15:51) [55]
> Разве SetWindowPos автоматом добавит стиль
> WS_EX_TOPMOST ?
А надо ?
Главное, чтоб было выше тех, кто не попросился наверх.
> Ты ради интереса попробуй регулярно вызывать
> GetWindowDC у какого-нибудь окна :)
Да. Тут я промазал, это ошибка WinApi требовать постоянного hDC для PlayEnhMetaFileRecord.
← →
Игорь Шевченко © (2005-10-31 16:02) [56]GuAV © (31.10.05 15:51) [55]
Кроме того, в исходных текстах VCL написано, что уничтожение старого окна вызывается в методе SetFormStyle. Как видишь, меняется не только StayOnTop при этом. Другое дело, что значение fsStayOnTop можно было не включать в этот тип, но тут уж я не могу сказать, чем руководствовался Borland.
← →
jack128 © (2005-10-31 16:22) [57]GuAV © (31.10.05 15:02) [50]
Сообщений ? Ха. Разве работа с окнами сводится к исключительно сообщениям ?
Когда как. У тебя слишком общими словами описана проблема, чтобы пытаться привести конкретное решение.
Игорь Шевченко © (31.10.05 15:08) [51]
пример в студию.
смена родителя у WinControl"a приводит к пересозданию окна. см procedure TWinControl.RemoveControl(AControl: TControl); Иногда(или даже в большенстве случаев) это не нужно
← →
Игорь Шевченко © (2005-10-31 16:31) [58]jack128 © (31.10.05 16:22) [57]
> Иногда(или даже в большенстве случаев) это не нужно
А вот интересно, Borland знает об этом (о том, что не нужно) и делает назло, нехай программисты помучаются ? Или все-таки чем-то руководствуется, как ты считаешь ?
← →
jack128 © (2005-10-31 17:00) [59]Игорь Шевченко © (31.10.05 16:31) [58]
А вот интересно, Borland знает об этом (о том, что не нужно) и делает назло, нехай программисты помучаются ? Или все-таки чем-то руководствуется, как ты считаешь ?
Без понятия. Может просто поленились проверку сделать, или решили что и так нормально работает, так лудше и не трогать.
← →
oldman © (2005-10-31 17:02) [60]
> jack128 © (31.10.05 17:00) [59]
> Без понятия. Может просто поленились проверку сделать, или
> решили что и так нормально работает, так лудше и не трогать.
>
Ты это всерьез? :)))
← →
Marser © (2005-10-31 17:06) [61]Из всех перечисленных вариантов я склоняюсь в сторону самого упомниаемого - наибольший глюк это прокладка между сиденьем и ПК.
← →
Prohodil Mimo © (2005-10-31 17:39) [62]интересно, какой гад придумал что в Д2005 нельзя просматривать меню во время разработки? Теперь необходимо запускать редактор меню и от туда уже назначать процедуры элементам меню. Так же это затрудняет перемещение от одной процедуры пункта меню к другой другого пункта.
Редактор меню так-же испоганили тем, что теперь нельзя скопировать Caption из одного элемента в другой, теперь копируется не текст, а сам элемент, причом без ссылок на процедуры, если таковые были в источнике :о)
VCL - до сих пор не имеет поддержки юникода, это просто свинство. К примеру: зачем в TCheckBox в свойствах фонта выбирают Character_Set ? неужто для того, что бы текст выводился системным? Хотя бы это могли сделать?
Придётся или свои писать. Сторонних не использую.
← →
Игорь Шевченко © (2005-10-31 17:43) [63]
> VCL - до сих пор не имеет поддержки юникода, это просто
> свинство
Мир давно использует TNT.
> какой гад придумал что в Д2005 нельзя просматривать меню
> во время разработки?
Это как ?
← →
Prohodil Mimo © (2005-10-31 18:19) [64]Игорь Шевченко © (31.10.05 17:43) [63]
Это как ?
А так, что нельзя теперь нажать на меню что бы оно открылось. Просто висит полоской с текстом и никакой реакции на нажатия.
← →
Игорь Шевченко © (2005-10-31 18:32) [65]Prohodil Mimo © (31.10.05 18:19) [64]
Сними флажок Embedded Designer в опциях
← →
Prohodil Mimo © (2005-10-31 23:01) [66]Игорь Шевченко © (31.10.05 18:32) [65]
Спасибо! То что надо, стало намного привычнее :о)
← →
Prohodil Mimo © (2005-10-31 23:04) [67]А Object inspector нельзя сделать как в Д3? что бы не разбивал на группы, а кидал всё в одну кучу, отсортированную в алфавитном порядке?
← →
DrPass © (2005-11-01 00:18) [68]Правой кнопкой на нем, Arrange by Name
← →
Zacho © (2005-11-01 00:21) [69]Loginov Dmitry © (31.10.05 12:50) [27]
На некоторых компьютерах вообще нельзя запустить две программы, использующие BDE
Это проблема не BDE, а горе-"программистов", которые не читают документацию и устанавливают BDE "продвинутыми кулл хацкеръскими" способами. При нормально установленном BDE такой проблемы нет.
← →
Карелин Артем © (2005-11-01 06:37) [70]
> Zacho © (01.11.05 00:21) [69]
Ставишь Дельфи 7 с БэДеЕ, затем Дельфи 3 с тем же самым. Работает БэДэЭ этот? Дельфи хацкерски ставит оное?
← →
Zacho © (2005-11-01 08:32) [71]Карелин Артем © (01.11.05 6:37) [70]
У меня почему-то работает. Инсталлятор вообще-то проверяет версию BDE.
Кстати, у меня сейчас действительно установлено Д3 и Д7 :)
← →
Карелин Артем © (2005-11-01 08:40) [72]У меня зачастую слетало BDE после установки старой версии Дельфи после более новой. Лечилось переустановкой новой версии.
← →
Zacho © (2005-11-01 09:23) [73]Карелин Артем © (01.11.05 8:40) [72]
Верю. У меня такого не было (как раз недавно поставил Д3 на комп с уже установленной Д7), но .. чёрт его знает...
Но дело в том, что симптомы, описанные в Loginov Dmitry © (31.10.05 12:50) [27]
я наблюдал неоднократно, и всегда дело было в том, что на компе было установлено как минимум две копии BDE, причём как минимум одна из них - тем самым "кулл хацкеръским" способом: копированием файлов BDE в директорию с программой (или в WINDOWS\SYSTEM, например). А вот при установке BDE нормальным способом (например, инсталляцией, созданной в IS) такого никогда не было, даже если программа, использующая более раннюю версию BDE ставилась после программы с более свежей версией.
← →
Гаврила © (2005-11-01 09:45) [74]
> [52] evvcom © (31.10.05 15:17)
>
> > Гаврила © (31.10.05 11:13) [19]
> Поди еще в dll передаются и другие объекты VCL без использования
> run-time packages?
Что-то в этой ветке меня постянно принимают за чайника.
Забавно.
← →
Loginov Dmitry © (2005-11-01 09:56) [75]
> Zacho © (01.11.05 09:23) [73]
Вы правы, BDE было установлено именно "кулл хацкеръским" способом. Но к сожалению и я и МНОГИЕ другие ПРАВИЛЬНОГО способа установки НЕ ЗНАЮТ. Может поясните, где взять халявный дистибутив BDE и как правильно выполнить его установку.
← →
Гаврила © (2005-11-01 10:01) [76]Вот, например, поставил я BDE нормальным способом.
А потом Василий Пупкин поставил свою супер-мега-программу кул-хацкерским способом
и моя перестала работать.
Виноват кто? Вася.
Звонить клиенты кому будут? Мне.
Полагаю, общение с ними доставит массу удовольствия обеим сторонам.
Если в маршрутке над пассажирским сидением помещена кнопка с надписью "не нажимать", и тот же Василий Пупкин, едучи на работу, ее нажал, в результате чего на ходу отвалилось колесо, виноват Вася.
А система совсем-совсемне виновата?
← →
pasha_golub © (2005-11-01 10:10) [77]Самая большая жалость, что недоступен BDE.pas...
Посмотреть, поучиться, понять...
> Гаврила © (01.11.05 09:45) [74]
Не чайник, а "кинжопас" ;0)
← →
Гаврила © (2005-11-01 10:13) [78]
> [77] pasha_golub ©
> Не чайник, а "кинжопас" ;0)
ну тогда ладно :-)))
← →
Zacho © (2005-11-01 10:14) [79]Loginov Dmitry © (01.11.05 9:56) [75]
Но к сожалению и я и МНОГИЕ другие ПРАВИЛЬНОГО способа установки НЕ ЗНАЮТ.
Документацию читать не пробовали ? А именно файл bdedeploy.txt
> Может поясните, где взять халявный дистибутив BDE и
> как правильно выполнить его установку.
"Халявных", а также и "платных" дистрибутивов BDE не существует, поскольку не нужны. Установку BDE имеет смысл включать в дистрибутив программы, его использующей. Собственно, только это и разрешено Борландом. Подробно всё это описано в bdedeploy.txt
Прочитайте наконец.
А создать дистрибутив программы с BDE, например в IS Express - элементарно, даже первый раз увидев IS на это уйдёт минут 15 от силы.
← →
Zacho © (2005-11-01 10:27) [80]Гаврила © (01.11.05 10:01) [76]
А если кулл хацкеръ Вася Пупкин напишет на Дельфи вирус, который отформатирует клиенту винчестер, то виноват в этом будет Борланд ?
Страницы: 1 2 3 4 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
Память: 0.63 MB
Время: 0.021 c