К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

TCombobox... и сюрприз...

Гость
0 - 27.01.2012 - 12:35
Lazarus....Linux...

Есть Combobox, созданный в дезигн тайме. Есть СтрингЛист, созданный на лету.
СтрингЛист содержит много записей.

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

Сейчас лазарус (фрипаскаль)... Этот негодяй... при асайне тупо перебирает стринглист и каждый итем записывает в комбо.... А если тупо присваивать, то при присвоении стринглиста к итемсам комбобокса от запускает процедуру SetItems(точное название не помню), которое делает то же самое.

Кто-нить матерился по этому поводу?!

В делфял как-то делал... точно помню.



Гость
1 - 27.01.2012 - 12:38
низачто не поверю что все грузят списки, если такие имеются, - при открытии формы...
Поделитесь опытом... с ламерюгой! :)
Гость
2 - 27.01.2012 - 12:54
for i:=0 to List.Count-1 do
Combo1.Items.Add(List[i]) ;
Не так?
Гость
3 - 27.01.2012 - 13:10
3-NTFS_ >Вот примерно так он и делает...
НО.
Items комбобокса - этож Tstrings... Объект. Я имею тоже объект (TStringList, который без проблем может пеердаться как TStrings).
Почему бы items-ам клмбобокса просто не схавать адрес моего листа, и работать с ним. Зачем грузить один список в другой методом переноса по одному, если можно взять адрес другого и работать с ним.
Не... канешно я понимаю почему запрещено принимать список по адресу... Но можно было бы и оставить такую возможность для извращенцев.
Гость
4 - 27.01.2012 - 13:16
Собственно вопрос... Может все же можно пользоваться уже загруженным TstringListом в компонентах, вместо того чтобы многократно дублировать загрузку при обращении к формам с теми же комбобоксами...?

Хотелось всю тяжесть загрузить при старте программы, а потом просто распихивать ее куда надо... :(
Гость
5 - 27.01.2012 - 13:43
А в Delphi было так же

вот как выглядит
ComboBox1.Items.Assign(ListBox1.Items);


procedure TStrings.AddStrings(Strings: TStrings);
var
I: Integer;
begin
BeginUpdate;
try
for I := 0 to Strings.Count - 1 do
AddObject(Strings[I], Strings.Objects[I]);
finally
EndUpdate;
end;
end;

procedure TStrings.Assign(Source: TPersistent);
begin
if Source is TStrings then
begin
BeginUpdate;
try
Clear;
FDefined := TStrings(Source).FDefined;
FNameValueSeparator := TStrings(Source).FNameValueSeparator;
FQuoteChar := TStrings(Source).FQuoteChar;
FDelimiter := TStrings(Source).FDelimiter;
FLineBreak := TStrings(Source).FLineBreak;
FStrictDelimiter := TStrings(Source).FStrictDelimiter;
AddStrings(TStrings(Source));
finally
EndUpdate;
end;
Exit;
end;
inherited Assign(Source);
end;
Гость
6 - 27.01.2012 - 14:55
я может не понял верно. но тебе нужен virtual mode. смысл в том, что всегда создано итемов не более, чем вмещается в размеры контрола +/- одна страница вверх/вниз. таким образом у вас будут загруженные данные один раз (или подгружаться пачками) и контрол будет отображать только требуемое, контроль получится быстрый и не жрущий память. не писал никогда на делфи, погугли, думаю есть реализации сего лисапеда.

нормальные посоны, простимулированные хорошей зп, грузят данные по чуть-чуть вне потока создавшего гуи, из энтого потока уведомляют гуи, если данные подгрузились/ошибках, гуи рефрешится. кроме того применяют mvvm.

но если зп маленькая, то посоны грузят данные прямо в форме при открытии, целыми сотняме мегобайт.
Гость
7 - 27.01.2012 - 15:12
6-TVV1 > Мда, действительно. Код 1:1. Что-то значит я напутал. Неудивительно.., это было в студенческие годы. Но все это время думал что есть возможность асайн этого списка реализовать на уровне указателей... :(

7-Конь в сандалях > Про потоки... Просто есть ситуации когда работа с контролами (значениями в них) происходит прям в конструкторе. Чтобы поток подобрал контрол для загрузки, его (поток) надо запускать как минимум в конструкторе формы... ну и понту мне от этого, когда мне все равно придется ждать пока данные зальются в другом потоке, а только потом продолжать работать. :))
Значит подход у меня кривой, раз столько нестыковок.
Буду медитировать :))
Про virtual mode надобно почитать...
Гость
8 - 27.01.2012 - 18:42
8 и какой нибудь гавна-паттерн типа mvvm, mvp почитай, только чтобы он гладенько ложился на то, что тебе иструмэнты предлогают. для делыи видимо mvp подойдет. потом поймешь куда и создание потока втулить, кто кого должен уведомить и т. п..
Гость
9 - 28.01.2012 - 17:08
9-Конь в сандалях > Почитал про паттерны. Полезная инфа. Спасибо. Можно сказать что сейчас я юзаю паттерн mvp, ибо в модулях форм у меня прописана именно та логика которая необходима для настройки отображения результов работы ядра программы, в который вшита вся бизнес логика, а так же запуска методов классов которые и дают сигнал к формарованию этих результатов. Но прикол в том что, ту операцию (со списками) необходимо производить именно на уровне View, ибо результат ее - заполнение контрола лежащего на форме. Никакого отношения к бизнес логике эта операция не имеет, только отображение. К тому же, создав в потоке список, и заполнив его я не смогу его передать контролу... тут [*****] - писал выше. А в потоке... Поток должен работать именно с тем контролом который есть на форме, т.е. с ним работать я могу только лишь в конструкторе формы (самая ранняя точка доступа к компоненту). но тут как бэ.. без разницы будет в основном потоке я список гружу или в параллельном :).

Вобщем... пока я это отложил. Буду потом разбираться, там поглядим, может наследника сделаю, а может другой компонент прикручу, который для этого больше подходит, что скорее всего и произойдет. :) Спасибо за советы.

Прикольно когда есть с кем посоветоваться :)
Гость
10 - 28.01.2012 - 17:11
слово о_б_л_о_м фильтруется... забавно.
Гость
11 - 04.03.2015 - 04:16
Ну что сказать...


К списку вопросов






Copyright ©, Все права защищены