Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-89825
Slym
2003-11-14 10:49
2003.11.27
Большие целые числа (128бит) и математические операции с ними


3-89764
andrey__
2003-11-07 16:05
2003.11.27
Метод Locate


1-89951
gray
2003-11-16 01:55
2003.11.27
Не могу проинсталлить компонент


1-89903
limk
2003-11-14 17:28
2003.11.27
memo


6-90046
Tron
2003-09-23 21:25
2003.11.27
Как для компонента WebBrowser зделать кнопку назад?





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