Помогите начинающему

Вопросы программирования и использования MSEide + MSEgui.

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

Сообщение shade » 31.01.2008 19:57:57

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
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение debi12345 » 31.01.2008 20:46:08

Sorry, it was like a broken phone...

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

(просьба не забывать расставлять артикли - намного понятнее будет )
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение shade » 31.01.2008 21:02:20

"Вдруг как в сказке скрипнула дверь
Всё мне ясно стало теперь"

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

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

Ссылку пжалуйста :roll:
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение debi12345 » 31.01.2008 21:58:49

Сервер: news.grid-sky.com
Конференция: public.mseide-msegui.talk
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение shade » 31.01.2008 22:01:27

А можно кратко объяснить как пользоваться StatFile?
нужно упаковать в него оформление
Даже не знаю с какой стороны подступить...
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение shade » 31.01.2008 23:38:26

TDrawGrid в событие oncellevent/cek_keydown - info.grid = nil
Долго не мог понять, почему по клику я могу выделить ячейку, а по нажатию клавиши получаю SIGSEGV...
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение debi12345 » 01.02.2008 00:20:25

А можно кратко объяснить как пользоваться 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++).

ПС:
Сгенерируйте доку и смотрите по гиперссылкам- иначе повеситесь разбираться в этих тонкостях.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение shade » 01.02.2008 14:03:04

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

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

Похожая, но немного другая, беда возникла в OnDrawCell. Есть два одинаковых грида, с ними связанна моя пользовательская структура. Оба грида используют один обработчик события OnDrawCell (зачем писать дважды, если можно единожды), но в этом обработчике нужно получить указатель мой структуры. Я могу получить "указатель" на сам грид через sender.grid, но не могу связать структуру и грид. В идеале было хорошо, если каждый контрол имел свойство аналогичное свойству tag, но только не integer, а pointer (или tobject). А так приходиться использовать не надежное приведение типов integer <-> pointer.
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение debi12345 » 01.02.2008 15:29:26

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

Код: Выделить всё
procedure tmainfo.personsevent(const sender: TObject;
               var info: celleventinfoty);
begin
  if iscellclick(info,[ccr_dblclick]) then begin
   actEdit.execute;
  end;
end;


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

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

Если что нашли - пишите в конференцию. Думаю, Мартин рад будет - а то давно гридами не занимался %)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение shade » 01.02.2008 16:45:21

А ты по пробуй сделать
Код: Выделить всё
{$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) и так и не понял почему Мартин не любит веб...
Также я не понимаю, почему многие, особенно на западе, так любят почтовые рассылки...
ведь веб-форум это так просто удобно и доступно...
впрочем я много чего не понимаю...
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение debi12345 » 01.02.2008 17:18:32

мне лень в конфу ломиться Embarassed
я раньше такими конфами не пользовался ничего не знаю и разбираться в лом...


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

ПС:

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

Софт:

Вынь32: Аутлук или ЗэБат
Линукс: KNode (но он не хранит локально, кроме отправленных и черновиков )
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 » 01.02.2008 18:15:23

Из туториала "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;
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение shade » 01.02.2008 19:09:02

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;
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение debi12345 » 01.02.2008 22:20:01

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

Наконец-то смог сосредоточиться. Да, похоже на баг - не настраивается член структуры. Уже пофиксено ?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение shade » 02.02.2008 11:19:48

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

Срашивал в конфе, Мартин говорит, что в транке уже пофиксено, проверил - в транке работает.
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Пред.След.

Вернуться в MSEide + MSEgui

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

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

Рейтинг@Mail.ru