| 
| 
 | Вопрос # 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.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |