Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Переход стрелочками между окошками   Найти похожие ветки 

 
Light-blr   (2010-05-07 01:59) [0]

Помогите, пожалуйста. На форме есть n окошек, расположенных одно под другим. Необходимо по стрелочке "вверх" переходить на окошко, расположенное выше текущего, ну и "вниз" соответственно.

Пытаюсь поймать сообщение, ничего у меня не выходит.
...
type
 TForm1 = class(TForm)
   Shape1: TShape;
   Edit1: TEdit;
   Shape2: TShape;
   Edit2: TEdit;
   procedure Edit1Enter(Sender: TObject);
   procedure Edit1Exit(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormShow(Sender: TObject);
   procedure WMKeyUp(var Msg:TWMKeyUp); message WM_KeyUp;
...
procedure TForm1.WMKeyUp(var Msg:TWMKeyUp);
begin
if Msg.CharCode = vk_Up then
 if Order[tp,3]<>0 then tp:=Order[tp,3];
Comp:=FindComponent(Names[tp]);
(Comp as TEdit).SetFocus;
inherited;
end;
в массиве Order у меня хранятся индексы названий окошек сверху/снизу/справа/слева от текущего.

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

Помогите, пожалуйста, разобраться с этой ситуацией.


 
Leonid Troyanovsky ©   (2010-05-07 07:44) [1]


> Light-blr   (07.05.10 01:59)

> Помогите, пожалуйста. На форме есть n окошек,

Если "окошко" есть Edit (n=2), то для перемещений между ними,
как и другими винконтролами, предназначен Tab & Shift+Tab.

Обработчик же формы не срабатывает потому, что сообщение
обрабатывается контролом в фокусе.

Полезно также помнить сказанное by Peter Below:
http://groups.google.com/group/fido7.ru.delphi.chainik/msg/9882c0fd38c38706

--
Regards, LVT.


 
Mike Kouzmine   (2010-05-07 07:53) [2]

используй стандартный механизм
либо сам управляй селектомнекст, либо заменяй ки ап даун на таб либо шифт таб


 
Light-blr   (2010-05-07 09:06) [3]

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

Leonid Troyanovsky
спасибо, почитала. Поняла, что надо заменить WM_KeyUp (ну или WM_KeyDown) на CM_CHILDKEY, поскольку окошко так и норовит само обработать сообщение, и WM_KeyDown не срабатывает.


 
Плохиш ©   (2010-05-07 10:22) [4]


>  if Order[tp,3]<>0 then tp:=Order[tp,3];
> Comp:=FindComponent(Names[tp]);
> (Comp as TEdit).SetFocus;
> inherited;
> end;
> в массиве Order у меня хранятся индексы названий окошек
> сверху/снизу/справа/слева от текущего.
>

Выкинуть этот код вместе с массивом.
Расставить TabOrder в правильном порядке и использовать для перемещения:

     PostMessage(Handle, WM_NEXTDLGCTL, 1, 0);
     PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);


 
Light-blr   (2010-05-07 22:15) [5]

А какой порядок правильный, если мне нужно в 4 стороны переходить? Ну не получается же линейно!

Теперь озадачилась вопросом, как при нажатии стрелочки отследить одновременное нажатие клавиши ctrl, и только тогда переходить между окошками. А то ведь и в самом окошке захочется курсор подвигать, а уже никак.


 
Игорь Шевченко ©   (2010-05-07 22:59) [6]


> Теперь озадачилась вопросом, как при нажатии стрелочки отследить
> одновременное нажатие клавиши ctrl


if GetKeyState(VK_CONTROL) < 0 then
// контрол нажат


 
Light-blr   (2010-05-07 23:07) [7]

спасибо! :) всё работает как часы.


 
Плохиш ©   (2010-05-08 02:38) [8]


> Light-blr   (07.05.10 01:59)
>
> Помогите, пожалуйста. На форме есть n окошек, расположенных
> одно под другим. Необходимо по стрелочке "вверх" переходить
> на окошко, расположенное выше текущего, ну и "вниз" соответственно.
>


> Light-blr   (07.05.10 22:15) [5]
>
> А какой порядок правильный, если мне нужно в 4 стороны переходить?
>  Ну не получается же линейно!

Бедная страна, у же в дурдоме кодеров ищут...


 
Германн ©   (2010-05-08 02:42) [9]


> Плохиш ©   (08.05.10 02:38) [8]


> Бедная страна, у же в дурдоме кодеров ищут...

Андрей. Не спеши уж с такими упрёками.
А может это будет новая игрушка, которая поразит весь мир, как когда-то Тетрис!
:)


 
MsGuns ©   (2010-05-08 02:48) [10]

Смех смехом, но когда то была такая проблемка, в итоге написал пару функций, которые определя "геометрические" координады контолов на контейнере и перемещали по кнопкам фокус "куда надо"
:)


 
Германн ©   (2010-05-08 02:54) [11]


> MsGuns ©   (08.05.10 02:48) [10]
>
> Смех смехом, но когда то была такая проблемка

И где же та игрушка? Ссылку дай.


 
Плохиш ©   (2010-05-08 02:56) [12]


> Германн ©   (08.05.10 02:42) [9]

Судя по второму абзацу из [5], я до шедевра не доживу.

> MsGuns ©   (08.05.10 02:48) [10]

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


 
Германн ©   (2010-05-08 03:08) [13]


> Плохиш ©   (08.05.10 02:56) [12]
>
>
> > Германн ©   (08.05.10 02:42) [9]
>
> Судя по второму абзацу из [5], я до шедевра не доживу.

Не дрейфь, старик! Мы тут многих переживём/пережуём.
:)


 
Anatoly Podgoretsky ©   (2010-05-08 10:36) [14]

> Плохиш  (08.05.2010 02:56:12)  [12]

Partizanen, no pasaran.


 
MsGuns ©   (2010-05-09 02:04) [15]

>Германн ©   (08.05.10 02:54) [11]
>И где же та игрушка? Ссылку дай.

Вот уж бином Ньютона, самому влом напрячься :)
а если без шуток, то на работе все мои штучки - дома давно уже принципиально не работаю


 
Германн ©   (2010-05-09 02:36) [16]


> MsGuns ©   (09.05.10 02:04) [15]
>
> >Германн ©   (08.05.10 02:54) [11]
> >И где же та игрушка? Ссылку дай.
>
> Вот уж бином Ньютона, самому влом напрячься

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

P.S.
Для меня уже давно дом == работа.


 
Andy BitOff ©   (2010-05-09 02:39) [17]

> MsGuns ©   (09.05.10 02:04) [15]
> дома давно уже принципиально не работаю

А я потому, что открыл для себя Бателфилд =)))


 
Anatoly Podgoretsky ©   (2010-05-09 10:24) [18]

> Германн  (09.05.2010 02:36:16)  [16]

Ты кончай с этим. Лучше собаку выведи погулять.


 
Германн ©   (2010-05-10 02:58) [19]


> Anatoly Podgoretsky ©   (09.05.10 10:24) [18]
>
> > Германн  (09.05.2010 02:36:16)  [16]
>
> Ты кончай с этим. Лучше собаку выведи погулять.

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

Но после "послеполуночной", примерно полуторачасовой работы над эксклюзивной версией газоанализатора, хроники ушли.
:)


 
Anatoly Podgoretsky ©   (2010-05-10 07:44) [20]

Ну так не всем помогает, особенно в запущеном случае, надо повторять постоянно.


 
Light-blr   (2010-05-15 23:22) [21]

> Плохиш ©   (08.05.10 02:38) [8]

> Бедная страна, у же в дурдоме кодеров ищут...

как говорится, не хами и не хамим будешь.
описала по-минимуму, поскольку в случае реализации перехода стрелочками между двумя окошками, организовать такой же переход между всеми остальными несложно. но когда посыпались предложения "переходить табом и не париться", задачу уточнила. видимо, мастерам делфи лень читать что-то кроме первого сообщения.
я ведь не спрашивала, каким образом можно переходить между окошками, предполагать что программист не знает про табуляцию может только <не очень умный человек>.
пишите, пишите свои "великие игрушки". я лично ваяю сугубо прикладные программы персонально для себя. никому не пытаюсь "загнать", не предполагаю написать нечто грандиозное, руководствуясь ответами на вопросы в конференции для начинающих.
не думала, что здесь обитают настолько неприятные типы. простите, что вмешалась своим вопросом в сплошной поток "помогите не могу посчитать сумму десяти чисел", на такие, конечно, попроще отвечать. мастера, ага...


 
Плохиш ©   (2010-05-15 23:50) [22]

Слишкам многа букав..


 
Плохиш ©   (2010-05-15 23:55) [23]


> Light-blr   (15.05.10 23:22) [21]

И всё-таки советую подробней ознакомиться с классом TStringGrid.


 
Игорь Шевченко ©   (2010-05-15 23:59) [24]

Light-blr   (15.05.10 23:22) [21]

Так их, так их...


 
Light-blr   (2010-05-16 00:52) [25]


> Плохиш ©   (15.05.10 23:55) [23]

спасибо, знакома более или менее. но он мне не подходит - в нём все клеточки ровные, а я хочу чтобы в каждой строке было различно заданное количество окошек, причём расположенных не абы-как, а выровненных по обоим бокам. В первой строчке, к примеру, 5 окошек помельче, под ними 3 окошка покрупнее. К каждому окошку подпись, поясняющая, что туда надо вводить. Новый ряд формируется в зависимости от ввода в предыдущем ряду. Просто такая вот программка для доступа к маленькой базе данных, со своими заморочками - но готовых решений, удовлетворивших бы потребности, не нашла, потому и пишу нечто своё. Использовать только то, что мне уже известно, совершенно неинтересно и бесперспективно. И ничему не научишься, и интерфейс программы получится "от бедности и по незнанию".


 
turbouser ©   (2010-05-16 01:18) [26]


> Light-blr   (16.05.10 00:52) [25]


> спасибо, знакома более или менее. но он мне не подходит
> - в нём все клеточки ровные

OMFG..
ну DrawGrid возьми.. Делов то..


 
Light-blr   (2010-05-16 02:11) [27]

спасибо, окошки меня более чем устраивают. зачем предлагать заведомо проигрышные варианты, когда есть другое решение?
мне проще написать что-то своё, чем пытаться подогнать под свои нужды что-то чужое, но уже имеющееся - если мне нужно организовать ввод в окошках разного размера и типа (не только эдиты, а всё подряд в зависимости от конкретной потребности), то я нарисую динамическое формирование на форме нужных окошек, а не буду пытаться брать готовый компонент из стандартного набора и писать на него миллион обработок каждого чиха.
вообще не понимаю идеологии "где мне взять компонент который ловит льва и сажает его в клетку", в конце концов я какой-никакой а программист, и в состоянии написать для себя программу, которая будет не по принципу чем быстрее сляпать, а по принципу как удобнее в дальнейшем пользоваться.


 
Германн ©   (2010-05-16 02:21) [28]


> Light-blr   (16.05.10 02:11) [27]

[24] +1
Типизация конечно хорошая вещь. Но не стоит её воспринимать как догму.
Но вот всё же интересно какая задача? Пока что кроме игрушек ничего в голову не приходит.


 
Light-blr   (2010-05-17 08:55) [29]


> Германн ©   (16.05.10 02:21) [28]

очень просто - автоматизация ввода описаний к радиоспектаклям :)
у них как правило есть автор и обязательно - название, а прочие поля (актёры, режиссёры, год записи) могут быть неизвестны и в эфире не объявляться, а могут быть и помногу за раз, потому нужна возможность динамического создания ряда окошек для ввода информации именно нужного типа. При вводе первых букв в окошко в одном расположенном на форме списке будут появляться возможные варианты, и тут ввод в окошко можно закончить вводом числа - номера элемента в текущем списке, и при переходе на соседнее окошко в предыдущем появится полная информация, а не сокращённый ввод.
Всё это я делаю для ускорения ввода - в идеале получится вообще вводить не останавливая воспроизведение, гораздо проще тыркать в клавиатуру, чем дёргать рукой к мышке.
Я понимаю, что при минимальных доработках можно было взять уже нечто готовое, пусть и не с таким интерфейсом, как хочется, но вполне работающее. Проблема осложняется тем, что ввод должен быть на двух языках, а ставить себе третий язык, помимо русского и английского, ну очень не хочется. Вечно забываешь какой за каким идёт и гадаешь что получится от нажатия альт-шифта. Во время ввода заменять введённую букву на букву другого языка для меня идеально.

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


 
sniknik ©   (2010-05-17 09:41) [30]

> динамического создания ряда окошек
ну и в чем тогда проблема? 4-ре свойства добавить с "указателями" на соседние, и в у главной формы прописать в onKeyUp (включить пред просмотр ввода формой) - "если клавиша влево и у активного окошка "указатель" не нил то setfocus ему.
раз динамически, то заполнить эти свойства раз плюнуть.

> где устанавливать что-нибудь вроде майэскюэля не дадут.
sqlite встраивается в движок, FB embeded dll рядом, access стоит везде, и т.д. ...


 
sniknik ©   (2010-05-17 10:17) [31]

type
 TEdit = class(StdCtrls.TEdit)
   LeftEdit, RightEdit, TopEdit, BottomEdit: TEdit;
 end;

procedure TForm1.FormCreate(Sender: TObject);
var
 Edit1, Edit2, Edit3,
 Edit4, Edit5, Edit6,
 Edit7, Edit8, Edit9: TEdit;

 procedure CreateEdit(var Edit: TEdit; iLeft, iTop: integer);
 begin
   Edit:= TEdit.Create(self);
   with Edit do begin
     Parent:= self;
     Left  := iLeft;
     Top   := iTop;
     Width := 90;
   end;  
 end;

begin
 CreateEdit(Edit1, 100, 100); CreateEdit(Edit2, 200, 100); CreateEdit(Edit3, 300, 100);
 CreateEdit(Edit4, 100, 150); CreateEdit(Edit5, 200, 150); CreateEdit(Edit6, 300, 150);
 CreateEdit(Edit7, 100, 200); CreateEdit(Edit8, 200, 200); CreateEdit(Edit9, 300, 200);

 Edit1.RightEdit:= Edit2; Edit1.BottomEdit:= Edit4;
 Edit2.LeftEdit := Edit1; Edit2.RightEdit := Edit3; Edit2.BottomEdit:= Edit5;
 Edit3.LeftEdit := Edit2; Edit3.BottomEdit:= Edit6;

 Edit4.RightEdit:= Edit5; Edit4.TopEdit   := Edit1; Edit4.BottomEdit:= Edit7;
 Edit5.LeftEdit := Edit4; Edit5.RightEdit := Edit6; Edit5.TopEdit   := Edit2; Edit5.BottomEdit:= Edit8;
 Edit6.LeftEdit := Edit5; Edit6.TopEdit   := Edit3; Edit6.BottomEdit:= Edit9;

 Edit7.RightEdit:= Edit8; Edit7.TopEdit   := Edit4;
 Edit8.LeftEdit := Edit7; Edit8.RightEdit := Edit9; Edit8.TopEdit:= Edit5;
 Edit9.LeftEdit := Edit8; Edit9.TopEdit   := Edit6;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 case Key of
   VK_LEFT:
     if (ActiveControl is TEdit) and (TEdit(ActiveControl).LeftEdit <> nil) then
       TEdit(ActiveControl).LeftEdit.SetFocus;
   VK_RIGHT:
     if (ActiveControl is TEdit) and (TEdit(ActiveControl).RightEdit <> nil) then
       TEdit(ActiveControl).RightEdit.SetFocus;
   VK_UP:
     if (ActiveControl is TEdit) and (TEdit(ActiveControl).TopEdit <> nil) then
       TEdit(ActiveControl).TopEdit.SetFocus;
   VK_DOWN:
     if (ActiveControl is TEdit) and (TEdit(ActiveControl).BottomEdit <> nil) then
       TEdit(ActiveControl).BottomEdit.SetFocus;
 end;
end;


 
Leonid Troyanovsky ©   (2010-05-17 14:56) [32]


> sniknik ©   (17.05.10 10:17) [31]

>    VK_RIGHT:

А в эдите табом ходить :)

--
Regards, LVT.


 
sniknik ©   (2010-05-17 15:04) [33]

> А в эдите табом ходить :)
а что делать? судьба такой... ;) ведь хочется же... (хотя, с учетом Игорь Шевченко ©   (07.05.10 22:59) [6] думаю ничего особо страшного не будет)


 
Leonid Troyanovsky ©   (2010-05-17 15:33) [34]


> sniknik ©   (17.05.10 15:04) [33]

> ничего особо страшного не будет

А если некоторые привыкли пользовать для Edit Ctrl+Right и Shift+Right,
да и к Ctrl+Shift+Right тоже? :)

IMHO, не нужны здесь динамические контролы, а нужно что-то
вроде detail TDBCtrlGrid или enable  дополнительных контролов/вкладок
по горячей клавише.

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

--
Regards, LVT.


 
sniknik ©   (2010-05-17 15:56) [35]

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


 
Leonid Troyanovsky ©   (2010-05-17 18:32) [36]


> sniknik ©   (17.05.10 15:56) [35]

>  пример чисто  из интереса.

Для начала, я тоже карту нарисовал :)

Потом подумал: фигня полнейшая, честно говоря.
Вопрошающий просто не оч.много пьес ввел, ну,
или, плохо пообщался с вводящими.

--
Regards, LVT.


 
Light-blr   (2010-05-19 22:38) [37]


> Leonid Troyanovsky ©   (17.05.10 18:32) [36]

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

Спасибо всем за ценные советы. Думаю, теперь справлюсь.


 
Германн ©   (2010-05-20 02:33) [38]


> Спасибо всем за ценные советы. Думаю, теперь справлюсь.

Бог в помощь!
:)


 
Inovet ©   (2010-05-21 00:31) [39]

> [37] Light-blr   (19.05.10 22:38)

Сдаётся мне, что со структурой базы что-то не то, если каждый раз надо вбивать фамилии. Справочников нет? Но это не по теме сабжа уже.


 
Amoeba_   (2010-05-21 18:14) [40]


> каждый раз надо вбивать фамилии. Справочников нет?
>

Фамилии из справочника? Оригинально!



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.082 c
2-1274505496
_Alis_
2010-05-22 09:18
2010.08.27
несколько GroupBox-ов


2-1271100027
Иван
2010-04-12 23:20
2010.08.27
ADO конект


2-1268949255
allrussia
2010-03-19 00:54
2010.08.27
Технология работы процедуры


11-1221313480
DJ Vusal
2008-09-13 17:44
2010.08.27
Проблема OLE обращений из Delphi в Excel


15-1265744589
Pavia
2010-02-09 22:43
2010.08.27
Мифы о программистах.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский