Текущий архив: 2009.10.11;
Скачать: CL | DM;
Вниз
Обработчик 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;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.006 c