Страница 8 из 12

Добавлено: 31.01.2008 18:57:57
shade
Attid, ну конечно же он ничего не понял...

Sorry, it was like a broken phone...

I'm trying to stretch ttoolbar to width of form. But when I do so I got horizontal SCROLLBAR. If I do smaller ttoolbar's width, then I have a space which I don't want. The same problems I have when I want right grid pull to right border, when I want grids and splitter to pull to bottom...
How to eliminate space and scrollbars?

FPC 2.2.0 (rev 9135), MSE 1.6 (rev 1955), ASPLinux 11.2

Добавлено: 31.01.2008 19:46:08
debi12345
Sorry, it was like a broken phone...

Чего тогда стесняемся сами в конференции вопросы задавать ?

(просьба не забывать расставлять артикли - намного понятнее будет )

Добавлено: 31.01.2008 20:02:20
shade
"Вдруг как в сказке скрипнула дверь
Всё мне ясно стало теперь"

Оказывается, если выставить в anchors an_right, an_bottom, то соответствующие полосы прокрутки просто не будут появляться...
В граблехрнилише эту проблему...

debi12345 писал(а):Чего тогда стесняемся сами в конференции вопросы задавать ?

Ссылку пжалуйста :roll:

Добавлено: 31.01.2008 20:58:49
debi12345
Сервер: news.grid-sky.com
Конференция: public.mseide-msegui.talk

Добавлено: 31.01.2008 21:01:27
shade
А можно кратко объяснить как пользоваться StatFile?
нужно упаковать в него оформление
Даже не знаю с какой стороны подступить...

Добавлено: 31.01.2008 22:38:26
shade
TDrawGrid в событие oncellevent/cek_keydown - info.grid = nil
Долго не мог понять, почему по клику я могу выделить ячейку, а по нажатию клавиши получаю SIGSEGV...

Добавлено: 31.01.2008 23:20:25
debi12345
А можно кратко объяснить как пользоваться StatFile?
нужно упаковать в него оформление
Даже не знаю с какой стороны подступить...

На главную форму программы уроните статфайл - он будет главным. Назначьте это файл свойству statfile этой формы - с этого момента он будет автоматически писаться/читаться при загрузке/выгрузке этой формы.
Чтобы хранить настройки/данные конкретных виджетов этой формы - назначьте в нужных виджетах опять-таки свойство statfile опять-таки на этот файл.
Чтобы опознавать виджет в статфайле, когда нужен доступ в коде - назначьте уникальное значение свойству виджета statvarname (хотя здесь есть умолчание).
У виджетов-редакторов можно назначить, что сохранять - данные и/или положение/геометрию {optionedit: oe_savestate, oe_savevalue}.
"oe_savevalue" может сохранить даже последнее содержимое грида (чем не маленькая БД ? ).
Есть режим "inmemory" - грубо говоря, это как подсекция главного статфайла, и назначать эти файлы другим формам.
Читать и писать данные можно также из кода (например, когда стартовый датамодуль нуждается в них еще до загрузки главной формы ) - через ReadStat/WriteStat/UpdateStat. UpdateStat удобно использовать без привязанного виджета - просто сохраняете/восстанавливаете в/из файла значение нужной переменной.

TDrawGrid в событие oncellevent/cek_keydown - info.grid = nil
Долго не мог понять, почему по клику я могу выделить ячейку, а по нажатию клавиши получаю SIGSEGV...

Здесь нужно анализировать, от кого событие - и потом читать из соответствующих полей "переключаемой" структуры INFO ( похоже на UNION из C/C++).

ПС:
Сгенерируйте доку и смотрите по гиперссылкам- иначе повеситесь разбираться в этих тонкостях.

Добавлено: 01.02.2008 13:03:04
shade
debi12345 писал(а):Здесь нужно анализировать, от кого событие - и потом читать из соответствующих полей "переключаемой" структуры INFO ( похоже на UNION из C/C++).

Да понятно, но info.grid и info.cell общие для всех событий, т.к. находяться за пределами "переключателей". Пришлось двум одинаковым гридам назначать собственные обработчики (OnCellEventLeft и OnCellEventRight), патчить в них info.grid и передавать общему реальному обработчику события (OnCellEvent). Вот и думаю, что это скорей всего баг...

Похожая, но немного другая, беда возникла в OnDrawCell. Есть два одинаковых грида, с ними связанна моя пользовательская структура. Оба грида используют один обработчик события OnDrawCell (зачем писать дважды, если можно единожды), но в этом обработчике нужно получить указатель мой структуры. Я могу получить "указатель" на сам грид через sender.grid, но не могу связать структуру и грид. В идеале было хорошо, если каждый контрол имел свойство аналогичное свойству tag, но только не integer, а pointer (или tobject). А так приходиться использовать не надежное приведение типов integer <-> pointer.

Добавлено: 01.02.2008 14:29:26
debi12345
События в гриде раньше не вызывали нареканий, если даже более сильные методы, типа :

Код: Выделить всё

procedure tmainfo.personsevent(const sender: TObject;
               var info: celleventinfoty);
begin
  if iscellclick(info,[ccr_dblclick]) then begin
   actEdit.execute;
  end;
end;


"iscellclick" даже умеет замечать смещение ячейки ов время двойного клика, генериовать то же событие при нажатии ЕНТЕР на клавиатуре.

Чтобы различить события от клавы и от крысы (и только после этого лезть в соответствуюшие поля структуры ) - анализируйте "eventkind".

Если что нашли - пишите в конференцию. Думаю, Мартин рад будет - а то давно гридами не занимался %)

Добавлено: 01.02.2008 15:45:21
shade
А ты по пробуй сделать

Код: Выделить всё

{$assertions on}
procedure tmainfo.personsevent(const sender: TObject;
               var info: celleventinfoty);
begin
  assert(info.grid <> nil);
  if iscellclick(info,[ccr_dblclick]) then begin
   actEdit.execute;
  end;
end;

и потоптать клаву...

а если баг запулить в треккер на sf.net, Мартин его увидит? или он только через конфу общается?

PS:
мне лень в конфу ломиться :oops:
я раньше такими конфами не пользовался ничего не знаю и разбираться в лом...
веб - рулит :D
почитал я часть сообщений из mseide-msegui_talk.txt (из msedocumenting) и так и не понял почему Мартин не любит веб...
Также я не понимаю, почему многие, особенно на западе, так любят почтовые рассылки...
ведь веб-форум это так просто удобно и доступно...
впрочем я много чего не понимаю...

Добавлено: 01.02.2008 16:18:32
debi12345
мне лень в конфу ломиться Embarassed
я раньше такими конфами не пользовался ничего не знаю и разбираться в лом...


клик на news://news.grid-sky.com автоматом вынесет вас на сервер (если есть почтовый клиент). Логин кажется не требуется. Останется вбить конференцию : public.mseide-msegui.talk

ПС:

Работа в конференциях ничем не отличается от работы с почтой в бате и аутлуке. Преимущество перед вэбом - моментальная загрузка, локальный поиск по контенту, локальное хранение после загрузки, включая аттачи. Потому и пользуемся %). Багтрэкер в вэбе есть - но ушли с него - неудобно.

Софт:

Вынь32: Аутлук или ЗэБат
Линукс: KNode (но он не хранит локально, кроме отправленных и черновиков )

Добавлено: 01.02.2008 17:15:23
debi12345
Из туториала "Persons" :

чтобы вызывать форму редактирования "editfo" при двойном щелчке мыши по строке :
mainform->grdPersons->oncellevent:= personsevent :

Код: Выделить всё

procedure tmainfo.personsevent(
  const sender: TObject;
  var info: celleventinfoty);
begin
 if (cek_buttonrelease = info.eventkind) and
    (sender as twidget).isdblclick(info.mouseeventinfopo^) then
 begin
    actEdit.execute;
 end;
end;


то есть анализируем факт отпускания мыши в пределах "grdPersons", и если этот факт соответствует двойному щелку левой кнопокой - напрямую запускаем действие, назначенное компоненту "actEdit"

или еще более упрощенный ( рекомендуемый ) вариант :

Код: Выделить всё

procedure tmainfo.personsevent(
  const sender: TObject;
  var info: celleventinfoty);
begin
 if iscellclick( info,[ccr_dblclick] ) then begin
  actEdit.execute;
 end;
end;


и (для справки) совсем низкоуровневый код :

Код: Выделить всё

with info,mouseeventinfopo^ do begin
 if (cek_buttonrelease = info.eventkind ) and
    (ss_double in shiftstate) and
    (button = mb_left)
 then begin
  actEdit.execute;
 end;
end;


Примечания :

"iscellclick" удобна еще и тем, что, по умолчанию, нажатие "Enter" эквивалентно двойному щелчку ( отключить это поведение можно, включив ограничение "ccr_nokeyreturn" в "[..]" списке)

вот мы увидели еще один вариант активизации компонентов типа "taction" - через прямой вызов "execute", и получили еще одно подтверждение большого удобства и гибкости "taction"

по умолчанию интервал обнаружения двойного щелчка в "MSEgui" равен 0.4 сек, весьма сильно отличающееся от значения 0.2 сек, принятому по умолчанию в среде X11 ; данный интервал можно изменить следующим способом :

в самой MSEgui-программе - в стартовом файле проекта :

// измеряется в (1/1.000.000) секунды
application.dblclicktime:= 200000;
application.createform(tmainfo,mainfo);
application.run;

Примечание :

в принципе, данную настройку можно задавать и менять в любом месте программы

MSEgui использует собственный алгоритм для исключения неверной интерпретации "двойного щелчка " в случаях, когда указатель мыши за время между щелчками успевает переместиться на другой визуальный компонент ( или ячейку таблицы ), причем данный алгоритм не зависит от ожидаемого интервала между щелчками .
Поэтому "application.dblclicktime" может принимать весьма большие значения без каких-либо проблем, и пользователю не нужно торопиться со щелчками.
Единственное , о чем в этом случае надо помнить - для таблиц используйте именно "iscellclick( info,[ccr_dblclick]", так как только здесь выполняется проверка на перемещение в соседние ячейки таблицы



Как ведет себя следующий код :

Код: Выделить всё

procedure tmainfo.cellevent(const sender: TObject; var info: 
celleventinfoty);
begin
 case info.eventkind of
  cek_buttonrelease:
   if (sender as twidget).isdblclicked(info.mouseeventinfopo^) then
     showmessage('Double clicked when column ' + IntTostr(info.grid.col) + '
was in input focus','msg'); <<-----------
  cek_keyup:
   showmessage( 'The code of ' + inttostr(longint(info.keyeventinfopo^.key))
+ ' is pressed','msg');
 end;
end;

Добавлено: 01.02.2008 18:09:02
shade
debi12345
как я устал видеть одни и теже решения не мой проблемы...
с мышью у меня тоже всё работает, не работает с клавой

задача: при нажатии клавиши Insert инвертировать выделение текущей ячейки грида и сместить фокус к ячейке в следующей строке:

Код: Выделить всё

procedure tmainfo.OnCellEvent(const sender: TObject; var info: celleventinfoty);
var
  cell: gridcoordty;
  p: PPanelInfo;
begin
  if (info.eventkind = cek_keydown) and (info.keyeventinfopo^.key = key_insert) then
  begin
    p := PPanelInfo(info.grid.tag);
    p^.Selection[info.cell.row] := not p^.Selection[info.cell.row];
    cell.col := info.cell.col;
    cell.row := info.cell.row + 1;
    p^.Grid.focuscell(cell);
    p^.grid.invalidatecell(info.cell);
  end; // if
end;


Т.к. info.grid во преки ожиданиям равен nil приходиться делать оберки для двух гридов:

Код: Выделить всё

procedure tmainfo.OnCellEventLeft(const sender: TObject; var info: celleventinfoty);
begin
  info.grid := LeftGrid; // patch info.grid
  OnCellEvent(sender, info);
end;

procedure tmainfo.OnCellEventRight(const sender: TObject; var info: celleventinfoty);
begin
  info.grid := RightGrid; // patch info.grid
  OnCellEvent(sender, info);
end;

Добавлено: 01.02.2008 21:20:01
debi12345
Т.к. info.grid во преки ожиданиям равен nil приходиться делать оберки для двух гридов:

Наконец-то смог сосредоточиться. Да, похоже на баг - не настраивается член структуры. Уже пофиксено ?

Добавлено: 02.02.2008 10:19:48
shade
debi12345 писал(а):Наконец-то смог сосредоточиться. Да, похоже на баг - не настраивается член структуры. Уже пофиксено ?

Срашивал в конфе, Мартин говорит, что в транке уже пофиксено, проверил - в транке работает.