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

Вниз

Как правильно объявить массив объектов?   Найти похожие ветки 

 
Nikos   (2003-05-08 14:11) [0]

Есть такая процедура
procedure TForm1.Design;
var k, i : Integer;
Lb : array of TLabel;
begin
k:= FieldQuest * 56;
Form1.Height:= k + 149;
BtNext.Top:= k + 80;
BtExit.Top:= k + 80;
LbHint.Top:= k + 80;
SetLength(Lb, FieldQuest);
for i:= 1 to FieldQuest do begin
Lb[i]:=TLabel.Create(Form1);
Lb[i].Color:= clWhite;
Lb[i].Cursor:= crHandPoint;
Lb[i].Font.Name:= "MS Sans Serif";
Lb[i].Font.Size:= 10;
Lb[i].Height:= 56;
Lb[i].Layout:= tlCenter;
Lb[i].Left:= 14;
Lb[i].Top:= 56 * i + 24;
Lb[i].Width:= 548;
Lb[i].WordWrap:= True;
end;
end;

Переменная FieldQuest является публичной, тип ее Integer. При входе в процедуру, эта переменная уже имеет значение(ошибки из-за этого возникнуть не может).
Во время выполнения этой процедуры ни каких ошибок не возникает, но как только завершается цикл появляется ошибка:
Access violation at address ... in module "...". Write of address ...
При завершении программы появляется ошибка:
Exception EInvalidPointer in module "..." at ... Invalid pointer operation.
Как я понимаю, программа говорит, что не правильный указатель, но из-за чего появилась эта ошибка?


 
Digitman   (2003-05-08 14:15) [1]


> Access violation at address ... in module "...". Write of
> address ...


> Exception EInvalidPointer in module "..." at ... Invalid
> pointer operation.


и кому же эти многоточия адресованы ? "..." ?


 
MBo   (2003-05-08 14:18) [2]

for i:= 0 to FieldQuest -1


 
Anatoly Podgoretsky   (2003-05-08 14:20) [3]

Массив объявлен правильно.


 
Serginio   (2003-05-08 14:20) [4]

for i:= 0 to FieldQuest-1 do begin
В динамических массивах нижняя граница начинается с 0
Используй также Low и High
for i:= Low(Lb) to High(Lb) do begin


 
MBo   (2003-05-08 14:22) [5]

Кстати, ты еще потом спросишь, почему их не видно - так Parent назначай


 
Serginio   (2003-05-08 14:25) [6]

Тогда уж
Lb[i]:=TLabel.Create(Self);
Lb[i].Parent:=Self;


 
Nikos   (2003-05-08 14:32) [7]

> Digitman ©
> и кому же эти многоточия адресованы ? "..." ?
Вот полный текст, если это поможет
Access violation at address 00401СС66 in module "Project.exe". Write of address 00425B90
Exception EInvalidPointer in module "Project.exe" at 00002754. Invalid pointer operation.



> MBo © (08.05.03 14:22)
> Кстати, ты еще потом спросишь, почему их не видно - так
> Parent назначай

Не совсем понятно, что значит Parent назначай. В свойствах объекта TLabel есть несколько Parent. Какой именно, и какое значение?


 
evvcom   (2003-05-08 14:42) [8]


> В свойствах объекта TLabel есть несколько Parent.

Свойство Parent одно, все остальные Parent*.

> Какой именно, и какое значение?

См. Serginio (08.05.03 14:25)


 
Anatoly Podgoretsky   (2003-05-08 15:00) [9]

Одноименные свойства у объекта не пропустит компилятор, так что не несколько а одно.


 
Nikos   (2003-05-08 15:05) [10]

А как задать созданным лейблам одну и ту же обработку событий.
Например, чтобы при наведении курсора на лейбл он менял цвет на желтый, а при отведении обратно в белый? Эти события надо задавать в цикле при описании или отдельно?


 
evvcom   (2003-05-08 15:06) [11]

Да, еще надо иметь ввиду, что у классов имеются не только published свойства, видимые в инспекторе объектов, но и public. Другими пока Никосу похоже рано голову морочить.


 
Serginio   (2003-05-08 15:07) [12]

Создай ишзуально наследника от TLabel и используй при создании его.


 
evvcom   (2003-05-08 15:09) [13]


> Nikos (08.05.03 15:05)

Посмотри вкладку инспектора Events и понажимай на подозрительных строчках F1.


 
DJ_Sedoy   (2003-05-08 15:10) [14]

Метод у тебя тогда будет один, как то:
procedure TForm1.MyButtonClickProc(Sender: TObject);
Begin
ShowMessage("Метод вызван "+TControl(Sender).Name);
..... //делаем что нужно
end;

а в цикле соответственно
Lb[i].onClick=MyButtonClickProc;

Только в Implementation не забудь процедуру написать.


 
Serginio   (2003-05-08 15:27) [15]

Мое мнение, что лучше работать через наследника. При этом можно обращаться к приватным полям итд.


 
evvcom   (2003-05-08 15:35) [16]


> Мое мнение, что лучше работать через наследника.

Первоначальный вопрос совсем не об этом.

> При этом можно обращаться к приватным полям итд.

Стандартно к прив. полям из другого юнита не обратишься. Не надо путать с protected.


 
Serginio   (2003-05-08 15:45) [17]

Когда я объявляю
TMyLabel= Class(TLabel)
Private
FPrivate:Integer;
Public
Constructor (AOwner: TComponent); override;
Procedure MyButtonClickProc(Sender: TObject);
End;

TMyLabel.Create(Owner:TComponent);
Begin
Inherited
onClick:=MyButtonClickProc;
end;
procedure TMyLabel.MyButtonClickProc(Sender: TObject);
Begin
ShowMessage(IntToStr(FPrivate));
..... //делаем что нужно
end;

Все приватные переменные мне доступны


 
evvcom   (2003-05-08 16:29) [18]

Эта приватная - приватная класса TMyLabel, но никак не TLabel! Даже, если с таким именем есть у родителя, из потомка она (родительская) не видна.


 
Serginio   (2003-05-08 16:48) [19]

Ну ясен пень. Хотя была интересная статья на счет доступа к приватным переменным но это напоминает взлом. А имел я ввиду что евент конкретно привязан к данному экземпляру класса TMyLabel.


 
Verg   (2003-05-08 17:12) [20]

Мало того, что

> MBo © (08.05.03 14:18)
> for i:= 0 to FieldQuest-1


так еще и не непонятно: на кой ляд тебе сдался массив, который по-определию исчезнет после выполнения столь странной процедуры! Ну на кой этот массив? Вообще, мотивируй, а? Ты, ну с полным подобным успехом мог бы писать:
for i:= 1 to FieldQuest do
with TLabel.Create(Form1) do begin
Color:= clWhite;
Cursor:= crHandPoint;
Font.Name:= "MS Sans Serif";
Font.Size:= 10;
Height:= 56;
Layout:= tlCenter;
Left:= 14;
Top:= 56 * i + 24;
Width:= 548;
WordWrap:= True;
end;


А почему
> При завершении программы появляется ошибка:
> Exception EInvalidPointer in module "..." at ... Invalid
> pointer operation.
- это разговор, очевидно, отдельный.
С чего ты взял, что ошибка "зарыта" только в этой процедуре?


 
Nikos   (2003-05-09 16:29) [21]


> С чего ты взял, что ошибка "зарыта" только в этой процедуре?

При тестировании программы Trace Into клавиша F7 я заметил, что при окончании цикла появляется ошибка. Потом, при закрытии, так же появляется ошибка. Я уверен, что ошибка была (т.к. я ее уже исправил) в данной процедуре, а именно в цикле.
Мне нужно, чтобы массив исчез после завершения работы данной формы, а не процедуры. Я намерен перенести объявления массива туда, где объявлен сама форма, то есть
var
Form1: TForm1;
Lb : array of TLabel;
implementation


При создание объектов Verg © способом, можно будет ли использовать к ним события типа OnMouseUp, OnMouseLeave и прочие. И при создании объектов TLabel по какому имени к ним обращаться?


 
Nikos   (2003-05-10 12:19) [22]


> DJ_Sedoy © (08.05.03 15:10)

Вы мне советовали сделать так
> procedure TForm1.MyButtonClickProc(Sender: TObject);
> Begin
> ShowMessage("Метод вызван "+TControl(Sender).Name);
> ..... //делаем что нужно
> end;

> а в цикле соответственно
> Lb[i].onClick=MyButtonClickProc;

Процедуру эту я описал в Private так
procedure MyButtonClickProc(Sender: TObject);
При запуске программы компилятор выдает ошибки на строке, где идет ссылка на процедуру MyButtonClickProc(Sender: TObject);
[Error] FormTest.pas(119): Not enough actual parameters
[Error] FormTest.pas(119): Undeclared identifier: "Sender"
[Error] FormTest.pas(119): Statement expected, but expression of type "Class reference" found

Ваш метод, почему то не сработал.


 
Verg   (2003-05-10 12:40) [23]


> Я уверен, что ошибка была (т.к. я ее уже исправил) в данной
> процедуре, а именно в цикле.


Правильно, так динамический массив всегда индексируется с 0 (нуля) по егодлину-1

Т.е., если setlength(arr, 2), то элементами массива будут только arr[0], arr[1]. Если попытаться обратиться к arr[2], то как раз и произойдет AV.

Таким образом, еще раз

> > MBo © (08.05.03 14:18)
> > for i:= 0 to FieldQuest-1 do


А насчет твоего массива:
Вот кагда ты его перенесешь из локальных переменных процедуры в поле формы, тогда и появится смысл говорить о его дальнейшем использовании.

При создание объектов Verg © способом, можно будет ли использовать к ним события типа OnMouseUp, OnMouseLeave и прочие.
Да, конечно.

Кстати, посмотри на всякий случай Help:


Provides indexed access to all components owned by the component.

property Components[Index: Integer]: TComponent;

Description

Use Components to access any of these owned components, such as the controls owned by a form. The Components property is most useful when needing to refer to owned components by number rather than name. It is also used internally in Delphi for iterative processing on all owned components.

Note: For convenience use Components with ComponentCount for iterative processing. However, be aware that while the ComponentCount of a component contains the same number of items as in the Components list for that component, ComponentCount is always 1 more than the highest Components index, because the first Components index is always 0.





 
Nikos   (2003-05-10 13:03) [24]

Объявления массива я уже давно перенес в раздел описания переменных модуля.


 
Nikos   (2003-05-10 16:09) [25]

Я так и немогу понять, почему при компиляции на строке, где идет ссылка на процедуру
for i:= 1 to FieldQuest do
with TLabel.Create(FmTest) do begin
Color:= clWhite;
Cursor:= crHandPoint;
Font.Name:= "MS Sans Serif";
Font.Size:= 10;
Height:= 56;
Layout:= tlCenter;
Left:= 14;
Top:= 56 * i + 24;
Width:= 548;
WordWrap:= True;
Parent:= Self;
Caption:= "Now";
OnClick=Proc;
end;

выдается ошибка Not enough actual parameters? Курсор, при этом, мигает за знаком = и перед Proc.
Процедура описана так
private
procedure Proc(Sender: TObject);

Сама процедура, пока, выглядит так
procedure TFmTest.Proc;
begin
ShowMessage(TControl(Sender).Name);
end;

Если вставляю (Sender: TObject) к ссылке, то есть OnClick=Proc(Sender: TObject), то к выше описанной ошибки добавляется еще ")" excpected but ":" found
Подскажите в чем дело, простоне хотелось бы из-за этой ошибки переделывать весть код и приводить его в несуразный вид.



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

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

Наверх





Память: 0.52 MB
Время: 0.009 c
7-70542
Alexsys
2003-03-15 16:12
2003.05.22
Работа с COM портом.


1-70250
Igorek
2003-05-09 16:43
2003.05.22
Простой вопрос по указателю на метод


9-70081
Crazy Max
2002-12-14 17:34
2003.05.22
2-х оконное приложение на OpenGl


1-70283
Deus
2003-05-11 16:55
2003.05.22
Ошибка Internal Error: L594.


3-70087
Yuraz
2003-04-29 08:42
2003.05.22
Как оргпнизовать добавление/удаление строки в приложении.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский