|
Вопрос # 3 907/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Нужно создать массв панелей, на каждой из которых Button и Edit.
Для пробы я сначала попытался создать массив Edit'ов ( пример )
Компилит, но при запуске ругается : ошибка доступа. Я сам понимаю, что не выделяется память под объекты, а как это сделать ? Через конструктор, динамически ? А его можно запустить в цикле, чтобы одно из свойств объекта ( например, его координата на форме ) менялась ?
Добросовестно простробировал в ответах форума, но ясность не наступила.
Приложение: Переключить в обычный режим- type
- MasEd = array[0..1] of TEdit ;
- TForm1 = class(TForm)
- GroupBox1: TGroupBox;
- Edit2: TEdit;
- Edit3: TEdit;
- procedure FormActivate(Sender: TObject);
- private
- { Private declarations }
- public
-
- end;
-
-
- var
- Form1: TForm1 ;
- vrec,recsrv : Rec ;
- I,J,N : integer ;
- EdMas : MasEd ;
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.FormActivate(Sender: TObject);
- begin
- EdMas[0].Color := clRed ;EdMas[0].Top := 30 ;
- EdMas[1].Color := clLime ;EdMas[1].Top := 70 ;
- end;
-
- end.
 |
Вопрос задал: Толяныч (статус: 4-ый класс)
Вопрос отправлен: 21 марта 2010, 11:25
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Почитай умные книжки.
Вкратце, скажу так... Твой массив MasEd = array[0..1] of TEdit - это массив УКАЗАТЕЛЕЙ. Вначале его надо проинициализировать, ибо без этого указатели будут указывать куда угодно, но только не туда, куда надо. Я вижу, у тебя на форме валяются 2 TEdit, созданные в Design-time. Если ты хочешь обращаться к ним как к элементам массива, то:
procedure TForm1.FormCreate{Activate}(Sender: TObject);
begin
EdMas[0]:= Edit2;
EdMas[1]:= Edit3;
EdMas[0].Color := clRed ;EdMas[0].Top := 30 ;
EdMas[1].Color := clLime ;EdMas[1].Top := 70 ;
end;
Если это будут другие (динамичеки создаваемые TEdit), то можно так:
procedure TForm1.FormCreate{Activate}(Sender: TObject);
var
Index: Integer;
begin
for Index:= Low(EdMas) to High(EdMas) do
begin
EdMas[Index]:= TEdit.Create(Self);
EdMas[Index].Parent:= Self;
EdMas[Index].Top:= 30 + 40 * Index;
end;
EdMas[0].Color := clRed;
EdMas[1].Color := clLime;
end;
Если тебе нужно создавать заранее неизвестное количество контролов в Run-time, можно использовать динамические массивы указателей, но придётся самому следить за распределением памяти под эти массивы. Есть способ лучше - использовать списки TList или TObjectList. Они сами следят за выделением памяти.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 21 марта 2010, 11:40
Оценка за ответ: 5
Комментарий к оценке: Спасибо, буду пробовать. Книжек умных у меня много, штук 10, в них много страниц, и знать точно, на которой заветное "петушиное слово"... Вот увидел впервые отродясь Self и теперь попытаюсь постепенно вникнуь.
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 26 марта 2010, 12:07; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 21 марта 2010, 12:01 [#1]:
Цитата (Толяныч):
Книжек умных у меня много, штук 10, в них много страниц, и знать точно, на которой заветное "петушиное слово"... Вот увидел впервые отродясь Self и теперь попытаюсь постепенно вникнуь.
А ты накачай книжек в электронном виде. На этом сайте их полно. В них есть поиск. Рекомендую для начала скачать вот эту.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Толяныч (статус: 4-ый класс), 26 марта 2010, 12:07 [#2]:
Чтение умных книжек помогло Вот разобрался, как сделать обработчик для массива контролов - работает.
procedure TForm1.FormActivate(Sender: TObject);
begin
EdMas[0].Color := clRed ; cmas[0] := clRed ;
EdMas[1].Color := clLime ; cmas[1] := clLime ;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Index: Integer;
begin
masstro[0] := 'First' ; masstro[1] := 'Second' ;
for Index:= 0 to 1 do
begin
EdMas[Index]:= TEdit.Create(Self);
EdMas[Index].Parent:= Self;
EdMas[Index].Top:= 30 + 40 * Index;
EdMas[Index].Left := 60 ;
EdMas[Index].Width := 20 ;
EdMas[Index].ReadOnly := True ;
ButMas[Index]:= TButton.Create(Self);
ButMas[Index].Parent:= Self;
ButMas[Index].Top:= 29 + 40 * Index;
ButMas[Index].Left := 100 ;
ButMas[Index].Caption := masstro[Index] ;
ButMas[Index].OnClick := myClick
end ;
end;
procedure TForm1.myClick(Sender: TObject);
var i : integer ; s : string ;
begin
with Sender as TButton do
s:= Caption; Edit1.Text :=s ;
for i := 0 to 1 do
if s=masstro[i] then EdMas[i].Color := clWhite
else EdMas[i].Color := cmas[i] ;
end;
end.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|