Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 907

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Нужно создать массв панелей, на каждой из которых Button и Edit.
Для пробы я сначала попытался создать массив Edit'ов ( пример )
Компилит, но при запуске ругается : ошибка доступа. Я сам понимаю, что не выделяется память под объекты, а как это сделать ? Через конструктор, динамически ? А его можно запустить в цикле, чтобы одно из свойств объекта ( например, его координата на форме ) менялась ?
Добросовестно простробировал в ответах форума, но ясность не наступила.

Приложение:
  1. type
  2. MasEd = array[0..1] of TEdit ;
  3. TForm1 = class(TForm)
  4. GroupBox1: TGroupBox;
  5. Edit2: TEdit;
  6. Edit3: TEdit;
  7. procedure FormActivate(Sender: TObject);
  8. private
  9. { Private declarations }
  10. public
  11.  
  12. end;
  13.  
  14.  
  15. var
  16. Form1: TForm1 ;
  17. vrec,recsrv : Rec ;
  18. I,J,N : integer ;
  19. EdMas : MasEd ;
  20. implementation
  21.  
  22. {$R *.dfm}
  23.  
  24. procedure TForm1.FormActivate(Sender: TObject);
  25. begin
  26. EdMas[0].Color := clRed ;EdMas[0].Top := 30 ;
  27. EdMas[1].Color := clLime ;EdMas[1].Top := 70 ;
  28. end;
  29.  
  30. 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™

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.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.03 сек.