Akad
Пользователи-
Постов
152 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Весь контент Akad
-
Если это действительно работает, то это просто жесть по архитектуре или глюк очередной. Вызов из Grid1SelectCell SelectCell обязан как минимум к переполнению стека приводить в реальной жизни. То есть делать этого нельзя. Ну или нельзя будет когда глюк будет исправлен. Тут вообще закачаться архитектура. Вот ситуация. Таблица из 5-ти колонок. 3-ю и 5-ю можно править, остальные нет. Соответственно в свойствах таблицы надо выставить [TGridOption.Editing]. Ну пытаемся запретить править остальные колонки для редактирования. Смотрим как это сделать. Начинаем перебирать методы: ReadOnly - мимо. CanEdit - мимо. Locked - мимо. CanFocus - мимо. Enabled - мимо. InEditMode - мимо. Эээээ... всё. Нет очевидного способа сделать колонку не изменяемой. Так же нет события начала редактирования (создания редактора), что бы было можно его отменить. P.S. Именно запретить редактирование, а не сделать колонку не изменяемой, что делает ReadOnly.
-
Можно. В простонародье называется костыль поставить. Не может. Так как клик должен останавливать скролл. В общем я понимаю, что вы всё стараетесь максимально усложнить. Особенно там, где сложности ни какой нет. Отсюда у вас и бесконечные глюки. Так как отладить это просто не реально. Вот для этого и var ACol. А с нынешнем var CanSelect каши не сваришь. Придётся для кастомизации всё равно ловить не это событие, а последующие, узнавать где сейчас курсор, запомнив где-то у себя где он был ранее и так далее. В общем идиотизм. Такой-же идиотизм, кстати как и TGridOption.Editing/TGridOption.CancelEditingByDefault назначать всей таблице, а не конкретным колонкам. Или TColumn.CanEdit в котором изменить значение нельзя. И прочее и прочее... Но это я о своём уже, о грустном. Вот только умничать не надо. Если бы это было так, то не было бы секретной директивы компилятору, которая всё фиксит.
-
Мне нужен факт двойного клика (двойного тапа и т.д. в общем экшена для выбранной строки). Если это мне не даёт OnDblClick, то это как минимум... эмммм... странно. Не представляю там отсебятины. Если клик (нажатие и отпускание в пределах определённой маленькой дельты координат), то это клик. С двойным кликом всё ровно тоже самое, только там ещё дельта времени. Если сдвиг пальцем, то это сдвиг пальцем (хоть мышью, хоть пером). Тоже самое, что если я вод виндой мышью нажал на кнопку, а потом передумал, то я её (мышь) сдвигаю, и потом кнопку отпускаю. И это не клик. И какая проблема в этом обработчике переместить выделение на нужную ячейку, если это надо? Тем более, что по уму за это должно отвечать отдельное событие, а ни как не клик. Так как можно стрелками например выделение передвигать. И не так, как сейчас: Grid1SelectCell(Sender: TObject; const ACol, ARow: Integer; var CanSelect: Boolean), что по определению не даёт и половины возможностей, а хотя бы Grid1SelectCell(Sender: TObject; var ACol, ARow: Integer) а ещё лучше Grid1SelectCell(Sender: TObject; const LastCol,LastRow:integer; var NewCol, NewRow: Integer); это вообще идеально. Тогда ни каких велосипедов не надо будет вообще по описанному Вами случаю. В текущем проекте у меня абсолютно все элементы создаются динамически. И если я для листов, таблиц и прочих списков буду создавать разные обработчики двойного нажатия - то это лишь раздует код, и при любом исправлении логики придётся править её в 10 местах. Что идеологически не верно. StringReplace и всё. А если серьёзно - абсолютно поменялся принцип программирования. Например нельзя сделать как раньше MyStringTable.ColCount := 10, надо каждый столбец теперь создать через create, как будто это не задача самого компонента. Плюс сделали подобие com с сильными и слабыми ссылками. И теперь не возможно правильно уничтожить объект. Вот тут принципиальная разница, которая наводит некий ужас, и постоянное ЗАЧЕМ ТАК ДЕЛАТЬ???? Как например с zero based strings по умолчанию на мобильных платформах. Я программирую на Delphi начиная с 2-й версии, до этого программировал Turbo vision. И могу с уверенностью сказать, что по сравнению с тем, что я тут написал caption->text это вообще ерунда не заслуживающая упоминания.
-
Извиняюсь, а какое отношение скроллирование имеет к клику? Клик это нажатие, удерживание и отпускание клавиши мыши в одном (примерно) месте. Скроллирование - это перемещение во время нажатия. 2 абсолютно разных действия. Двойной клик по аналогии. Ну тоже самое. Клик произошёл. Так что выделена ячейка должна быть под точкой клика. P.S. а как без этих событий вообще работать с гридом в режиме [RowLines]? OnDblClick глючноват, но какие варианты? OnCellDblClick ведь сериализировать нельзя на единый обработчик кликов. Писать очередной велосипед, выполняя то, что обязан выполнять сам компонент?
-
windows Вызов TPopup ломает поведение TWebBrowser
Akad ответил Вадим Смоленский вопрос в TWebBrowser
Точно ни где ошибка не вкралась? В общем не знаю про ios, но под win и android этот фикс не лечит. Всё те же падения под win и так же не убираемый фрейм под андроид. Так что пока tms единственный выход, хотя там тоже глюков вагон. -
А способ через настройки не работает? var WebBrowser: JWebBrowser; begin WebBrowser := GetField<JWebBrowser>('FJWebBrowser'); if (WebBrowser <> nil) then WebBrowser.getSettings.setUserAgentString(StringToJString(iUA)); end; https://forums.embarcadero.com/thread.jspa?threadID=236124 Это естественно для анроида. Для вин через его апи и т.д.
-
А можно узнать почему? Ведь из (с ходу. В 10.2) 3 рабочих tcp серверов работает только idy. В клиентах ситуация не многим лучше. UDP боллемешно обычный работает, но... Короче очень грустно всё остальное.
- 7 ответов
-
- NetHTTPClient
- передача фотографии
-
(и ещё 2 )
C тегом:
-
У читалок есть много сложных загонов с выводом. Например из-за шрифтов, отступов и т.д. Если бы я просто отображал постранично текст, бы сделал следующее: закачал бы в какой-нибудь stritglist весь файл, потом начал построчно рисовать в канву с переносом. И как только высота превышала бы максимум, создавалась бы следующая страница. Всё.
-
Есть событие: *DrawColumnCell. Через него можно отрисовать в ячейке что угодно. Единственная проблема - выводить будешь на уже отрисованный контент поверх, т.е. тормоза. Понимаю, что идиотизи, но других вариантов нет. Ну и ествественно onedit надо ловить, но он очень глючно доходит под всеми OS, но доходит после танцев с бубном. В принципе всё.
- 6 ответов
-
- объединение ячеек
- fmx
-
(и ещё 1 )
C тегом:
-
Я бы просто прокси написал бы через id*, чем пытаться что-то с TWebBrowser серьёзное делать. Этот компонент просто не работает. И его НЕ ХОТЯТ отлаживать. Под винду он тупо падает после уничтожения компонента, под андроидом он после bwrowser.free остаётся висеть над родительской формой. Ни говоря о том, что кроме как через url с re-direct компонентом взаимодействовать не возможно.В своём текущем проекте с картографией я, похоже, выпилю полностью браузер, и воткну отображение png, так как ни под одной платформой TWebBrowser не работает вообще. TtmsfmxWebBrowser не настолько глючен, но всё равно рукалицо.
-
Удивительно. До этого пробовал (и ранее находил эту рекомендацию), после поста пробовал - не работало. Сейчас попробовал ещё раз - всё ок. То ли билд алл был нужен, то ли ещё чего. В общем всё ок. Благодарю. Вопрос закрыт. Хотя не понимание зачем было отходить от стандартов паскаля "по умолчанию" - осталось. Почитай Вирта для разнообразия и не гони бред сам. Может это кривость твоих ручек? У меня в текущем проекте сервер и визуальный редактор написаны на VCL, клиент под винду, андроид и линукс - fmx. Ни каких проблем. Двиг отдельно, UI отдельно. Причём замечу визуальный редактор на vcl компонентов, которые fmx.
-
А почему не использовать TIdTCPClient/TIdTCPServer? Зачем сложности себе придумывать?
-
Библиотека написана нормально. 1 или 2 байта строкопредставлении - разницы нет. Под виндой работает без проблем. Проблема лишь в мобильных устройствах из-за не очень умного человека, который такое сотварил с мобильной версией дельфи, нарушив все стандарты. P.S. Что бы избежать дальнейших вопросов не по теме - библиотека pascalc. Скрипты. Написана более 15 лет назад. Аналоги, совместимые с XE линейкой мобильных устройств мне не известны. Код править не хочу, так как во-первых очень много мест где можно ошибиться - тратить неделю на отладку пока не планирую. А во-вторых у меня собственного и парсинга строк полно. Сейчас пока обхожусь $IFDEF MSWINDOWS, но это тупо и не правильно. А правильно вылечить студию, от этого идиотизма. Извиняюсь. А где там что-то полезное? Если бы {$ZEROBASEDSTRINGS OFF} работало, то я бы понял. Но оно не даёт под андроидом ни какого эффекта.
-
Как известно строки на мобильных ОС последних версий студии не соответствуют стандартам Pascal/Delphi - нумерация начинается с нуля и так далее. Что мягко говоря доставляет при разработке кросс-платформенных приложений. Особенно с библиотеками из до-XE эры. Встречал на западных форумах упоминания для более ранних XE хак исправляющий этот идиотизм. Но то, что скачивал - на заработало под 10.2, даже после доводки напильником. Может у кого под 10.2 рабочий завалялся?
-
Имеем динамически создаваемый TGrid состоящий из нескольких TStringColumn с такими опциями: grid.Options := [TGridOption.RowLines,TGridOption.RowSelect, TGridOption.Editing, TGridOption.CancelEditingByDefault, TGridOption.Header,TGridOption.HeaderClick]; Так вот сразу после создания, если мышкой выделить этот грид, то не работает клавиатура, и не приходят вообще OnKeyDown. Но как только поставить фокус на другой элемент, а потом вернуть на TGrid, то всё начинает работать. При этом элементы таблицы можно выделить мышью, и отредактировать без проблем. События OnGetValue/OnSetValue так же ходят корректно. grid.SelectRow(0) проблемы не решает. Хотя выделяется всё верно. Windows, studio 10.2.
-
А если ещё обработчик изменения TEdit и пр на этом коде появится? P.S. Даже если ты всю жизнь пишешь мелкие проектики со прямолинейной логикой и без скриптов и пр. вещей, это не значит, что использование absolute хоть как-то оправдано. Тем более рекомендовать подобное кому-то. Код будет работать в частных случаях, максимум до первой большой переделки логики - когда ты об этом хаке уже забудешь - не более.
-
Это вообще мрак, что он написал. Такая конструкция возможна только в случае маленьких программок с простой логикой. Что, например, если в качестве Sender придёт не TButton? А как выполнить действие, если пришла кнопка №34? Не поставив 34 if, и не трогая tag?
-
Sender - это сферический конь в вакууме. Sender as TButton - это уже ближе. Но обычно логика завязывается на массив. Ни кто не делает 100 if по поводу SameText((Sender as TButton).text, "Кнопка1"), а сопоставляется с массивом. То есть MyButton[Sender.Tag]. Что я собственно в предыдущем посте и указал.
-
Для начала надо убрать этот ужас. Как минимум заменить на MyButton: array of TButton; SetLength( MyButton, JsAr.Size); Затем Form1.MyButton.Tag := i; И тогда в OnMyClick(Sender: TObject); MyButton[Sender.Tag] и будет искомой кнопкой.
-
А какие ещё есть варианты, что бы второе окно было всегда над первым, но у первого не терялась возможность ввода? Это например нужно для вывода лога ошибок. Если Вы про TMSFMXWebBrowser1.Parent := self, то это второе, что я попробовал. И так же пробовал TMSFMXWebBrowser1.Parent := nil; TMSFMXWebBrowser1.Parent := self; У меня такое ощущение, что окно как раз пересоздаётся, но от старого экземпляра не перепривязывается к новому. Т.е. загрузка (судя по Debug строке среды) происходит, но если посмотреть по ПКМ исходный код страницы, то он пустой. И все последующие попытки программно перезагрузить страницу ничего не меняют.
-
Нашел ли кто-то решение данной проблемы? Так же возникает, если у другой формы выставить родителем форму с TWebBrowser. Т.е. как только в коде что-то типа: Form2.Parent := self; содержимое окна TWebBrowser моментально пропадает и становится полностью белым (XE 10.2, windows). Кстати со сторонним TTMSFMXWebBrowser картина аналогичная.