Форум: "Основная";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];
ВнизОЧЕНЬ много вопросов об указателях Найти похожие ветки
← →
Мыш (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c