Перейти к содержанию
Fire Monkey от А до Я

Akad

Пользователи
  • Постов

    152
  • Зарегистрирован

  • Посещение

  • Победитель дней

    2

Сообщения, опубликованные Akad

  1. 11 час назад, RoschinSpb сказал:

    А я вот сварил:

    Если это действительно работает, то это просто жесть по архитектуре или глюк очередной. Вызов из Grid1SelectCell SelectCell обязан как минимум к переполнению стека приводить в реальной жизни. То есть делать этого нельзя. Ну или нельзя будет когда глюк будет исправлен.

    12 часа назад, RoschinSpb сказал:

    TColumn.CanEdit - виртуальный метод в дополнение к TColumn.Enabled и TColumn.ReadOnly, которые можно менять

    Тут вообще закачаться архитектура. Вот ситуация. Таблица из 5-ти колонок. 3-ю и 5-ю можно править, остальные нет. Соответственно в свойствах таблицы надо выставить [TGridOption.Editing]. Ну пытаемся запретить править остальные колонки для редактирования. Смотрим как это сделать. Начинаем перебирать методы: ReadOnly - мимо.  CanEdit - мимо. Locked - мимо. CanFocus - мимо. Enabled - мимо. InEditMode - мимо. Эээээ... всё. Нет очевидного способа сделать колонку не изменяемой. Так же нет события начала редактирования (создания редактора), что бы было можно его отменить.

    P.S. Именно запретить редактирование, а не сделать колонку не изменяемой, что делает ReadOnly.
     



  2.  

    22 часа назад, RoschinSpb сказал:

    А вынести код в свой отдельный метод и его уже вызывать из обработчика события тоже религия не позволяет?

    Можно. В простонародье называется костыль поставить.

    22 часа назад, RoschinSpb сказал:

    Между двумя пальцетыками грид может уехать на несколько строк.

    Не может. Так как клик должен останавливать скролл. В общем я понимаю, что вы всё стараетесь максимально усложнить. Особенно там, где сложности ни какой нет. Отсюда у вас и бесконечные глюки. Так как отладить это просто не реально. :(

    22 часа назад, RoschinSpb сказал:

    Столбец ACol может быть Disabled, или просто по некоторым причинам мы не хотим попадать в ячейку

    Вот для этого и var ACol. А с нынешнем var CanSelect каши не сваришь. Придётся для кастомизации всё равно ловить не это событие, а последующие, узнавать где сейчас курсор, запомнив где-то у себя где он был ранее и так далее. В общем идиотизм. Такой-же идиотизм, кстати как и TGridOption.Editing/TGridOption.CancelEditingByDefault назначать всей таблице, а не конкретным колонкам. Или TColumn.CanEdit в котором изменить значение нельзя. И прочее и прочее... Но это я о своём уже, о грустном.

    В 13 ноября 2017 г. в 17:28, krapotkin сказал:

    делать так затем, что компиляторы писать денег не хватит под каждую платформу отдельно, поэтому используются чужие

    Вот только умничать не надо. Если бы это было так, то не было бы секретной директивы компилятору, которая всё фиксит.




     

  3. 2 часа назад, RoschinSpb сказал:

    Обрабатывать OnDblClick - это и есть изобретение своего велосипеда и выполнение того, что должен выполнять сам компонент.

    Мне нужен факт двойного клика (двойного тапа и т.д. в общем экшена для выбранной строки). Если это мне не даёт OnDblClick, то это как минимум... эмммм... странно.

    2 часа назад, RoschinSpb сказал:

    А вот для TSwitch не всё так однозначно, там поведение уже более сложное (можно его переключить сдвинув пальцем и это не будет кликом). В Grid совсем все сложно. Логика поведения навороченная и любая отсябятина её поломает с непредсказуемыми последствиями.

    Не представляю там отсебятины. Если клик (нажатие и отпускание в пределах определённой маленькой дельты координат), то это клик. С двойным кликом всё ровно тоже самое, только там ещё дельта времени. Если сдвиг пальцем, то это сдвиг пальцем (хоть мышью, хоть пером). Тоже самое, что если я вод виндой мышью нажал на кнопку, а потом передумал, то я её (мышь) сдвигаю, и потом кнопку отпускаю. И это не клик.

    2 часа назад, RoschinSpb сказал:

    А кто-то (и таких людей наберется не мало) может сказать, "по клику я хочу сам выделить ячейку ту, которую считаю нужной, а не ту на которую ткнул пользователь".

    И какая проблема в этом обработчике переместить выделение на нужную ячейку, если это надо? Тем более, что по уму за это должно отвечать отдельное событие, а ни как не клик. Так как можно стрелками например выделение передвигать. И не так, как сейчас:

    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);

    это вообще идеально. Тогда ни каких велосипедов не надо будет вообще по описанному Вами случаю.

    2 часа назад, RoschinSpb сказал:

    OnCellDblClick ведь сериализировать нельзя на единый обработчик кликов. Так и да, сделать два обработчика вместо одного — воистину адская по сложности работа :o) Да и странно, что таблица реагирует на нажатие также как кнопка, хотя всякое бывает.
     

    В текущем проекте у меня абсолютно все элементы создаются динамически. И если я для листов, таблиц и прочих списков буду создавать разные обработчики двойного нажатия - то это лишь раздует код, и при любом исправлении логики придётся править её в 10 местах. Что идеологически не верно.

    2 часа назад, RoschinSpb сказал:

    А ведь если бы можно было VCL-ный dfm запустить на андроиде... не, это было бы конечно не так круто, как натянуть грид на грани вращающегося куба, но гораздо более востребовано на практике.

    StringReplace и всё. :)

    А если серьёзно - абсолютно поменялся принцип программирования. Например нельзя сделать как раньше MyStringTable.ColCount := 10, надо каждый  столбец теперь создать через create, как будто это не задача самого компонента. Плюс сделали подобие com с сильными и слабыми ссылками. И теперь не возможно правильно уничтожить объект. Вот тут принципиальная разница, которая наводит некий ужас, и постоянное ЗАЧЕМ ТАК ДЕЛАТЬ???? Как например с zero based strings по умолчанию на мобильных платформах. Я программирую на Delphi начиная с 2-й версии, до этого программировал Turbo vision. И могу с уверенностью сказать, что по сравнению с тем, что я тут написал caption->text это вообще ерунда не заслуживающая упоминания. :D


     

  4. В 11 ноября 2017 г. в 14:26, RoschinSpb сказал:

    Потому, что Х3 как определить то, что находится в гриде под курсором (обычная ячейка, недоступная ячейка, редактор ячейки, заголовок, пустое место), особенно в момент скроллирования на телефоне где и мыши-то нет.

    Извиняюсь, а какое отношение скроллирование имеет к клику? Клик это нажатие, удерживание и отпускание клавиши мыши в одном (примерно) месте. Скроллирование - это перемещение во время нажатия. 2 абсолютно разных действия. Двойной клик по аналогии.

    В 11 ноября 2017 г. в 14:26, RoschinSpb сказал:

    И ХЗ когда менять выделенную ячейку до срабатывания события, после срабатывания события, после первого клика, или после второго. И ХЗ как реагировать самому гриду на клик, если пользователь сам уже что-то сделал..

    Ну тоже самое. Клик произошёл. Так что выделена ячейка должна быть под точкой клика.

    P.S. а как без этих событий вообще работать с гридом в режиме [RowLines]? OnDblClick глючноват, но какие варианты? OnCellDblClick ведь сериализировать нельзя на единый обработчик кликов. Писать очередной велосипед, выполняя то, что обязан выполнять сам компонент?
     

  5. В 9 ноября 2017 г. в 13:52, kami сказал:

    if  ..((FWeb = nil).... then begin WBService.DestroyWebBrowser(FWeb);

    Точно ни где ошибка не вкралась?

     

    В общем не знаю про ios, но под win и android этот фикс не лечит. Всё те же падения под win и так же не убираемый фрейм под андроид. Так что пока tms единственный выход, хотя там тоже глюков вагон. :( 
     

  6. 3 часа назад, Rusland сказал:

    Как сменить юзерагент webbrowser-а?

    А способ через настройки не работает?

    
    
    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

    Это естественно для анроида. Для вин через его апи и т.д.

     

  7. В 11 июля 2016 г. в 16:39, Rusland сказал:

    Инди компоненты не интересуют, не хочется их инспользовать

    А можно узнать почему? Ведь из (с ходу. В 10.2) 3 рабочих tcp серверов работает только idy. В клиентах ситуация не многим лучше. UDP боллемешно обычный работает, но... Короче очень грустно всё остальное.
     

  8. У читалок есть много сложных загонов с выводом. Например из-за шрифтов, отступов и т.д. Если бы я просто отображал постранично текст,  бы сделал следующее: закачал бы в какой-нибудь stritglist весь файл, потом начал построчно рисовать в канву с переносом. И как только высота превышала бы максимум, создавалась бы следующая страница. Всё.
     

  9. Есть событие: *DrawColumnCell. Через него можно отрисовать в ячейке что угодно. Единственная проблема - выводить будешь на уже отрисованный контент поверх, т.е. тормоза. Понимаю, что идиотизи, но других вариантов нет. Ну и ествественно onedit надо ловить, но он очень глючно доходит под всеми OS, но доходит после танцев с бубном. В принципе всё.
     

  10. Я бы просто прокси написал бы через id*, чем пытаться что-то с TWebBrowser серьёзное делать. Этот компонент просто не работает. И его НЕ ХОТЯТ отлаживать. Под винду он тупо падает после уничтожения компонента, под андроидом он после bwrowser.free остаётся висеть над родительской формой. Ни говоря о том, что кроме как через url с re-direct компонентом взаимодействовать не возможно.В своём текущем проекте с картографией я, похоже, выпилю полностью браузер, и воткну отображение png, так как ни под одной платформой TWebBrowser не работает вообще. TtmsfmxWebBrowser не настолько глючен, но всё равно рукалицо.
     

  11. 22 часа назад, Andrey Efimov сказал:

    Отлично работает. Проверил на Андроиде в Berlin 10.1.2 и Tokyo 10.2.1, скрины ниже. К слову, в исходниках студии есть файлы в которых используется эта директива и всё прекрасно работает.

    Удивительно. До этого пробовал (и ранее находил эту рекомендацию), после поста пробовал - не работало. Сейчас попробовал ещё раз - всё ок. То ли билд алл был нужен, то ли ещё чего. В общем всё ок. Благодарю. Вопрос закрыт. Хотя не понимание зачем было отходить от стандартов паскаля "по умолчанию" - осталось.

    12 часа назад, Tumaso сказал:

    Я конечно извиняюсь, но обвинять делфи что оно "не соответствует стандартам делфи" выглядит мягко говоря как феерический бред

    Почитай Вирта для разнообразия и не гони бред сам.
     

    12 часа назад, haword сказал:

    проблема в другом. в том что fmx вообще ни как не совместим с vcl и буквально все надо переписывать с нуля. поэтому никакой обратной совместимости в коде не будет.

    Может это кривость твоих ручек? У меня в текущем проекте сервер и визуальный редактор написаны на VCL, клиент под винду, андроид и линукс - fmx. Ни каких проблем. Двиг отдельно, UI отдельно. Причём замечу визуальный редактор на vcl компонентов, которые fmx.
     

  12. 22 минуты назад, Равиль Зарипов (ZuBy) сказал:

    вы думаете проблема только в индексе? а то что кодировка уже не анси, это мелочи?

    Библиотека написана нормально. 1 или 2 байта строкопредставлении - разницы нет. Под виндой работает без проблем. Проблема лишь в мобильных устройствах из-за не очень умного человека, который такое сотварил с мобильной версией дельфи, нарушив все стандарты.

    P.S. Что бы избежать дальнейших вопросов не по теме - библиотека pascalc. Скрипты. Написана более 15 лет назад. Аналоги, совместимые с XE линейкой мобильных устройств мне не известны. Код править не хочу, так как во-первых очень много мест где можно ошибиться - тратить неделю на отладку пока не планирую. А во-вторых у меня собственного и парсинга строк полно. Сейчас пока обхожусь $IFDEF MSWINDOWS, но это тупо и не правильно. А правильно вылечить студию, от этого идиотизма.

    17 минут назад, Andrey Efimov сказал:

    Рекомендую ознакомиться с официальной документацией:

    Извиняюсь. А где там что-то полезное?

    Если бы {$ZEROBASEDSTRINGS OFF} работало, то я бы понял. Но оно не даёт под андроидом ни какого эффекта.

     

  13. Как известно строки на мобильных ОС последних версий студии не соответствуют стандартам Pascal/Delphi - нумерация начинается с нуля и так далее. Что мягко говоря доставляет при разработке кросс-платформенных приложений. Особенно с библиотеками из до-XE эры.

    Встречал на западных форумах упоминания для более ранних XE хак исправляющий этот идиотизм. Но то, что скачивал - на заработало под 10.2, даже после доводки напильником. Может у кого под 10.2 рабочий завалялся?
     

  14. Имеем динамически создаваемый 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.
     

  15. 55 минут назад, krapotkin сказал:

    как вместо Sender придет не TButton, если мы сами создавали массив и присваивали этот обработчик каждой кнопке???

    А если ещё обработчик изменения TEdit и пр на этом коде появится?

    P.S. Даже если ты всю жизнь пишешь мелкие проектики со прямолинейной логикой и без скриптов и пр. вещей, это не значит, что  использование absolute хоть как-то оправдано. Тем более рекомендовать подобное кому-то. Код будет работать в частных случаях, максимум до первой большой переделки логики - когда ты об этом хаке уже забудешь - не более.


     

  16. 3 минуты назад, krapotkin сказал:

    первом же посте от sinuke совершенно верно написано использование приведения типа через absolute

    Это вообще мрак, что он написал. Такая конструкция возможна только в случае маленьких программок с простой логикой. Что, например, если в качестве Sender придёт не TButton?

    5 минут назад, krapotkin сказал:

    то что ссылки на кнопки хранятся в массиве не меняет совсем ничего

    А как выполнить действие, если пришла кнопка №34? Не поставив 34 if, и не трогая tag?
     

  17. 27 минут назад, krapotkin сказал:

    Sender это и есть искомая кнопка

    Sender - это сферический конь в вакууме. Sender as TButton - это уже ближе. Но обычно логика завязывается на массив. Ни кто не делает 100 if по поводу  SameText((Sender as TButton).text, "Кнопка1"), а сопоставляется с массивом. То есть MyButton[Sender.Tag]. Что я собственно в предыдущем посте и указал.
     

  18.  

    Для начала надо убрать этот ужас.

    В 7 октября 2017 г. в 23:08, МедиаСистемы сказал:

    MyButton: array[1..100] of TButton;

    Как минимум заменить на

    MyButton: array of TButton;

    SetLength( MyButton, JsAr.Size);

    Затем

    Form1.MyButton.Tag := i;

    И тогда в OnMyClick(Sender: TObject);

     MyButton[Sender.Tag] и будет искомой кнопкой.

  19. 14 часа назад, krapotkin сказал:


     

    фреймы, конечно.

    А как фрейм можно перетаскивать туда, где он мешать не будет? Причём каждый раз это место - новое.

    Так же если нужно вызвать дочернее окно, по новой парадигме - без ShowModal - тоже не совсем представляю как без parent := self обойтись.
     

  20. 10 часов назад, krapotkin сказал:

    вообще такая штука очень так себе...

    А какие ещё есть варианты, что бы второе окно было всегда над первым, но у первого не терялась возможность ввода? Это например нужно для вывода лога ошибок.

    9 часов назад, RoschinSpb сказал:

    Попробуйте назначать родителя браузеру после смены стиля рамки формы. Дело в том, что изменение рамки приводит к пересозданию хэндла окна и скорее всего это не отслеживается браузером что и приводит в итоге к ошибке...

    Если Вы про TMSFMXWebBrowser1.Parent := self, то это второе, что я попробовал. И так же пробовал

     

     TMSFMXWebBrowser1.Parent := nil;

     TMSFMXWebBrowser1.Parent := self;

    У меня такое ощущение, что окно как раз пересоздаётся, но от старого экземпляра не перепривязывается к новому. Т.е. загрузка (судя по Debug строке среды) происходит, но если посмотреть по ПКМ исходный код страницы, то он пустой. И все последующие попытки программно перезагрузить страницу ничего не меняют.
     

  21. Нашел ли кто-то решение данной проблемы? Так же возникает, если у другой формы выставить родителем форму с TWebBrowser. Т.е. как только в коде что-то типа:

    Form2.Parent := self;

    содержимое окна  TWebBrowser моментально пропадает и становится полностью белым (XE 10.2, windows). Кстати со сторонним TTMSFMXWebBrowser картина аналогичная. 
     

×
×
  • Создать...