Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.27;
Скачать: CL | DM;

Вниз

ОЧЕНЬ много вопросов об указателях   Найти похожие ветки 

 
Мыш ©   (2003-11-15 21:03) [0]

Что возвращает Form.FindComponent?
Судя по объявлению TComponent, но если я пытаюсь получить адрес этого компонента, то компилятор требует переменную.
[code]
type Pcomp=^TComponent;
var
Cmp:PComp;
procedure
begin
Cmp:=@Form1.FindComponent();
end;
[\code]

В общем случае мне нужно загрузить в список TList указатели на все компоненты формы, но бьюсь уже три дня как рыба об лед - испробовал все возможные и невозможные варианты вплоть до безнадежного наугад и - нифига.
Вышлю астральным каналом тонну благодарственной маны тому, кто даст кусочек кода, как это сделать :)
Вот еще какие непонятки возникают:
0. Нужно ли выделять память для указателя? А если их массив? Вроде как в книге написано, что это нужно делать только для нетипизированных указателей, но в процессе всяких проб, у меня был момент, когда ничего не работало до тех пор, пока я не начал выделять память перед каждым использованием типизированного указателя и освобождать ее после.
1. Любая переменная класса представляет собой всего лишь указатель на область данных, значит ли это, что можно не получать адрес конкретного компонента с помощью @, а присваивать указателю напрямую так:
pointer:=Edit1;
2. Обязательно ли делать типизированный указатель для объектов?
3. Отличаются ли типизированный и нетипизированный указатели, а также указатели разных типов друг от друга размером занимаемой памяти, или типизация не идет дальше чем информация для компилятора?
4. Можно ли, объявив тип указателя как ^TObject, тем не менее загрузить в него наследника, к примеру, TСomponent?
5.И самый главный вопрос: зачем объявлять указатель ^ TСomponent, если каждый экземпляр (а ведь на них мне и нужны ссылки) сам представляет из себя указатель? Ведь Edit1 тот же, это же, насколько я понимаю, четырехбайтовый адрес ячейки памяти с данными о компоненте?

Пожалуйста, не отсылайте в хелп или умную книжку - все что касается указателей прочел уже и в хелпе и в двух книгах, но там слишком мало информации, нет ответов на все вопросы.


 
default ©   (2003-11-15 21:11) [1]


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
L: TList;
i: Byte;
begin

try
L := TList.Create;
L.Capacity := ComponentCount;
for i := 0 to ComponentCount - 1 do L.Add(Components[i]);
TButton(L[0]).Caption := "Урааа!"
finally
L.Free;
end;

end;

end.


 
Игорь Шевченко ©   (2003-11-15 21:14) [2]


> В общем случае мне нужно загрузить в список TList указатели
> на все компоненты формы

var
I : Integer;
begin
for I:=0 to Pred(ComponentCount) do
MyList.Add(Components[I]);
end;


 
Nikolay M. ©   (2003-11-15 21:18) [3]


> нужно загрузить в список TList указатели на все компоненты
> формы

В Form1.Components[i] не пробовал заглядывать?


> Нужно ли выделять память для указателя

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

> 1.2.3.
Help - Object pascal reference - Memory management

> 4.
Нет


> зачем объявлять указатель ^ TСomponent

Хочешь - объявляй, не хочешь - не объявляй.


 
Мыш ©   (2003-11-16 00:50) [4]

Nikolay M wrote "> 4.Нет" А почему же тогда во всех процедурах sender объявлен как Tobject, а посылать как параметр можно любой тип, и ошибок не будет?
"Хочешь - объявляй, не хочешь - не объявляй." Конечно не хочу! :) мне же меньше проблем, только зачем тогда указатели придуманы, - не понятно. Да и все примеры, которые здесь дали (кстати огромное спасибо всем!) обходятся без указателей.
"По определению указатель уже указывает на некоторую область памяти, неважно, зарезервируешь ли ты эту область памяти у системы для своих нужд или нет." - да нет же, я имел в виду конечно же для самого указателя, а не для области памяти, на которую он указывает.

Но тем не менее, как в указатель
p:pointer; (или p:^Tedit)
загрузить адрес объекта Edit1, а потом оперировать с объектом через указатель? Я пробовал так:
p:=@Edit1; // загружаю в p адрес edit1
p^.caption:="ss"; //пытаюсь изменить текст объекта, на который указывает p, применив "разрешение" указателя - эта строчка, которая работает, когда p - указатель на integer (см. хелп), не дает даже откомпилироватся.
Вообще не понятно, зачем объявлять какие-то указатели, когда сам Edit1, например, уже указатель.
Может линк дадите, где нормально обо всем этом написано, а то чего-то уже мои вопросы больше флейм напоминают, скоро меня банить начнут.


 
Palladin ©   (2003-11-16 01:26) [5]


> Вообще не понятно, зачем объявлять какие-то указатели, когда
> сам Edit1, например, уже указатель

Никто тебя и не заставляет этого делать.


> не дает даже откомпилироватся.

Откуда компилятор знает что же именно находится по адресу p?


 
nikkie ©   (2003-11-16 01:39) [6]

сильно удивишься, если тебе скажут, что в объявлении X: TObject - X на самом деле указатель?


 
Мыш ©   (2003-11-16 02:17) [7]

2nikkie: ты ж даже мой пост не прочел. не удивлюсь.
2Palladin: >Откуда компилятор знает что же именно находится по адресу p? А если я объявляю p как ^Tedit? Компилятор знает, а комплилировать все равно не дает.


 
Palladin ©   (2003-11-16 02:22) [8]


> Мыш © (16.11.03 02:17) [7]

Ну если бы ты привел сюда сообщение компилятора, думаю мне было бы легче объснить тебе что произошло.


 
nikkie ©   (2003-11-16 02:33) [9]

>ты ж даже мой пост не прочел. не удивлюсь.
да нет, что-то прочел...
понять только, что ты пытаешься сделать непонятно.
загрузить компоненты в TList?
тебе дали код - ты удивляешься, почему там указателей нет.

>Вообще не понятно, зачем объявлять какие-то указатели, когда сам Edit1, например, уже указатель.
во-первых, кроме классов в дельфи существуют и другие типы данных. во-вторых, указатель на указатель - тоже вещь используемая, хоть в дельфи это и редкость.

>А почему же тогда во всех процедурах sender объявлен как Tobject, а посылать как параметр можно любой тип, и ошибок не будет?
во-первых, кроме классов в дельфи существуют и другие типы данных. во-вторых, передавать можно туда любого наследника TObject (т.е. экземпляр любого класса). но этот вопрос к указателям не имеет никакого отношения. это ООП.



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

Текущий архив: 2003.11.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.025 c
1-89818
Татьяна
2003-11-14 11:26
2003.11.27
TF1Book


14-90128
y-soft
2003-11-01 12:23
2003.11.27
Фотографии с последней встречи в Екатеринбурге


6-90040
IGORYOK
2003-10-02 11:44
2003.11.27
клиент-серверную прогу активизировать на определённом порту


1-89937
rosl
2003-11-18 02:35
2003.11.27
таймер


6-90018
MakNik
2003-10-03 11:25
2003.11.27
Socket