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

Вниз

Узнать Top предыдущего элемента в списке TList   Найти похожие ветки 

 
Vass   (2010-05-19 18:57) [0]

Здравствуйте! У меня такой вопрос. Создал список типа TList и "кидаю" в него компоненты типа TImage, как узнать свойство Top предыдушего Image-а ? Например, мне нужно устрановить следующий блок ровно под предыдущем.
...
pimage^.Top := List.Items[i-1]^.Top + List.Items[i-1].Height;
...

Что то типа такого, но именно так нельзя Items[i] это типа Pointe, Тор-это типа integer. Заранее спасибо!!! Этот сайт и форум мне уже не раз помог!!! ))


 
MBo ©   (2010-05-19 19:01) [1]

pimage^ - указатели на объекты ни к чему делать, это и так указательный тип.
Используй приведение типа TImage(List.Items[i-1]).Top


 
Vass   (2010-05-20 08:57) [2]


> Используй приведение типа TImage(List.Items[i-1]).Top


спасибо!!! помогла такая конструкция!!!


 
today   (2010-07-07 15:50) [3]

ПОМОГИТЕ! :)
Есть панель, на ней несколько TEdit-ов.


TPMyPanel = ^TMyPanel; // то что в TListe
TMyPanel = class(TPanel)
edt_one: TEdit;              // создаются при создании панели
edt_two: TEdit;
end;


Таких панелей на форме сколько угодно. Указатели на эти панели хранятся в TList-е.
КАК? по указателю узнать что в TEdit-e.


 
Омлет ©   (2010-07-07 16:08) [4]

> today

TPMyPanel - не нужен, это уже указатель на указатель.
Если в список помещать просто объекты класса TMyPanel, то достать можно будет так: TMyPanel(myList[i]).edt_one.text
А иначе, получается как-то так: TMyPanel(TPMyPanel(myList[i])^).edt_one.text
Если не ошибаюсь..


 
Омлет ©   (2010-07-07 16:12) [5]

Или просто TPMyPanel(myList[i])^.edt_one.text
Но это неправильная работа с указателями. Все объекты и так передаются по ссылке и являются указателями.


 
today   (2010-07-07 16:31) [6]

Спасибо за оперативность Омлет :)
Но чето не работает...


 
today   (2010-07-07 17:06) [7]

Прошу прощение! По-ходу работает, отпишусь как все проверю...


 
today   (2010-07-07 18:55) [8]

Создаю всего одну панель, вызываю:

showmessage(TMyPanel(MyList[0]).edt_one.Text);

пустое сообщение показывает. В чем может быть косяк?


 
Юрий Зотов ©   (2010-07-07 20:50) [9]

Ответьте самому себе на вопрос: что получится в результате операции
TMyPanel(MyList[0])


 
today   (2010-07-07 20:54) [10]

мог бы ответить - не спрашивал бы


 
Юрий Зотов ©   (2010-07-07 21:32) [11]

Зачем же тогда пишете то, чего сами не понимаете? Какой в этом смысл?

Ладно, начнем по порядку. Что такое TMyPanel?


 
Leonid Troyanovsky ©   (2010-07-07 22:05) [12]


> today   (07.07.10 18:55) [8]

> showmessage(TMyPanel(MyList[0]).edt_one.Text);
> пустое сообщение показывает. В чем может быть косяк?

Очевидно, что в edt_one - пустая строка.
Дык, а в чем сомнения?

--
Regards, LVT.


 
Юрий Зотов ©   (2010-07-07 22:23) [13]

Сомнения в смысле и в компилируемости конструкции:
TMyPanel(MyList[0]).edt_one


 
Юрий Зотов ©   (2010-07-08 01:01) [14]

Сорри, не прочитал [3]. Тогда действительно, edt_one просто пустой.


 
Германн ©   (2010-07-08 02:17) [15]


> Юрий Зотов ©   (07.07.10 22:23) [13]
>
> Сомнения в смысле и в компилируемости конструкции:
> TMyPanel(MyList[0]).edt_one
> <Цитата>
>
> Юрий Зотов ©   (08.07.10 01:01) [14]
>
> Сорри, не прочитал [3]. Тогда действительно, edt_one просто
> пустой.
>

Я [3] прочитал. Но не могу понять конструкцию MyList[0]. У TList нет такого свойства.


 
today   (2010-07-08 04:22) [16]

TMyPanel(MyList.items[0]).edt_one - если вы про это, то так тоже пустая :)


 
Омлет ©   (2010-07-08 09:12) [17]

myList[0] и myList.items[0] - равнозначные обращения к элементу списка.

> today

Код в студию.


 
Юрий Зотов ©   (2010-07-08 09:32) [18]


> Германн ©   (08.07.10 02:17) [15]

property Items[Index: integer] read... write... default;

Вот в этом default все дело и есть. Свойство по умолчанию.


 
Германн ©   (2010-07-08 15:38) [19]


> Вот в этом default все дело и есть.

Не знал о таком применении слова default. Спасибо.


 
Ega23 ©   (2010-07-08 15:43) [20]


> У TList нет такого свойства.


У TList есть такое свойство.

Для автора: я бы вместо TList использовал бы TObjectList  из Contnrs.


 
today   (2010-07-08 15:56) [21]

Всем спасибо! Разобрался, дело было в добавлении указателя в список, я добавлял так:

MyList.add(@MyPanel);

а надо так:

MyList.add(Pointer(MyPanel));


статью накопал - http://www.igrif.org/programmizm/ukazateli-v-delphi/


 
Омлет ©   (2010-07-08 15:59) [22]

Надо так:

MyList.add(MyPanel);


 
Юрий Зотов ©   (2010-07-08 18:50) [23]

Что статью накопал - хорошо. Что прочитал и разобрался в теме - отлично.

Блин, но вот что странно. Ведь все это и еще очень многое другое есть в книжках по Паскалю. Так почему же люди КАЖДЫЙ раз тратят километры времени на поиск информации по КАЖДОЙ незнакомой теме вместо того, чтобы ОДИН раз прочитать ОДНУ книжку?


 
today   (2010-07-08 19:18) [24]

По мере изучения, пришло время - начал ковырять :)

А как это объяснить?

 var r: Pointer;
 ...
 r := pointer(Label1);
 TEdit(r).Text := "f";
 r := nil;


И как узнать что указатель указывает на Label а не на Edit?


 
Deltas ©   (2010-07-08 19:45) [25]

Указатель указывает не на Label и не на Edit. Указатель указывает на адрес в памяти.

> var r: Pointer;
>  ...
>  r := pointer(Label1);
>  TEdit(r).Text := "f";
>  r := nil;

Это неправильный подход к программированию. В общем случае это приведет к ошибке доступа к памяти. Но в данном случает работает, и ответ на вопрос "почему?" кроется в классе TControl, который является предком для TEdit и TLabel:

TControl = class(TComponent)
...
property Caption: TCaption read GetText write SetText stored
IsCaptionStored;
...
property Text: TCaption read GetText write SetText;
...
end;

Причем очень важно, что SetText() не является виртуальным методом и не вызывает другие виртуальные методы.


 
Deltas ©   (2010-07-08 19:52) [26]

Такая запись в свойство объекта
TEdit(r).Text := "f";
приведет к выполнению точно того же кода, который выполняется при
Label1.Caption := "f";
или
TLabel(r).Caption := "f";
И, несмотря на то, что это не приведет к сбою программы, это очень плохой стиль программирования.


 
today   (2010-07-09 05:46) [27]

А как надо? Направь :)


 
Ega23 ©   (2010-07-09 06:33) [28]


> А как надо? Направь :)


А это смотря что ты хочешь получить.


 
today   (2010-07-09 07:38) [29]

Значит так:
Есть scrollbox в который добавляются панели с контролами (Edit, Memo, ComboBox). Панели меняют свое положение (сортируются) в зависимости от номера который вводится в Edit... Также есть TList в который добавляются указатели на эти панели, в приципе (пока) только для сортировки этот List мне и нужен. Сортировка проходит так:

List.Move(1,3);
for i := 0 to List.count-1 do
 TPanel(List.items[i]).Top := {ширина панели}*i;

Сначало было по другому, но так стало короче.  Критикуй пожалуста


 
Leonid Troyanovsky ©   (2010-07-09 07:50) [30]


> today   (09.07.10 07:38) [29]

> Есть scrollbox в который добавляются панели с контролами
> (Edit, Memo, ComboBox). Панели меняют свое положение (сортируются)
> в зависимости от номера который вводится в Edit...

Чего-то слишком наворочено.
Проще немного поработать над TDrawGrid.

--
Regards, LVT.


 
today   (2010-07-09 12:27) [31]

а если оставить все как есть?


 
igrif   (2010-07-16 20:51) [32]


> Указатель указывает не на Label и не на Edit. Указатель
> указывает на адрес в памяти.

Немного наврал по-моему. Вот специально по случаю: http://www.igrif.org/programmizm/kak-uznat-klass-obekta/


 
Юрий Зотов ©   (2010-07-17 12:43) [33]


> igrif   (16.07.10 20:51) [32]

Создаем новый проект и к абсолютно пустой форме добавляем вот такой обработчик события OnClick:

procedure TForm1.FormClick(Sender: TObject);
var
 PClassName: PShortString;
 PClassType: Pointer;
 PSelf: PPointer;
begin
 GetMem(PClassName, 6);
 try
   PClassName^ := "TEdit";
   PClassType := Pointer(Integer(@PClassName) - vmtClassName);
   PSelf := @PClassType;
   try
     ShowMessage("Объект класса: " + TObject(PSelf).ClassName)
   except
     ShowMessage("Не объект")
   end
 finally
   FreeMem(PClassName)
 end
end;

Запускаем, кликаем по форме - и видим что изложенный в статье метод срабатывает неверно: обычный указатель он определяет, как ссылку на объект класса TEdit. Так и должно было быть - значения всех переменных в программе специально установлены именно такими, чтобы возникло ложное срабатывание. Но кто может поручиться, что и в реальной программе в результате случайных совпадений не возникнет такая же ситуация? Никто.

Таким образом, изложенный в статье метод надежен не на все сто процентов, может и обмануть.

Конечно, вероятность ложного срабатывания весьма мала - но, тем не менее, не нулевая. И это следует иметь в виду всем, кто захочет данный метод использовать.

Ну а то, что подобные фокусы - это действительно неверный подход к программированию, сомнений, думаю, ни у кого не вызывает.


 
Leonid Troyanovsky ©   (2010-07-17 12:45) [34]


> igrif   (16.07.10 20:51) [32]

> Немного наврал по-моему. Вот специально по случаю: http:
> //www.igrif.org/programmizm/kak-uznat-klass-obekta/

Записки из мертвого дома.

--
Regards, LVT.


 
igrif   (2010-07-17 14:53) [35]

to Юрий Зотов:

Вероятность мизерная. Но, вы, конечно правы - вполне может возникнуть такая ситуация. По большому счету в проф деятельности таким пользоваться нельзя конечно, но в качестве тренировок (я сомневаюсь что уважаемый Vass пишет коммерческую софтину) самое оно :)


> Записки из мертвого дома.
??????????


 
Юрий Зотов ©   (2010-07-17 19:10) [36]

> igrif   (17.07.10 14:53) [35]

Я думаю, что и в качестве профессионального софта, и в качестве тренировок о каждом своем указателе программист просто всегда должен совершенно точно знать, что это такое и куда оно указывает.


 
igrif   (2010-07-17 20:53) [37]


> Юрий Зотов


Хмм... с этим и не поспоришь :)


 
Юрий Зотов ©   (2010-07-17 21:30) [38]


> igrif   (17.07.10 20:53) [37]

Естественно, не поспоришь - это же азбука. И одновременно - ПРАВИЛЬНЫЙ подход к программированию.
:o)


 
today   (2010-07-22 19:34) [39]

перечитал. А где ТОТ САМЫЙ ПРАВИЛЬНЫЙ ПОДХОД??


 
igrif   (2010-07-23 06:08) [40]

ну под правильным подходом здесь понимается очень осторожное обращение с указателями. Ты всегда должен знать на что он указывает в данный момент, обязательно пустые указатели держать в NIL и проверять перед использованием... Вообще, откровенно говоря, с точки зрения Вирта правильная работа с указателями - это отсутствие указателей. Но это уже, по-моему, бред. Так что не замарачиваяся, к концу написания своей программы поймешь как надо-было сделать правильно :)



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

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

Наверх




Память: 0.57 MB
Время: 0.009 c
15-1279201889
antsa
2010-07-15 17:51
2010.10.17
Мышь в cmd


15-1279474081
Пазитроныч
2010-07-18 21:28
2010.10.17
Ваше отношение к удаленным образовательным технологиям?


3-1246517778
greg123
2009-07-02 10:56
2010.10.17
Запрет добавления новой строки при прокрутке таблицы TIBTABLE


2-1279881424
Vladimir
2010-07-23 14:37
2010.10.17
Позиция указателя мыши в RichEdit


6-1213619893
Empleado
2008-06-16 16:38
2010.10.17
"Досадные недоразумения логики TClient/ServerSocket"