Форум: "Начинающим";
Текущий архив: 2010.10.17;
Скачать: [xml.tar.bz2];
ВнизУзнать 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;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.004 c