Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.10.11;
Скачать: [xml.tar.bz2];

Вниз

Обработчик OnClick для ColorBox   Найти похожие ветки 

 
Alex_Ford   (2009-08-11 09:17) [0]

Доброе утро, мастера!

У меня такой вопрос. Я динамически создал экземпляр объекта ColorBox.
Разместил на форме. Все нгормально. Задача в следующем, как можно обработать событие OnClick для динамически созданного ColorBox? Всего их несколько штук. Перебор в цикле.
Пытался повозиться с NotifyEvent, но ничего толкового не получилось. Подскажите пожалуйста.


 
MsGuns ©   (2009-08-11 09:31) [1]

1. Кидаешь на форму колорбокс, шмякаешь на нем клик и в обработчике чт-нибудь пишешь
2. Затем колорбокс выкидываешь, в обработчике пишешь нужный код для динамического бокса.
3. При создании своего бокса в ран-тайме пишешь
   Бокс.OnClick := имя обработчика выкинутого бокса, где написан код


 
Alex_Ford   (2009-08-11 10:42) [2]

Спасибо за помощь!

Чего-то я не догоняю. Все сделано согласно выше описанному. Удалил клмпонент, но потом компилятор ругается на отсутствующий (удаленный компонент). И дальше ни-ни. :(


 
Kolan ©   (2009-08-11 10:56) [3]

Нужно просто понять, что обработчик, который создает ИДЕ, когда «шмякаешь на нем клик» — это самый простой метод с нужным набором параметров, который просто создается автоматически.

После того, как это понимание появится, надо написать свой метод и дальше работать с ним.

Судя по вопросу вам стоит прочесть книгу «Delphi 5 Руководство разработчика»


 
Alex_Ford   (2009-08-11 10:58) [4]


> Судя по вопросу вам стоит прочесть книгу «Delphi 5 Руководство
> разработчика»


Я знаю.

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

Код:


var
 Form1: TForm1;
 setcolor: TColorBox;

implementation

{$R *.dfm}

procedure TForm1.ColorBox1Click(Sender: TObject);
var i: integer;
begin
 for i:=0 to setcolor.Items.Count-1 do
 begin
 memo1.Lines.Add(inttostr(setcolor.Selected));
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i: Integer;
begin
 for i:=0 to strtoint(edit1.Text)-1 do
   begin
   setcolor:= Tcolorbox.Create(Self);
   with setcolor do
   begin
     Left := 10;
     Top := i * 24;
     width:=140;
     height:=100;
     Parent := Form1;
     showhint:= true;
     hint:= "Цвет: "+inttostr(i+1);
     setcolor.OnClick:= colorbox1click;
   end;
   end;
   end;

end.



 
brother ©   (2009-08-11 11:02) [5]

> setcolor:= Tcolorbox.Create(Self);

создавай в FormCreate
и где удаление?
удаляй в FormDestoy


 
Kolan ©   (2009-08-11 11:03) [6]

На вид нормально. Что пишет IDE?

В методе ColorBox1Click лучше используйте Sender, а не глобальную переменную setcolor, тогда вы сможете изменить это имя менее болезненно. А имя надобы изменить, так как у вас получилось, что компонент назван глаголом, а это нехорошо, компонент он — существительное.


 
Kolan ©   (2009-08-11 11:04) [7]


> и где удаление?

Удаление известно где — в TComponent.


 
Плохиш ©   (2009-08-11 11:04) [8]


> Alex_Ford   (11.08.09 10:58) [4]
>
>

И сколько комбобоксов храниться у тебя в твоей переменной setcolor?


 
brother ©   (2009-08-11 11:06) [9]

а понял....


> setcolor: TColorBox;


вообще убрать...

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i:=0 to strtoint(edit1.Text)-1 do
  with Tcolorbox.Create(Self) do
  begin
    Left := 10;
    Top := i * 24;
    width:=140;
    height:=100;
    Parent := Form1;
    showhint:= true;
    hint:= "Цвет: "+inttostr(i+1);
  end;
end;


end.


 
brother ©   (2009-08-11 11:07) [10]

>    Parent := Form1;

лучше
  Parent := Self;


 
Alex_Ford   (2009-08-11 11:08) [11]


> И сколько комбобоксов храниться у тебя в твоей переменной
> setcolor?

for i:=0 to strtoint(edit1.Text)-1 do

Все зависит от того, какое произвольное число введено в поле Edit.


 
brother ©   (2009-08-11 11:10) [12]

> > И сколько комбобоксов храниться у тебя в твоей переменной
>
> > setcolor?
>
> for i:=0 to strtoint(edit1.Text)-1 do
>
> Все зависит от того, какое произвольное число введено в
> поле Edit.

сам понял что сказал?
[9] оно?


 
Alex_Ford   (2009-08-11 11:13) [13]


> В методе ColorBox1Click лучше используйте Sender, а не глобальную
> переменную setcolor, тогда вы сможете изменить это имя менее
> болезненно.

т.е.
1. при создании главной формы setcolor:= Tcolorbox.Create(Self);

2.
> Parent := Self;
Нужно именно на форму? У меня вообще-то панель. Значит получаем parent:= TPanel


 
brother ©   (2009-08-11 11:14) [14]

ты партизан?


 
Alex_Ford   (2009-08-11 11:14) [15]


> [9] оно?


Да. Может ответ на вопрос не коректно задан. Но динамическо комбобоксы я задаю в цикле. Например в поле введено число 10 - создаю десять компонентов. Или опять не так?


 
Плохиш ©   (2009-08-11 11:15) [16]


> Alex_Ford   (11.08.09 11:08) [11]
>
>
> > И сколько комбобоксов храниться у тебя в твоей переменной
> > setcolor?
>
> for i:=0 to strtoint(edit1.Text)-1 do
>
> Все зависит от того, какое произвольное число введено в
> поле Edit.

Я плякаль...

PS. прочитай в справке, сколько ссылок на объекты можно хранить в одной переменной...


 
Alex_Ford   (2009-08-11 11:15) [17]


> ты партизан?

-> Ленин, пионЭр?


 
brother ©   (2009-08-11 11:16) [18]

> Но динамическо комбобоксы я задаю в цикле


>   setcolor:= Tcolorbox.Create(Self);

???
Всеж теорию ООП почитай а?


 
Alex_Ford   (2009-08-11 11:16) [19]

Ребят, башка уже болит от наплыва..... Че так резко то? :(
Лучше бы помогли.


 
Плохиш ©   (2009-08-11 11:17) [20]


> Alex_Ford   (11.08.09 11:14) [15]

А теперь расскажи с каким комбобоксом из твоих 10-ти ты пытаешься работать в этом коде

> procedure TForm1.ColorBox1Click(Sender: TObject);
> var i: integer;
> begin
>  for i:=0 to setcolor.Items.Count-1 do
>  begin
>  memo1.Lines.Add(inttostr(setcolor.Selected));
>  end;
> end;



 
brother ©   (2009-08-11 11:17) [21]

> Лучше бы помогли.

тебе [9] не помогло?


 
Alex_Ford   (2009-08-11 11:18) [22]


> с каким комбобоксом

Не пинайте сильно - опечаточка вышла :-\


 
Плохиш ©   (2009-08-11 11:18) [23]


> Alex_Ford   (11.08.09 11:16) [19]

Зачем оно тебе, это программирование?


 
Плохиш ©   (2009-08-11 11:19) [24]


> Alex_Ford   (11.08.09 11:18) [22]
>
>
> > с каким комбобоксом
>
> Не пинайте сильно - опечаточка вышла

В каком месте?


 
brother ©   (2009-08-11 11:20) [25]

у тебя в голове каша? или одна большая опечатка?


 
Alex_Ford   (2009-08-11 11:20) [26]


> В каком месте?


> Но динамическо комбобоксы я задаю...

Вот здесь


 
Alex_Ford   (2009-08-11 11:21) [27]


> у тебя в голове каша? или одна большая опечатка?

Ну ФСЁ, пашёл треПОТ, вместо помощи.....


 
Плохиш ©   (2009-08-11 11:23) [28]


> Alex_Ford   (11.08.09 11:21) [27]

Т.е. ответа на [20] не будет?


 
brother ©   (2009-08-11 11:24) [29]

> Ну ФСЁ, пашёл треПОТ, вместо помощи.....

ндя... разбирайся:
http://yandex.ru/yandsearch?text=delphi+%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5+%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2+%D0%B2+%D0%BA%D0%B3%D1%82%D0%B5%D1%88%D1%8C%D1%83&clid=46510&stpar2=%2Fh0%2Ftm51%2Fs2&stpar4=%2Fs2


 
MsGuns ©   (2009-08-11 11:50) [30]

При динамическом создании НЕИЗВЕСТНО какого числа компонент надо прежде всего:

- позаботиться о корректном их размещении на визуальных компонентах-контейнерах (TPanel, TGroupBox, TPageControl, etc), используя при их создании св-ва Parent, Top, Left, Heght, Width, Align etc)

- если в коде приложения требуется в произвольном месте обращаться к одному или нескольким таким компонентам, следует создать список TList (TObjectList) либо. если используется некий отображаемый список (например TComboBox), то при добавлении в этот список СИМВОЛЬНОГО ИДЕНТИФИКАТОРА динамически созданного компонента, помещять в список комбобокса ссылку на этот компронент - тогда всегда можно обратиться к "правильному" компоненту, используя i-й элемент TList либо ссылку в TComboBox.Object[TComboBox.ItemIndex].

- при наличии обработчика события (например клика) в коде этого обработчика, обращаясь к свойствам (методам) НЕИЗВЕСТНО какого конкретно компонента использовать переменную Sender, приводя ее при необходимости к нужному типу (классу).

- уничтожать созданные компоненты необязательно - они автоматически уничтожатся их владельцем (в данном случае - форме ибо Self в примере ссылается именно на форму) при разрушении самой формы. Если, конечно, создание компонент не многократное - тогда удалять нужно "ручками" - вот для этого и потребуются ссылки в TList или в ссылках комбобкса.


 
Alex_Ford   (2009-08-11 11:58) [31]

MsGuns спасибо за коментарий. Прочитал интересные моменты.
И можно сделать вывод, что если создаются компоненты динамически, то необходимо их помещать в список, т.е. TList со ссылкой на объект, с помощью которого можно пробежаться в цикле и обраться к i-му элементу (т.е. компоненту). Правильно?


 
MsGuns ©   (2009-08-11 12:09) [32]

Нобязательно. Многие "списочные" компоненты (например имеющие "итемы") умеют хранить ссылки через св-во Object или Data. В этом случае обращаться к динамическим объектам можно через эти ссылки. Однако при уничтожении динамических объектов не следует забывать об обниливании этих ссылок дабы не получать AV при работе приложения.
Также не следует очищать такие списки без предварительного сохранения ссылок на динамические компоненты. Если по ходу алгоритма такая "перезарядка" списка БЕЗ пересоздания компонентов предусмотрена, то предпочтительнее все же TList, а в св-вах Object хранить ту же ссылку, но не использовать индексы (точнее соответствие идекса испика индексу TList ибо при первом же удалении из списка итемов или сортировке это соответствие будет нарушено).


 
MBo ©   (2009-08-11 13:03) [33]

http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=342


 
Alex_Ford   (2009-08-11 14:25) [34]

И все же, опять касательно вопроса.....
С теорией создания компонентов в ран-тайм знаком немного, но есть трудности. Хотелось бы увидеть рабочий (или правильный) фрагмент кода относительно задачи.


 
MsGuns ©   (2009-08-11 14:35) [35]

Ссылку из [33] смотрел ?



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

Форум: "Начинающим";
Текущий архив: 2009.10.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.12 c
15-1249504206
Юрий
2009-08-06 00:30
2009.10.11
С днем рождения ! 6 августа 2009 четверг


15-1249556339
desc
2009-08-06 14:58
2009.10.11
Несовсем понятно чем отличается...


2-1249894959
niel
2009-08-10 13:02
2009.10.11
запись чтение TMemoryStream


3-1227795794
samalex
2008-11-27 17:23
2009.10.11
Как мне узнать хост пк и логин пользователя


2-1249889488
ЛД
2009-08-10 11:31
2009.10.11
DLL





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