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

Вниз

просто интересно.   Найти похожие ветки 

 
Гаврила ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.036 c
3-1129369145
AlexLines
2005-10-15 13:39
2005.11.27
Поиск в БД


3-1129194458
Delphinium
2005-10-13 13:07
2005.11.27
Blob-поля в InterBase


6-1122966884
ZAV
2005-08-02 11:14
2005.11.27
Как при помощи IDFTP узнать дату изменения файла


2-1131540149
max999
2005-11-09 15:42
2005.11.27
Вопрос на тему "иконка в трее" :)


6-1115775430
Lex_!
2005-05-11 05:37
2005.11.27
HTML код в TWebBrowser