Форум: "Начинающим";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
ВнизПривязка переменной к объекту. Найти похожие ветки
← →
Скарамуш © (2007-07-08 11:42) [0]Уважаемые мастера! Прошу Вас помочь мне в одной небольшой, но очень даже неразрешимой для меня проблеме.
Требуется одной и той же переменной (скажем I) придавать различные значения в зависимости от того, на какую картинку (Image) кликаем, причём сохранять изменения в привязке к картинке.
Пример: Скажем, для Image1, значение I=10, по Image2 - значение I=20, при определённом процессе (скажем, нажатии на кнопку), значение для I в привязке к Image1 должно стать 5 и сохраниться таким для последующих операций, т.е. при щелчке по Image1 I должна становиться уже не 10, а 5.
При этом нужно учитывать, что Имэйджек может быть очень много и заводить для каждой отдельную переменную, для сохранения значения I очень проблематично.
Заранее благодарю Вас за участие.
← →
Virgo_Style © (2007-07-08 12:06) [1]TImage.Tag ?
← →
Скарамуш © (2007-07-10 01:13) [2]Да, хорошо бы, но если переменных надо много? И не только числовых?
А их надо много.
Всё же спасибо. Но нельзя ли как-нибудь ещё?
← →
Германн © (2007-07-10 01:34) [3]
> Скарамуш © (10.07.07 01:13) [2]
>
> Да, хорошо бы, но если переменных надо много? И не только
> числовых?
> А их надо много.
>
Указатель по размеру ничем не отличается от Integer. Поэтому в Tag можно сохранять указатель на некую структуру содержащую сколько угодно данных.
← →
Джо © (2007-07-10 03:36) [4]> [0] Скарамуш © (08.07.07 11:42)
> При этом нужно учитывать, что Имэйджек может быть очень
> много и заводить для каждой отдельную переменную, для сохранения
> значения I очень проблематично.
> Заранее благодарю Вас за участие.
Никто не мешает завести массив, индекс в котором будет соответствовать номерам экземпляров TImage.
Также никто не мешает (а даже советовали в этой ветке) использовать свойство Tag у самого компонента TImage.
← →
{RASkov} © (2007-07-10 09:06) [5]Примеры к [3,4]:
Можно такую вот "штуку" создатьType TImageData = record
Name: String; //Например название картинки
Value: Integer; //ее значение
end;
TImageDatas = array [0..<Кол-во Имагесов>] of TImageData
И В свойстве Tag Имэйджа хранить индекс массива.... можно хранить и указатель на структуру PImageData = ^TImageData (сложнее)...
Или так:Type TImageData = record
Image: TImage; //Сама картинка
Name: String; //название картинки
Value: Integer; //значение
end;
TImageDatas = array [0..<Кол-во Имагесов>] of TImageData;
Т.е. и сами имиджи хранить в массиве.....
Например картинок (TImage) 10 штук.type TImData = record
ImName: String;
ImVal: Integer;
end;
const ImData: array [0..9] of TImData = ((ImName: "First"; ImVal:2), (ImName:"Вторая"; ImVal:15),....);
var Ims: TImageDatas;
...........
Setlength(Ims, 10);
for N:=0 to 9 do begin
Ims[N].Image:=TImage.Create(self)
with Ims[N].Image do begin
Задаем параметры Имэйджам (Picture, left, Top, Width,...)
end;
Ims[N].Name:=ImData[N].ImName;
Ims[N].Value=ImData[N].ImVal;
end;
Ну и в этом духе.... Можно еще кучу способов придумать...
← →
tesseract © (2007-07-10 10:24) [6]
> Также никто не мешает (а даже советовали в этой ветке) использовать
> свойство Tag у самого компонента TImage.
Также никто не мешает относледовать TCustomImage и добавить в потомок всё, что приспичит.
← →
Скарамуш © (2007-07-10 11:49) [7]Эх... Спасибо огромное, но так я видимо плохо объяснил, что мне нужно, что никто не понял...
Меня интересует именно привязка переменной к объекту или другой переменной, а картинки - это частный случай, который используется у меня, как одно из звеньев цепочки.
Прошу простить великодушно, что излагаю так плохо, просто всегда с этим делом туго было...
Так вот - нельзя ли сделать так, чтобы получилось вроде а от b? Ну, в матанализе помню было же что-то вроде того a(b)? Правда, надо признаться, я всегда плохл посещал матанализ...
А вот ещё можно примерчик подробный насчёт
> Type TImageData = record
> Name: String; //Например название картинки
> Value: Integer; //ее значение
> end;
> TImageDatas = array [0..<Кол-во Имагесов>] of TImageData
Ибо не зря я вопрос задал в конференции "Начинающим", вроде вот что-то типа того, а не догоняю, как потом использовать?... Не серчайте...
← →
iXT © (2007-07-10 11:57) [8]> [7] Скарамуш © (10.07.07 11:49)
Тебе предложили указатель хранить в свойстве Tag
Можешь создать свой класс унаследованный от TImage (или чего там надо) и включить в него новое свойство!
← →
ЮЮ © (2007-07-10 12:12) [9]> При этом нужно учитывать, что Имэйджек может быть очень
> много и заводить для каждой отдельную переменную, для сохранения
> значения I очень проблематично.
Для этого есть массивы/списки:
1) два массива/списка одной длины и "связка" по индексу
2) двумерный массив, "связанные" эдементы в одной строке
3)
type
TRef = record
First: <тип>;
Second: <тип>;
end;
"связанные" объекты хранятся в одном record-е
множество связей в массиве
TRefDynArray = array of TRef;
или создавать динамически и помещать в список
← →
Плохиш © (2007-07-10 12:15) [10]
> Привязка переменной к объекту. [D7, XP]
>
> Скарамуш © (08.07.07 11:42)
Ненадо привязывать переменные к объекту, надо создать свой объект, который хранит всё что ему надо в себе...
← →
{RASkov} © (2007-07-10 12:47) [11]> [7] Скарамуш © (10.07.07 11:49)
> А вот ещё можно примерчик подробный насчёт
>
> > Type TImageData = record
> > Name: String; //Например название картинки
> > Value: Integer; //ее значение
> > end;
> > TImageDatas = array [0..<Кол-во Имагесов>] of TImageData
Ты лучше не этот пример смотри, а
> Или так:
> Type TImageData = record
> Image: TImage; //Сама картинка
> Name: String; //название картинки
> Value: Integer; //значение
> end;
> TImageDatas = array [0..<Кол-во Имагесов>] of TImageData;
>
> Т.е. и сами имиджи хранить в массиве.....
И что ты имеешь ввиду:
> А вот ещё можно примерчик подробный насчёт
В [5] все вроде подробно.... Или тебе про массивы рассказать или про записи или вообще все?
Что конкретно не понятно? Так же уже посоветовали свои классы создавать со своими полями(переменными, данными)....
← →
Скарамуш © (2007-07-10 12:52) [12]Да, да, я уже понял, что дурак я и всё такое... Но просто рабочий пример с использованием Ваших предложений можно? Чтобы я посмотрел и разобрал от а до я, а то ведь непонятно так, снизойдите пожалуйста.
Я уже понял, что надо с type-ом работать, а как потом использовать это дело? Я подобным образом никогда не делал и мне просто так не допереть...
Всем ОГРОМНОЕ спасибо!
← →
Плохиш © (2007-07-10 12:55) [13]Не, я пасс, книжку "делфи за 21 секунду для чайников" сюда перепечатывать...
← →
{RASkov} © (2007-07-10 12:57) [14]> [12] Скарамуш © (10.07.07 12:52)
Ты прикалываешься? :)
Все что ниже
> > Или так:
в [5] посте это и есть подробный пример :)
Замени в [0..<Кол-во Имагесов>] выражение <Кол-во Имагесов> на 9 и используй :) ну еще параметры имиджей выставь или это тоже сложно для тебя и требует объяснения? Тогда книжки.... F1 тоже весчь...)
← →
Скарамуш © (2007-07-10 13:04) [15]Да нет, Это я всё сделал, я просто пример просил... Чтобы мозги не грузить.
Ладно, не сердитесь, постараюсь сам разобраться. Ещё раз всем спасибо.
← →
{RASkov} © (2007-07-10 13:15) [16]> [15] Скарамуш © (10.07.07 13:04)
> Ладно, не сердитесь
А что нам сердиться? Лично мне до лампочки :)
> постараюсь сам разобраться
проблемы? У тебя одна проблема - не можешь спросить, что у тебя конкретно не получается....
← →
Скарамуш © (2007-07-10 15:03) [17]Так оно и не получается! Ладно, вот уж точнее не скажешь - у нас есть 48 картинок. Все разные.
При щелчке на картинку Im1, мы заносим её в отдельную переменную Hds:TImage; следует щелчёк по другой картинке Im2, она придаётся переменной Hdm:TImage.
Далее следует процедура Prov, проверяющая значение искомой I относительно Hds и Hdm (это упрощённо, там много чего проверяет, но суть одна и алгоритм общий). Если у Hdm значение I выше, то из I(Hds) вычитаем I(Hdm) (а также ещё ШЕСТЬ значений, поэтому Tag и не годится, к сожалению...).
Вот. Далее, при щелчке на Im1 когда-нибудь в следующий раз, значение I(и остальных параметров) должно быть тем, которое мы получили в результате процедуры Prov.
Вот и всё собственно, яснее некуда.
Может чего неграмотно написал, прошу прощения.
Надеюсь, теперь ясно.
← →
Плохиш © (2007-07-10 15:17) [18]
> Надеюсь, теперь ясно.
Ничего не понял, ну и ладно, не мои проблемы...
← →
{RASkov} © (2007-07-10 19:20) [19]> [18] Плохиш © (10.07.07 15:17)
:) такая же фигня...
> [17] Скарамуш © (10.07.07 15:03)
:(
hds=5 номера картинок...
hdm=7 из массива
Из [5] поста:if Ims[hdm].Val>Ims[hds] then Ims[hds].Val:=Ims[hds].Val-Ims[hdm].Val;
Добавлю немного в пример из [5]:
в описании формы добавить метод:private
procedure ImClick(Sender: TObject); Обработчик для имиджей
....
.........
//Создание имиджей и наполнение данных массиваfor N:=0 to 47 do begin
Ims[N].Image := TImage.Create(self)
with Ims[N].Image do begin
Задаем параметры Имэйджам (Picture, left, Top, Width,...)
Tag := N; // Здесь будет храниться индекс картинки и данных в массиве....
OnClick := ImClick; //Присваеваем обработчик
end;
.....
end;
.......
procedure ImClick(Sender: TImages);
begin
// (Sender as TComponent).Tag <-Здесь индекс из массива
end;
Этот вариант, помоему, самый простой для тебя, нежели создавать новые классы(компоненты) или работа с указателями...
Все.... больше отвечать тебе не буду :) Если нормально не будешь спрашивать.... [17] - я не осилил в плане "нормального" понимания :(
← →
Скарамуш © (2007-07-10 19:31) [20]Спасибо, получилось всё. Уррраа!!!А, кстати. Самое-то главное, что я всё хотел сказать - IMAGE-ы уже есть, их Creat-ить не нужно было. Вот.
Всем спасибо. В следующий раз постараюсь чётче выражать свои мысли.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.042 c