Помогите начинающему
Модератор: Модераторы
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
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
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 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
"Вдруг как в сказке скрипнула дверь
Всё мне ясно стало теперь"
Оказывается, если выставить в anchors an_right, an_bottom, то соответствующие полосы прокрутки просто не будут появляться...
В граблехрнилише эту проблему...
Ссылку пжалуйста
Всё мне ясно стало теперь"
Оказывается, если выставить в anchors an_right, an_bottom, то соответствующие полосы прокрутки просто не будут появляться...
В граблехрнилише эту проблему...
debi12345 писал(а):Чего тогда стесняемся сами в конференции вопросы задавать ?
Ссылку пжалуйста
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
А можно кратко объяснить как пользоваться 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++).
ПС:
Сгенерируйте доку и смотрите по гиперссылкам- иначе повеситесь разбираться в этих тонкостях.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
debi12345 писал(а):Здесь нужно анализировать, от кого событие - и потом читать из соответствующих полей "переключаемой" структуры INFO ( похоже на UNION из C/C++).
Да понятно, но info.grid и info.cell общие для всех событий, т.к. находяться за пределами "переключателей". Пришлось двум одинаковым гридам назначать собственные обработчики (OnCellEventLeft и OnCellEventRight), патчить в них info.grid и передавать общему реальному обработчику события (OnCellEvent). Вот и думаю, что это скорей всего баг...
Похожая, но немного другая, беда возникла в OnDrawCell. Есть два одинаковых грида, с ними связанна моя пользовательская структура. Оба грида используют один обработчик события OnDrawCell (зачем писать дважды, если можно единожды), но в этом обработчике нужно получить указатель мой структуры. Я могу получить "указатель" на сам грид через sender.grid, но не могу связать структуру и грид. В идеале было хорошо, если каждый контрол имел свойство аналогичное свойству tag, но только не integer, а pointer (или tobject). А так приходиться использовать не надежное приведение типов integer <-> pointer.
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
События в гриде раньше не вызывали нареканий, если даже более сильные методы, типа :
"iscellclick" даже умеет замечать смещение ячейки ов время двойного клика, генериовать то же событие при нажатии ЕНТЕР на клавиатуре.
Чтобы различить события от клавы и от крысы (и только после этого лезть в соответствуюшие поля структуры ) - анализируйте "eventkind".
Если что нашли - пишите в конференцию. Думаю, Мартин рад будет - а то давно гридами не занимался %)
Код: Выделить всё
procedure tmainfo.personsevent(const sender: TObject;
var info: celleventinfoty);
begin
if iscellclick(info,[ccr_dblclick]) then begin
actEdit.execute;
end;
end;
"iscellclick" даже умеет замечать смещение ячейки ов время двойного клика, генериовать то же событие при нажатии ЕНТЕР на клавиатуре.
Чтобы различить события от клавы и от крысы (и только после этого лезть в соответствуюшие поля структуры ) - анализируйте "eventkind".
Если что нашли - пишите в конференцию. Думаю, Мартин рад будет - а то давно гридами не занимался %)
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
А ты по пробуй сделать
и потоптать клаву...
а если баг запулить в треккер на sf.net, Мартин его увидит? или он только через конфу общается?
PS:
мне лень в конфу ломиться
я раньше такими конфами не пользовался ничего не знаю и разбираться в лом...
веб - рулит
почитал я часть сообщений из mseide-msegui_talk.txt (из msedocumenting) и так и не понял почему Мартин не любит веб...
Также я не понимаю, почему многие, особенно на западе, так любят почтовые рассылки...
ведь веб-форум это так просто удобно и доступно...
впрочем я много чего не понимаю...
Код: Выделить всё
{$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:
мне лень в конфу ломиться
я раньше такими конфами не пользовался ничего не знаю и разбираться в лом...
веб - рулит
почитал я часть сообщений из mseide-msegui_talk.txt (из msedocumenting) и так и не понял почему Мартин не любит веб...
Также я не понимаю, почему многие, особенно на западе, так любят почтовые рассылки...
ведь веб-форум это так просто удобно и доступно...
впрочем я много чего не понимаю...
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
мне лень в конфу ломиться Embarassed
я раньше такими конфами не пользовался ничего не знаю и разбираться в лом...
клик на news://news.grid-sky.com автоматом вынесет вас на сервер (если есть почтовый клиент). Логин кажется не требуется. Останется вбить конференцию : public.mseide-msegui.talk
ПС:
Работа в конференциях ничем не отличается от работы с почтой в бате и аутлуке. Преимущество перед вэбом - моментальная загрузка, локальный поиск по контенту, локальное хранение после загрузки, включая аттачи. Потому и пользуемся %). Багтрэкер в вэбе есть - но ушли с него - неудобно.
Софт:
Вынь32: Аутлук или ЗэБат
Линукс: KNode (но он не хранит локально, кроме отправленных и черновиков )
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Из туториала "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;
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
debi12345
как я устал видеть одни и теже решения не мой проблемы...
с мышью у меня тоже всё работает, не работает с клавой
задача: при нажатии клавиши Insert инвертировать выделение текущей ячейки грида и сместить фокус к ячейке в следующей строке:
Т.к. info.grid во преки ожиданиям равен nil приходиться делать оберки для двух гридов:
как я устал видеть одни и теже решения не мой проблемы...
с мышью у меня тоже всё работает, не работает с клавой
задача: при нажатии клавиши 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 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
