Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.017 c
4-1127817486
Adept
2005-09-27 14:38
2005.11.27
Перехват API Функций


14-1130933341
konda
2005-11-02 15:09
2005.11.27
IP телефония


4-1127652712
Vitaliy
2005-09-25 16:51
2005.11.27
Ввод (вывод) информации на поры(LPT,com,usb)


2-1131468320
abcdefghi
2005-11-08 19:45
2005.11.27
STRINGGRID


6-1124234200
Троян
2005-08-17 03:16
2005.11.27
Как узнать входящий/исходящий трафики???...





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