| imho.ws |
![]() |
|
|
|
# 1 |
|
Guest
Сообщения: n/a
|
Задачка, собственно проста. (И от этого стыдно, блин
). Мне надо создать массив Edit'ов и у всех их поменять событие OnKeyDown... Думаю, что надо это провернуть при помощи создания класса-потомка TEdit,но не знаю, как мне это замутить.Помогите, плиз!!!
|
|
|
# 2 |
|
Junior Member
Регистрация: 24.02.2005
Сообщения: 97
![]() ![]() |
Попробуй так
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private FCheckboxes: TList; function GetCheckbox(Index: integer): TCheckbox; public property Checkboxes[Index: integer]: TCheckbox read GetCheckbox; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var i: integer; AComponent: TComponent; begin FCheckboxes := TList.Create; { ТАКЖЕ: это собирает все CheckBox в порядке очередности } for i := 0 to ComponentCount - 1 do if Components[i] is TCheckbox then FCheckboxes.Add(Components[i]); { ИЛИ: если они имеют имя CheckboxNN и вы хотите разместить их в массиве в том же порядке... } {for i := 1 to MaxInt do begin AComponent := FindComponent( 'Checkbox' + IntToStr( i ) ) ; if AComponent = NIL then break ; FCheckboxes.Add( AComponent ) ; end ;} end; procedure TForm1.FormDestroy(Sender: TObject); begin FCheckboxes.Free; end; function TForm1.GetCheckbox(Index: integer): TCheckbox; begin Result := TCheckbox(FCheckboxes[Index]); end; |
|
|
|
|
# 3 |
|
Guest
Сообщения: n/a
|
Как я понял из текста проги, она собирает в массив все чек_боксы на форме.. Но мне надо создать массив Едитов, которых еще нет на форме и разместить их в произвольном порядке, одновременно сделав так, чтобы у всех их срабатывало событие ОнКейДаун. Конкретно - мне надо чтобы юзер проги мог их по форме двигать при помощи Ctrl+arrows.Вот
Уже все мозги себе прокипятил...Можно было бы конечно кажому Едиту отдельно процедуру прописать.. Но если их будет под 100? Тем более, что в последствие собираюсь сделать из этого компонент.Там вобще универсальность нужна...
Последний раз редактировалось KsarDoS; 13.03.2005 в 19:46. |
|
|
# 4 |
|
Guest
Сообщения: n/a
|
Вот. Должно получиться что-то вроде этого, только Сколько будет Edit'ов зарание не известно.Но у всех должны быть определены зарание события ОнЕнтер,ОнESC,ОнКейДаун. Я не знаю, как тут лучше поступить.. Может ктонить все-таки шарит?Хелп, плиззз!!
|
|
|
# 5 |
|
Advanced Member
Регистрация: 23.08.2003
Сообщения: 442
![]() ![]() |
все довольно просто:
где-нить ( например в privat' е формы ) объявляеш массив TEdit* edits[100] и переменную на количество этих Edit' ов: int editsCount; потом где-нить ( например в OnCreate' e формы ) пишеш for ( int i = 0; i < ...; i++ ) { TEdit *edit = new TEdit(NULL);//т.к. нам его удалять edit->OnKeyDown = Edit_OnKeyDown;// ее предварительно нужно описать (в том же привате ) как void __fastcall Edit_OnKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); edit->Tag = editsCount;//что б его потом найти editsCount++; //тут еще парента присобачить и парент-виндов и расположение } + не забываем про удаление если что-то еще не понятно -- пиши |
|
|
|
|
# 7 |
|
Advanced Member
Регистрация: 23.08.2003
Сообщения: 442
![]() ![]() |
попробую ( я с делфями давно не работал )
значит так... массив тогда нужно объявлять как edits[100] TEdit ( если не ошибся ) цикл он и в африке цикл... TEdit *edit = new TEdit(NULL); превращается в edit = TEdit.Create(NIL); ( нужно будет где-нить объявить edit :TEdit ( так кажись ) обработчик присваивается так же, а объявляется как procedure Edit_OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); кажись все |
|
|
|
|
# 8 |
|
Junior Member
Регистрация: 15.04.2004
Сообщения: 69
![]() |
Создание Tedit'a делается так
unit .. ..... var Edits : array[0..100] of TEdit; count : integer; ... procedure lala (); begin Edits[count]:=TEdit.Create(Form1); Edits[count].parent:= имя панели или где их тебе надо разместить Edits[count].OnEnter:=OnEnterEdits - это твоя процедура, должна быть определена в классе формы. (procedure TForm1.OnEnterEdits....) и так далее. Для более конкретного ответа нужно больше данных. Хотя, в принципе, я тебе все, чтобы ты смог сделать сказал.Тебе только нужно оформить как тебе нужно. |
|
|
|
|
# 9 |
|
Junior Member
Регистрация: 30.03.2003
Адрес: СПб
Сообщения: 162
![]() ![]() ![]() |
Лучше не создавать статический массив Edito'ов, а создавать их динамически и пихать ссылки на них в TList (как предложил IGaDI, только с Edit'ами вместо checkbox'ов - принципиальной разницы в этом смысле нет
). А события OnEnter (да и любые другие) привязываются как у bloodman.ЗЫ: Если не разберёшься - вечерком покажу как
__________________
640Kbytes should be enough for everything! (c) Bill Gates, 1981. Все "спасибо" в репутацию
Последний раз редактировалось Al-x; 16.03.2005 в 08:22. |
|
|
|
|
# 11 |
|
Guest
Сообщения: n/a
|
Все Ок. Я еще все таки написал компонент. Так препод попросил. И теперь, благодаря Al-x у меня генереться мои личные Едиты...
Щаз еще напишу Сохранение координат в .ини и можно сказать - полноценный квик-репорт Кстати, если вызвать метод form1.print, с какими настройками форма будет печататься? И можно как нибудь эти параметры изменить..?З.ы.
|