При клике на форму исчезает всё...

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: При клике на форму исчезает всё...

Сообщение vitaly_l » 30.09.2012 00:14:17

FatMan писал(а):Придётся, поди, на TImage переделывать...

TImage??? - Это такой же глючный компонент, как и GropupBox, только глюки другие... Чтобы он правильно работал нужно пользовать BGRABitmap... и всё равно TImage - будет притормаживать...
GropupBox - можно исправить написав разработчикам, у них есть страничка: "о багах" - я как-то им писал... (см. поиск)
Постольку поскольку новые версии - выходят каждый день, то возможно исправят быстро...
PS: PaintBox - тоже работает странно... При этом, всё что написано своими руками - работает идеально... (в этом главный секрет Lazarusa...) :cry:
Чтобы Lazarus - довести до идеала - нужно время... при этом нужно осознавать, что для некоторых - Lazarus серьёзный конкурент...


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: При клике на форму исчезает всё...

Сообщение ZeUsM » 30.09.2012 12:27:45

vitaly_l писал(а): при этом нужно осознавать, что для некоторых - Lazarus серьёзный конкурент...

А вот тут подробней можно? Что - то я например не вижу кому он может быть конкурентом вообще, а серьёзным в частности. :?
Аватара пользователя
ZeUsM
новенький
 
Сообщения: 57
Зарегистрирован: 08.11.2010 13:55:35
Откуда: Нерезиновая

Re: При клике на форму исчезает всё...

Сообщение vitaly_l » 30.09.2012 12:45:43

ZeUsM писал(а):Что - то я например не вижу кому он может быть конкурентом вообще, а серьёзным в частности.

Lazarus - мультисистемная среда разработки, и он бесплатный; и даже с учётом громадного количества багов, он уже один из самых мощных продуктов. А когда баги исправят, то у остальных IDE - шансов на выживание не будет... т.к. инструмент программирования станет бесплатным. Те возможности, которые заложены в Lazarus - равноценны и в ряде случаев априори выше конкурентов. Итог - зависит от разработчиков Lazarus...
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: При клике на форму исчезает всё...

Сообщение B4rr4cuda » 30.09.2012 18:17:09

vitaly_l писал(а):А когда баги исправят, то у остальных IDE - шансов на выживание не будет...

Посмеялся..
Qt+разные IDE, Java эта вездесущая с кучей IDE и прочие языки и IDE о которых я просто не знаю..
Смешно думать, что развитие инструмента заточенного на RAD и имеющего свою область применения убьет другие языки и IDE)
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: При клике на форму исчезает всё...

Сообщение vitaly_l » 30.09.2012 18:23:33

B4rr4cuda писал(а):Смешно думать,

Абсолютно согласен: думать - смешно... (я имел ввиду платные аналоги)
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: При клике на форму исчезает всё...

Сообщение ZeUsM » 30.09.2012 20:31:11

Платный аналог - только Delphi. Лазарю до возможностей Эм-ро ой как далеко. И потом VS дает по договору вэбспарка бесплатно про версию студии + ещё скуль + сервер 2012 про на 5 инсталляций. Java с просто нереальным количеством бесплатных библиотек на все случаи жизни, питон, U++ ....
Никому он не конкурент, так поучиться, поиграться.
Аватара пользователя
ZeUsM
новенький
 
Сообщения: 57
Зарегистрирован: 08.11.2010 13:55:35
Откуда: Нерезиновая

Re: При клике на форму исчезает всё...

Сообщение vitaly_l » 30.09.2012 20:56:04

ZeUsM писал(а):VS дает по договору вэбспарка бесплатно

Бесплатный сыр от VS - это мышеловка... Более того - там сложнее готовить...
Единственный минус Lazarus - это несколько вышеописанных багов со стандартными компонентами...
Я верю - их когда нить исправят и на Земле наступит Рай!
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: При клике на форму исчезает всё...

Сообщение B4rr4cuda » 30.09.2012 21:18:23

vitaly_l, как все же много в вас от тролля. Выдирать фразы из контекста, отвечать на части сообщений.. все как по учебнику "Азбука тролля". Еще раз повторю, окромя Emabacadero Delphi - аналога нет. Любые другие IDE заточены под другие языки программирования и конкурентами не являются. Ибо это другое болото, куда нет протока...

ZeUsM, вы удивитесь, но часть посетителей этого форума зарабатывает деньги, используя fpc+lazarus. Да и сам я на прошлой работе кучу софта для автоматизации писал именно на лазаре. Так что кроме "поучиться, поиграться" лазарь вполне можно использовать для проектов. Выплывают, конечно, ньюансы, но где без них обходится?
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: При клике на форму исчезает всё...

Сообщение Kemper » 30.09.2012 21:23:46

vitaly_l писал(а):есплатный сыр от VS - это мышеловка... Более того - там сложнее готовить...

Бред и чушь. Вы явно мало работали с VS.
B4rr4cuda писал(а):Qt+разные IDE, Java эта вездесущая с кучей IDE и прочие языки и IDE о которых я просто не знаю..
Смешно думать, что развитие инструмента заточенного на RAD и имеющего свою область применения убьет другие языки и IDE)

Аминь!
Только все опять начинают забывать, что у всякой среды разработки и всякого языка есть свои области применения и круг задач. Я в жизнь не возьмусь писать что-то ресурсоёмкое на Python или Java(хотя я Java при любом раскладе не возьму). Зато с интересом буду смотреть на С/С++ или мной нынче любимый Go. А если нужно, что то написать для бизнеса, причем быстро и чтобы шустро работало и в гетерогенной сети то тут я буду смотреть на Pascal.
Огромный плюс использования Lazarus и Pascal в частности это действительно реальная кросплатформенность, которая и в Qt есть кстати, но скорость написания кода на C++ заметно ниже. Больше ни у кого её нет, разве что только у Go. А у всех остальных это набор костылей.
Kemper
новенький
 
Сообщения: 61
Зарегистрирован: 18.05.2010 00:29:44

Re: При клике на форму исчезает всё...

Сообщение vitaly_l » 30.09.2012 22:21:44

Если на GropupBox положить SynEdit, то для отключения глюка - можно кликать по нему...

Добавлено спустя 18 часов 44 минуты 58 секунд:
Должно отметить что, это глюк именно исключительно с GropupBox
т.к. с остальными компонентами всё замечательно и правильно работает!

Соответственно: "При клике на форму исчезает всё..." - было из-за в бага GropupBox... ГРОМАДНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО -> FatMan!

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: При клике на форму исчезает всё...

Сообщение FatMan » 04.10.2012 00:31:33

Однако, не всё так однозначно оказалось.
Пишу на javascript под Photoshop, в диалоговом окне с настройками скрипта есть функционал, аналогичный ранее описанному тут: несколько кнопок для настройки цветов, по клику вызывается диалог. Кнопки (в скрипте) сделаны через стандартные Button с перехваченным onDraw (стандартно цветом фона кнопок не оперирует javascript в фотошоповской реализации), выглядят внешне плоскими прямоугольниками, как и Shape в Lazarus, и размещены в контейнере типа panel, который выглядит так же, как GroupBox, порождённый стандартными компонентами Delphi или Lazarus. Так вот, решил я, что удобнее одинаковый цвет разным кнопкам определять не через диалог, а через drag-and-drop. Штатного механизма не предусмотрено, значит, надо работать через onmousedown/onmouseup. Вначале проверяю, могу ли я получить объект (button, statictext и т.п.) на котором событие мышиное вызвано, если обработчик через addEventListener к окну назначен. Проверяю выводом через alert мессаги (по сути - окна) с сообщением о параметрах объекта. И вот тут получаю: на первое mousedown объект определяется правильное, а все последующие упрямо повторяют информацию об этом первом объекте. Почти так, как в описанном мною случае с шейпами на групбоксе в Лазарусе, только клик по свободному месту на форме не исправляет ситуацию - требуется перезапуск скрипта.

Что общего у javascript в Photoshop и Lazarus? Вроде бы ничего. А вот у моих программ общее есть: из обработчика mousedown вызывается новое окно (alert в скрипте, ColorDialog в lazarus-программе).

Проверяю в скрипте: делаю вывод информации не в новое окно через alert, а в statictext на основной форме - и работает правильно! Теперь проверка в Lazarus. Повторюсь: на форме в GroupBox размещены несколько объектов TShape с одинаковыми обработчиками onMouseDown/onMouseUp, плюс ColorDialog:TColorDialog; ещё одна используемая глобальная переменная упомянута в первой строчке прилагаемого кода.

Код: Выделить всё
var ObjMouseDown: TObject = nil;

procedure TForm1.ShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ObjMouseDown:=Sender;
end;

procedure TForm1.ShapeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ObjMouseDown=Sender then begin
    ColorDialog.Color:=TShape(Sender).Brush.Color;
    if ColorDialog.Execute then
      TShape(Sender).Brush.Color:=ColorDialog.Color;
  end;
  ObjMouseDown:=nil;
end;


Работает. А если нажатие и отпускание кнопки происходят над одним и тем же шейпом, то работает правильно. А вот если нажать кнопку (MouseDown) над шейпом1, а отпустить (MouseUp) над шейпом2 (или любым другим визуальным объектом - хоть бы по пустому месту формы или вовсе за пределами окна программы), то Sender в onMouseUp будет не шейпом2, а всё тем же шейпом1. Как замена onClick такая связка двух обработчиков, может, и сгодится, но как попытка реализовать таким способом drag-and-drop - нет.

Может, это не следствие бага в реализации TGroupBox в Lazarus, а фича (т.е. особенность). Но чтобы быть особенностью, фича должна быть документирована. Мне же не попалось пока такой документации. Да и с поведением аналогичных объектов в Delphi не совпадает (правда, упомянутую связку двух обработчиков я в Delphi не проверил ещё). Не исключаю, что таки можно получить желаемую функциональность без правки исходных кодов стандартных компонентов, но пока этого не достиг. Попробовал заменить GroupBox через связки Panel+StaticText и Bevel+StaticText - визуально похоже получилось, да и подобных проблем, похоже, нет...
FatMan
незнакомец
 
Сообщения: 6
Зарегистрирован: 25.09.2012 20:48:04

Re: При клике на форму исчезает всё...

Сообщение Vapaamies » 04.10.2012 02:45:19

FatMan писал(а):А если нажатие и отпускание кнопки происходят над одним и тем же шейпом, то работает правильно.

Вот чёрт, а! С момента появления темы хотел высказать это предположение как наиболее логичное, но решил не флудить, потому как не пользуюсь Lazarus.

По-моему, самым логичным решением тут будет создание наследника TShape, имеющего безопасный для модальных окон OnClick, чтобы не пихать проблемный код в "низкоуровневый" OnMouseDown. Возможно, OnClick стоит включить прямо в TShape, раз уж открытые исходники.

FatMan писал(а):А вот если нажать кнопку (MouseDown) над шейпом1, а отпустить (MouseUp) над шейпом2 (или любым другим визуальным объектом - хоть бы по пустому месту формы или вовсе за пределами окна программы), то Sender в onMouseUp будет не шейпом2, а всё тем же шейпом1.

Скорее всего, под Windows там вызывается CaptureMouse.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: При клике на форму исчезает всё...

Сообщение vitaly_l » 04.10.2012 09:05:26

Vapaamies писал(а):Попробовал заменить GroupBox через связки Panel+StaticText и Bevel+StaticText - визуально похоже получилось, да и подобных проблем, похоже, нет...

Лично у меня все баги "При клике на форму исчезает всё..." - после замены GroupBox на Panel, исчезли и теперь программа работает как лучшие в мире часы... Соответственно с моей точки, это была - явная ошибка в GroupBox, т.к. на Panel - всё работает...

Vapaamies писал(а):если нажатие и отпускание кнопки происходят над одним и тем же шейпом, то работает правильно

То что я пронаблюдал с описанными Вами примерами про TShape, это явный баг...
Более того проверка "if ObjMouseDown=Sender then..." - всегда работает ложно и Sender не присваивается
т.к. можно кликать хоть на GroupBox всё равно нажатие воспринимается как от TShape...

либо присваивание ObjMouseDown:=Sender; происходит не в момент ShapeMouseDown, а только при ShapeMouseUp...
и именно поэтому, если нажатие и отпускание кнопки происходят над одним и тем же шейпом, то работает правильно...

Насколько я понял суть, бага, там не присваивается (точнее не освобождается Sender), типа "Sender := nil;"
поэтому постоянно вызывается один и тот же TShape(Sender)... Однако при ShapeMouseUp - эта функция срабатывает правильно...
И если Вы над нужным TShape(Sender), то она и производит верные действия...

Соответственно верный вызов Sender происходит только при ShapeMouseUp...

Как-то так... :cry:


.

Добавлено спустя 24 минуты 49 секунд:
PS: :arrow: Кстати если кликать по Shape не левой кнопкой, а правой то Shape - вызываются правильно... :cry:
очевидно программа при левом нажатии обращается адресно... и адрес не перезаписывается... а при правом работает правильно... :|



.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: При клике на форму исчезает всё...

Сообщение FatMan » 05.10.2012 21:21:35

То ли я чего-то не заметил, то ли поборол... Разумеется, речь идёт о нужной мне функциональности - не всё однозначно состыкуется с представлениями о том, как оно должно быть.
Итак, так начиналось, так продолжилось и вот к чему привело.

Для тех, кому лениво снова перечитывать, краткое содержание предыдущих моих мессаг. Как я уже писал, имею несколько визуальных элементов (например, прямоугольников), демонстрирующих некие выбранные цвета. Соответственно, от каждого элемента мне нужна была реакция на onClick (с вызовом диалога выбора цвета) и на Drag-and-Drop (с присваиванием цвета от Source к Sender). В качестве элементов выбрал объекты TShape, размещённые в GroupBox'е. Похожую задачу решал на javascript, где нет штатного механизма Drag-and-Drop, удалось сделать через onmousedown/onmouseup. Пытался применить полученный опыт в программе на Лазарусе (тем более, что у TShape нет onClick и всё равно задействовать придётся onmousedown/onmouseup) - с условным успехом.

Теперь дальше. Для пробы сделал аналогичную программу в Delphi 5 - не сильно иначе от описанного получилось. Т.е. на onMouseUp реагировал тот объект, на котором был onMouseDown. Вероятно, это следствие реализации Drag-and-Drop, потому как на правую кнопку, как писал vitaly_l, и в Delphi, и в Lazarus реакция более соответствующая предполагаемой.

Ну я и решил воспользоваться штатным D'n'D, тем более, что оно мне тоже надо. Из неочевидного, пожалуй, добавлена только проверка координат в onMouseUp на выход за пределы габаритов Sender'а. Ну и не забыть DragMode у всех шейпов поставить в dmAutomatic. Обработчики onMouseDown, onMouseUp, onDragDrop, onDragOver одинаковые для всех шейпов и имеют такой вид:
Код: Выделить всё
var ObjMouseDown: TObject=nil;

procedure TForm1.ShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ObjMouseDown:=Sender;
end;

procedure TForm1.ShapeMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (ObjMouseDown=Sender) and (Sender is TShape)
    and (X<TShape(Sender).Width) and (Y<TShape(Sender).Height) and (X>0) and (Y>0) then begin
      ColorDialog.Color:=TShape(Sender).Brush.Color;
      if ColorDialog.Execute then
          TShape(Sender).Brush.Color:=ColorDialog.Color;
  end;
  ObjMouseDown:=nil;
end;     

procedure TForm1.ShapeDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if (Source is TShape) then // вероятно, лишняя проверка, но пусть будет
       TShape(Sender).Brush.Color:=TShape(Source).Brush.Color;
end;

procedure TForm1.ShapeDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
  Accept:= (Source is TShape);
end;   


Что получил в итоге:
шейпы расположены внутри GroupBox'а, как и предполагалось изначально;
клик (нажатие-отжатие) левой или правой кнопкой мыши по шейпу вызывает ColorDialog для этого шейпа;
нажатие-перемещение-отжатие любой кнопкой при условии совпадения шейпа нажатия и отжатия вызывает ColorDialog для этого шейпа (воспринимается как клик);
перетаскивание левой кнопкой шейпа-A на шейп-B приводит к изменению цвета шейпа-B на цвет шейпа-A;
перетаскивание любой кнопкой шейпа на иной объект, пустую часть формы или за её пределы не вызывает никакой видимой реакции.
В общем, ради этого всё и затевалось. И проявлений ошибок/специфики TGroupBox, о которых говорилось тут на четырёх страницах, теперь не видно.
FatMan
незнакомец
 
Сообщения: 6
Зарегистрирован: 25.09.2012 20:48:04

Re: При клике на форму исчезает всё...

Сообщение vitaly_l » 12.10.2012 23:21:32

FatMan писал(а):И проявлений ошибок/специфики TGroupBox, о которых говорилось тут на четырёх страницах, теперь не видно.

А вот с этим пунктом, я, пожалуй - не соглашусь...
Ошибка в TGroupBox - есть, и если кто умеет грамотно описать её на English, то нужно сказать разработчикам,
о вышевыявленных багах, т.к. это в интересах всех. Или я чего-то не понимаю? :cry:


/
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 224

Рейтинг@Mail.ru
cron