Чего Вы привязались к прогрессбару, это никак не связано с потоками, я просто уточнял, нужно ли обращаться к форме, созданной в потоке через синхронизацию.
Прочитайте посты выше, вроде как уже больше недели это обсуждаем.
У вас очень странное представление о UI. Вы правда считаете, что я демонстрирую пользователю одновременно Сплэш, две формы, и повергающий его в экстаз прогрессбар??
научили конечно ))) все придумано до нас
вот статья
вот так в грубом приближении должно это быть
p.s. Забыл удалить из ваших форм эти циклы, которых там быть не должно
Форма - это интерфейс взаимодействия с пользователем. Данные должны жить отдельно.
test10.3.zip
Всем привет!
После долгого творческого запоя я запилил альфу либы, которая позволяет юзать обычный, не-генномодифицированный ListView.
Данные подаются в виде модели данных, описание раскладки итема лежит в JSON.
Для работы пишется примитивный наследник класса-адаптера, который биндит данные модели на элементы из JSON. Я решил, что руками делать это дешевле чем через RTTI
{ TMyAdapter }
procedure TMyAdapter.SetupDrawableContent(const ADrawable: TListItemDrawable;
const AData: TMyData);
begin
if SameText( ADrawable.Name, 'text') then
begin
(ADrawable as TListItemText).Text := AData.Text;
end
else if SameText( ADrawable.Name, 'detail') then
begin
(ADrawable as TListItemText).Text := AData.Detail;
end
else if SameText( ADrawable.Name, 'balance') then
begin
(ADrawable as TListItemText).Text := FormatFloat('0.00', AData.Balance);
end
else if SameText( ADrawable.Name, 'reserved') then
begin
(ADrawable as TListItemText).Text := FormatFloat('0.00', AData.Reserved);
end
end;
Главная хитрость и отличие от стандартного DynamicAppearance+LiveBinding - переменная высота итемов ListView и использование арифметики в описании раскладки.
Можно указать Detail.Y = Text.Bottom + 5, ItemHeight = Detail.Bottom + 10, Detail.W = ItemWidth/2 - X
{"Kind":"rect","Name":"BonusRect","Value":"",
"Place":{"X":"itemwidth*3/4","Y":"Text.Y","W":"ItemWidth/4-5","H":"50"},
"BorderColor":"#FF005500", "Color":"lime",
"LineWidth":3},
{"TextHAlign":2,"TextVAlign":1,"Kind":"text","Name":"Balance","Value":"",
"Place":{"X":"BonusRect.x+5","Y":"Text.Y","W":"BonusRect.w-10","H":"50"},
"WordWrap":true,
"Color" :"Black",
"Font":{"Size":18,"Style":""}}
],
"ItemHeight":"detail.bottom+10",
Это дает довольно гибкую систему. Не на все случаи жизни, но все, что нужно, можно после автоматической раскладки дополнительно приписать в OnUpdateObjects
Код для работы примерно такой
procedure TForm1.FormCreate(Sender: TObject);
begin
data:= TMyDataList.CreateFromFile(ExePath()+'data.json'); // загрузка в модель данных
Adapter := TMyAdapter.Create(lvWallets, data.Items, ExePath()+'pattern.json'); // создание адаптера и загрузка шаблона
Adapter.Pattern.SetupListView(lvWallets); // задать отступы и разную мелочь
Adapter.ResetView(); // здесь в цикле из модели данных создается нужное количество итемов ListView
end;
procedure TForm1.lvWalletsUpdatingObjects(const Sender: TObject;
const AItem: TListViewItem; var AHandled: Boolean);
begin
Adapter.SetupContent(AItem); // загрузить текст, картинки и другое содержимое в элементы итема
Adapter.Pattern.DoLayout(AItem); // поправить раскладку в соответствии с содержимым элементов итема
end;
Для использования кроме стандартных - текст, картинка, кнопка - создано несколько дополнительных элементов итема - прямоугольник, круг, уголок, линия.
Отличие от ModernLV - ,
1) все происходит без правки системных файлов
2) пока нет колонок и других особых изысков.
На результат работы смотреть тут. Исходники пока не причесаны, будут чуть позже
UPD.
ссылки на репозитории ниже