Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1246602645
Rule
2009-07-03 10:30
2010.10.17
Ms SQL server через ADO-Native Client простой селект


2-1279900868
mc.fly
2010-07-23 20:01
2010.10.17
Как извлечь кол-во принятых отправленных байт у соединения?


15-1279186049
Дмитрий С
2010-07-15 13:27
2010.10.17
Это правильно, что этот код компилируется...


15-1279201889
antsa
2010-07-15 17:51
2010.10.17
Мышь в cmd


15-1279144743
Димон
2010-07-15 01:59
2010.10.17
Как передать файл на телефон по блютуз?





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