Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2011, 21:43   #1
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
Стрелка Как правильно задать цикл?

Доброго вечера!

В общем столкнулся с такой бедой.

Есть компонент FrameBar. Запускаем программу. Поскольку изначально (программно) не заданно количество Items во FrameBar они создаются в процессе загрузки данных. Т.е. программа FormCreate -> Обращается к файлу INI (в нем указанно количество необходимых Items) -> Программа создает Items во FrameBare (FrameBar.Items.Insert(i)). Ок. А теперь нажимаем на любой Items на FrameBar'e, происходит событие OnCreateFrame, которое программно ссылается на общую процедуру CreateFrame. Все замечательно работает но вот проблема: Items'ы идут в последовательности от 0 и до Items.Count. Процедуру для события OnCreateFrame я написал одну общую для всех Items, поскольку при нажатии на любой из Items он ссылается на одинаковые файлы с данными, в которых в свою очередь уже как раз различные данные для каждого Items в виде массива.
В чем собственно проблема: когда программа выполняет общую процедуру CreateFrame, то загружает данные по Index'у последнего Items во FrameBar'e. Я так понял, это происходит потому, что в процедуре указан цикл, который пробегает по всему списку Items и соответственно до последнего Items. Отсюда логично, что он всегда будет загружать в любой Items данные последнего Items.

Подскажите как быть.

Спасибо.
BingoBongo вне форума Ответить с цитированием
Старый 06.05.2011, 12:59   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

ну а код-то где& без кода тяжко помогать... из описания я вроде как понял, что не совсем правильно передается то, с чем собрались работать... ну а передать по ссылке ? procedure someproc(var anitem : Tsomeitem) и работать с ней внутри процедуры, ну а посылать типа так цикл->someproc(items[i]);
phomm вне форума Ответить с цитированием
Старый 06.05.2011, 14:09   #3
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
ну а код-то где& без кода тяжко помогать... из описания я вроде как понял, что не совсем правильно передается то, с чем собрались работать... ну а передать по ссылке ? procedure someproc(var anitem : Tsomeitem) и работать с ней внутри процедуры, ну а посылать типа так цикл->someproc(items[i]);
Цитата:
procedure TMainForm.SCreateFrameBar(Sender: TObject;
var Frame: TCustomFrame);
begin
NSt := 'A';
iMax := 7;
LoadFrame(SerialNumber(0), Frame);
MFr.MFr_IBanner.Picture.Assign(png_ banner);
LoadPresentation('A1m');
LoadInPicShow;
png_banner.Free;
end;
Красный нолик - это и есть Items во FrameBar'e. Так вот. Я использовал простой цикл for для указания, что это может быть одно из значений от 0 до FrameBar.Items.Count. Это значение должно меняться в зависимости от номера Items на который нажали (который создается OnCreateFrame). В итоге программа выдает лишь данные последнего Items (он же Count).

SerialNumber - это функция из dll которая выдает строковое значение.

Последний раз редактировалось BingoBongo; 06.05.2011 в 14:12.
BingoBongo вне форума Ответить с цитированием
Старый 06.05.2011, 21:38   #4
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

Голова кипит. Кто-нибудь знает как в данной ситуации задать цикл или другой вариант, что бы получить требуемый результат??
Я прям в шоке прям от себя! (
BingoBongo вне форума Ответить с цитированием
Старый 06.05.2011, 22:45   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

phomm абсолютно прав.
без кода тут не разобраться!
давайте небольшой тестовый проект (исходник).
тогда легче будет что-то подсказать.

Пока я понимаю так - у Вас вопрос, как в процедуре, которая назначена на все Items различить, на каком конкретно Items она вызвана?
Дык если это событийная процедура (срабатывает на event), так там есть параметер (Sender : TObject) - вот этот Sender и есть нужный Вам items[i]

ну, либо задействуйте при создании поле Items[i].tag := i;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.05.2011, 22:59   #6
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
phomm абсолютно прав.
без кода тут не разобраться!
давайте небольшой тестовый проект (исходник).
тогда легче будет что-то подсказать.

Пока я понимаю так - у Вас вопрос, как в процедуре, которая назначена на все Items различить, на каком конкретно Items она вызвана?
Дык если это событийная процедура (срабатывает на event), так там есть параметер (Sender : TObject) - вот этот Sender и есть нужный Вам items[i]

ну, либо задействуйте при создании поле Items[i].tag := i;
Совершенно верно понимаете)
А как в моем случае обработать с помощью Sender?

Цитата:
procedure TMainForm.SCreateFrameBar(Sender: TObject;
var Frame: TCustomFrame);
begin
LoadFrame(Items[i], Frame);
end;
вот эта моя несчастная общая процедура. я там items[i] вписал, разумеется я понимаю что так нельзя, это я для ясности, где определяется номер Items. Как туда Sender впендюрить ???
BingoBongo вне форума Ответить с цитированием
Старый 06.05.2011, 23:20   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Мы продолжаем играть в угадайку, а Вы продолжаете играть в партизана... Где код?!

Ладно, будем решать задачу кусочками...

дайте описание процедуры/метода LoadFrame
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.05.2011, 23:25   #8
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Цитата:
А как в моем случае обработать с помощью Sender?
Трудно сказать как в Вашем случае, но обычно это выглядит както так:

Код:
if Sender = Button1 then ...
Вообще в теме говорится постоянно про какойто цикл, но никакого цикла я тут нигде не вижу. Даже непонятно какой цикл имено используют (for, while и пр.)
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 06.05.2011, 23:27   #9
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Мы продолжаем играть в угадайку, а Вы продолжаете играть в партизана... Где код?!

Ладно, будем решать задачу кусочками...

дайте описание процедуры/метода LoadFrame
оу. нет, я не играл вовсе) просто мне показалось вы уже поняли в чем беда, вот и решил, че флудить кодами по чем зря)

только он оооочень big

Цитата:
procedure LoadFrame(BName: String; var z: TCustomFrame);
var
IniFile: TIniFile;
LogName: String;
ActStp, ActIndex, DestAct, DestHouse, DestGeneral,
AddCount, AddStp, TlpStp, TlpCount, TlpIStp, TlpIndex,
EmailCount, EmailStp, DestEmail, DestWeb, WebCount,
WebStp: Integer;
sWL: TsWebLabel;
IIconAct, IIConAdd, IIconGeneral: TImage;
MasPhone: array [0..2] of String;
begin
AddCount := 0;
ActIndex := -1;
DestAct := 402;
DestHouse := 8;
DestGeneral := 28;
DestEmail := 0;
EmailCount := 0;
DestWeb := 0;
WebCount := 0;
TlpIndex := 0;
TlpCount := 0;

MFr := TMFr.Create(nil);
z := MFr;
InIFile := TIniFile.Create('D:\Photos\fp_com.i ni');
LogName := IniFile.ReadString('COMPANY_' + BName, 'LOGO', LogName);
AddCount := IniFile.ReadInteger('COMPANY_' + BName, 'ADDCOUNT', AddCount);

png_banner := TPNGObject.Create;
png_free := TPNGObject.Create;
png_banner.LoadFromResourceName(HIn stance, LogName);

for ActStp := 0 to 5 do
begin
ActIndex := IniFile.ReadInteger('COMPANY_' + BName, 'ACTIVITY' +
IntToStr(ActStp), ActIndex);
if ActIndex > -1 then
begin
sWL := TsWebLabel.Create(MFr);
with sWL do
begin
Parent := MFr;
UseSkinColor := False;
Left := 52;
Top := DestAct;
Font.Name := 'Verdana';
Font.Color := clSilver;
HoverFont.Name := 'Verdana';
HoverFont.Color := clWhite;
HoverFont.Style := [fsUnderLine];
Caption := ExpAct(ActIndex); //function
end;
IIconAct := TImage.Create(MFr);
with IIconAct do
begin
Parent := MFr;
Width := 16;
Height := 16;
Left := 28;
Top := DestAct;
Transparent := True;
png_free.LoadFromResourceName(HInst ance, 'bullet_black');
Picture.Assign(png_free);
end;
DestAct := DestAct + 16;
ActIndex := -1;
end;
end;

........
ВЕСЬ КОД НЕ ВЛЕЗ, НО Я УВЕРЯЮ, ВСЯ ЭТА ПРОЦЕДУРА ВАМ НИ КАК НЕ НУЖНА. САМОЕ ГЛАВНОЕ В НЕЙ, ЭТО BNAME - КОТОРОМУ СОБСТВЕННО И ПРИСВАИВАЕТСЯ ЗНАЧЕНИЕ ЧЕРЕЗ SerialNumber(А ТУТ Я КАК РАЗ И ПЫТАЮСЬ ВЫЧИСЛИТЬ Items.(().

end;
и да, на грамматику кода не обращайте внимание, я уже привык с начала нашпилить, а потом коректю ) такой уж я)
BingoBongo вне форума Ответить с цитированием
Старый 06.05.2011, 23:34   #10
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Valio Посмотреть сообщение
Трудно сказать как в Вашем случае, но обычно это выглядит както так:

Код:
if Sender = Button1 then ...
Вообще в теме говорится постоянно про какойто цикл, но никакого цикла я тут нигде не вижу. Даже непонятно какой цикл имено используют (for, while и пр.)
в таком виде Sender я умею использовать. меня интересует все-таки мой конкретный случай.

цикл for (я пробовал).

в прочем, я же вам говорю что начинка процедуры LoadFrame в себе как таковой сути не несет.

LoadFrame(Str: String; F: TCustomFrame);

так вот. чтобы опередить Str - я использую из библиотеки dll некую условную базу

dll
case SN of
0: Result := '0000001';
1: Result := '0000002';
2: Result := '0000003';
...
end;

а уже в приложении присваиваю Str (который в LoadFrame) номер требуемого значения, за счет ЭТОГО САМОГО Items во FrameBar'e

SerialNumber(Items[i])

в итоге имеем

LoadFrame(SerialNumber(Items[i]), Frame);

но проблема в том, что при использовании цикла, процедура прогоняет весь цикл и загружает мне последнее значение из dll.
BingoBongo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу разобраться как правильно оформить цикл NICmito Общие вопросы C/C++ 6 17.12.2009 18:01
Как правильно задать размер TextBox-a? Diego__ Microsoft Office Word 3 02.09.2009 11:27
Как правильно построить цикл для выборки? Tanuska___:) БД в Delphi 1 12.01.2009 14:50
Задать цикл Dagir БД в Delphi 1 01.09.2008 11:08