-
Постов
159 -
Зарегистрирован
-
Посещение
-
Победитель дней
6
Активность репутации
-
Axbor получил реакцию от pill в Собственный TListBoxItem на C++
Очень не хватает примеров на C++. Решил поделится опытом.
Рассмотрим создание собственного "ListBoxItem"а на C++.
И так начнем.
Для начало создадим стиль для нашего "ListItem"а. В моем случае оно выглядит так:
Структура выглядеть следующим образом:
А вы сразу можете создать собственный стиль.
Создадим класс для нашего "Item"а. Я назвал его TMyListBoxItem.
Нужно знать следующие вещи:
ApplyStyle() вызывается когда стиль загружен.
FreeStyle() когда стиль выгружен.
GetDefaultStyleLookupName() когда стиль не задано берется названые стиля по умолчанию.
FindStyleResource("стиль") ищет в стиле ресурс с заданным названием.
ListBox автоматически очищает из невидимых "Item"ов стиль что бы избежать от расходы на память. И заново загружает когда оно видимо. При этом вызывается соответствующие функции приведенные выше
я приведу только некоторые кусочки кода. Остальное всё можете посмотреть в прикреплённых файлах.
class TMyListBoxItem : public TListBoxItem { private: // Переменные для хранения данных System::UnicodeString FTimeTo; System::UnicodeString FTimeFrom; //.... // Визуальные компоненты TText* FTextTimeTo; TText* FTextTimeFrom; //... // Функции для присваивания данных, это нужно при написании "properties" void __fastcall SetTimeTo(const System::UnicodeString Value); void __fastcall SetTimeFrom(const System::UnicodeString Value); protected: void __fastcall ApplyStyle(); void __fastcall FreeStyle(); System::UnicodeString __fastcall GetDefaultStyleLookupName(); virtual void UpdateStyleData(); __published: __property System::UnicodeString TimeTo = {read=FTimeTo, write=SetTimeTo}; __property System::UnicodeString TimeFrom = {read=FTimeFrom, write=SetTimeFrom}; public: __fastcall TMyListBoxItem(System::Classes::TComponent* AOwner); }; Теперь напишем сами функции.
void __fastcall TMyListBoxItem::ApplyStyle() { // Вызов метода предка TListBoxItem::ApplyStyle(); TFmxObject *StyleObject; // Поиск ресурса из стиля. Посмотрите в скрине, там есть ресурс с названием "timeto" типа TText StyleObject = FindStyleResource("timeto"); // dynamic_cast нужен для корректного преобразования типов. Если тип найденного ресурса не является TText то указателю будет присвоен NULL FTextTimeTo = dynamic_cast<TText*>(StyleObject); StyleObject = FindStyleResource("timefrom"); FTextTimeFrom = dynamic_cast<TText*>(StyleObject); UpdateStyleData(); } void __fastcall TMyListBoxItem::FreeStyle() { // Стиль выгружен из памяти. Нужно очистить указатели что бы избежать ошибок FTextTimeTo = NULL; FTextTimeFrom = NULL; TListBoxItem::FreeStyle(); } System::UnicodeString __fastcall TMyListBoxItem::GetDefaultStyleLookupName() { // название стиля для нашего "Item"а по умолчанию return "mylistboxitemstyle"; } void TMyListBoxItem::UpdateStyleData() { if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; if(FTextTimeFrom) FTextTimeFrom->Text = FTimeFrom; } void __fastcall TMyListBoxItem::SetTimeTo(const System::UnicodeString Value) { FTimeTo = Value; if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; } Вот и всё. Остается только добавит в наш проект ListBox и button для проверки.
Вот функция создания нашего "Item"а:
void __fastcall TForm1::Button1Click(TObject *Sender) { TMyListBoxItem *Item = new TMyListBoxItem(this); Item->Parent = ListBox1; Item->StyleLookup = "customstyle1"; Item->TimeFrom = "11:20"; Item->TimeTo = "12:50"; } Скриншот программы:
В архиве мой класс и стиль. Для корректного отображения некоторых символов нужен fontcustom
Какие вопросы задавайте. Отдельное спасибо Ярославу за мануал на дельфи:
http://blogs.embarcadero.com/yaroslavbrovin/2012/10/15/listboxitem_styling_part2/
Администраторы и модераторы, прошу подкорректировать если что то неправильно.
ListBoxItem.zip
-
Axbor отреагировална Равиль Зарипов (ZuBy) в [TidHTTP] Почему IdHttp1.Get может выдавать 404 ошибку, файл не найден?
function idHttpGet(const aURL: string): string; // uses System.Net.HttpClient, System.Net.HttpClientComponent, System.Net.URLClient; var Resp: TStringStream; Return: IHTTPResponse; begin Result := ''; with TNetHTTPClient.Create(nil) do begin Resp := TStringStream.Create('', TEncoding.ANSI); Return := Get( { TURI.URLEncode } (aURL), Resp); Result := Resp.DataString; Resp.Free; Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(idHttpGet('http://airnav.tj/ru/online/utdd')); end; Держи
-
Axbor отреагировална Равиль Зарипов (ZuBy) в Динамическая подгрузка картинок в ListView
Привет Всем!
Как принято в современных приложениях, догружать контент(обычно это картинки) при скролинге.
я взял картинки пользователей этого форума
Seattle LVdynamicLoadBitmap.zip
Berlin LVdynamicLoadBitmap(Berlin).zip
-
Axbor получил реакцию от FireMy в Прочитать item'ы из listView
for(int i = 0; i < ListView1->Items->Count; i ++) { Memo1->Lines->Add(ListView1->Items->AppearanceItem[i]->Text); } -
Axbor отреагировална Равиль Зарипов (ZuBy) в TListViewHorz
Давно не хватало TListView в горизонтальной ориентации, например чтобы сделать вот такую картинку
zairkz сделал стиль с применением 9-patch png "технологии"
С помощью жестов показано как сделать "сквозной скрол"
как писал dreamix
P.S. по компоненту TListViewHorz, не успел все протестить как следует со всеми параметрами
не правильно будет отображаться Header'ы и Поиск, основной функционал сохранен
UPDATE: LVStyledhorz.7z
-
Axbor получил реакцию от Kitty в SQLite Mac OS, Кодировка
Незнаю как на делфи. Но на с++ такая:
Query->ParamByName('Title')->AsString = L"Заголовок";
-
Axbor получил реакцию от Равиль Зарипов (ZuBy) в С помощью какого компонента проще всего реализовать Rating Bar?
Можно использовать шрифт с звёздочкой и полузвездочкой потом написать несколько строчек кода. Звёздочки можно найти в шрифте FontAwesome.ttf. Думаю это не так уж и сложно...
-
Axbor отреагировална GASCHE в Какие статьи вы хотели бы видеть в блогах?
OC: Android. Многопоточные приложения, синхронизация потоков, создание потоконезависимых компонентов.
-
Axbor отреагировална #WAMACO в Какие статьи вы хотели бы видеть в блогах?
Обновление базы данных в фоновом режиме.
Есть сеть - обновляем БД! Нет, работаем в оффлайн режиме!
ОС: iOS, Android
-
Axbor получил реакцию от zairkz в Загрузка файлов из интернета
void __fastcall TForm1::Button1Click(TObject *Sender) { TThread::Synchronize(TThread::CurrentThread, getFile); } void TForm1::getFile() { TMemoryStream *MS = new TMemoryStream; IdHTTP1->Get("YOUR URL", MS); MS->SaveToFile("*.*"); delete MS; } -
Axbor получил реакцию от Kitty в Загрузка файлов из интернета
void __fastcall TForm1::Button1Click(TObject *Sender) { TThread::Synchronize(TThread::CurrentThread, getFile); } void TForm1::getFile() { TMemoryStream *MS = new TMemoryStream; IdHTTP1->Get("YOUR URL", MS); MS->SaveToFile("*.*"); delete MS; } -
Axbor получил реакцию от Kitty в Загрузка файлов из интернета
Stream:=TMemoryStream.Create; IdHTTP1.Get('http://devdelphi.ru/files/VK_APImodul.rar',Stream); Stream.SaveToFile('C:\1.rar'); Stream.Free; Что бы программа не завис при загрузки файла, нужно использовать поток.
-
Axbor получил реакцию от Равиль Зарипов (ZuBy) в Почему не возможно искать с ключевым словом из трех букв?
В нашем форуме можно добавлять теги из трех букв но искать теги из трех букв невозможно. Например я хочу искать FGX он не дает мне искать. Исправьте это пожалуйста.
-
Axbor получил реакцию от AgrikBus в A component named ComponentName already exists.
При попытке заново создания фрейма выходит така ошибка "A component named MainMenuFrame already exists."
Удалял эту фрейма таким образом:
MainMenu->Parent = 0; MainMenu->Free(); MainMenu = 0; Создаю таким образом:
MainMenu = new TMainMenuFrame(this); MainMenu->Parent = this; На компьютере работает нормально, но на андроиде вот такая проблема...
-
Axbor получил реакцию от AgrikBus в RichEdit в FMX
Добрый день. Хотел сделать High-Lighter в FMX но никак немогу найти аналог RichEdit. Rad Studio Seatle.
-
Axbor отреагировална Равиль Зарипов (ZuBy) в [TBitmap] Загрузка изображений из интернета в приложение
idhttp1.Create(Application); - что это за бред?
IdHTTP - это откуда взялось?
никогда и никому этот код не показывай
берем файлик во вложении подключаем в проекте и пишем
with ListView1.Items.Add do begin Text := 'Text'; Bitmap.LoadFromUrl('http://site.ru/icons/icon.png'); end; не проверял, но должно работать. не нужно пихать в поток, там итак уже используется
FMX.Features.Bitmap.Helpers.zip
-
Axbor получил реакцию от OnePeople в Перетаскивание компонентов в ран тайм.
Когда я перетаскивал компонентов было проблема когда мышка двигалось очень быстро компонент которая я передвигал отставал от мышки. Что бы избавиться от этого нужно AutoCapture этого компонента сделать true. Тогда пока мышка не отпущена фокус остается на этом компоненте. Пример:
Добавляем в форму один компонент (в моем случае Rectangle).
В конструкторе формы запишем:
__fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { Rectangle1->AutoCapture = true; isDown = false; } //--------------------------------------------------------------------------- Потом запишем на OnMouseDown, OnMouseMove, OnMouseUp запишем как обычно.
void __fastcall TMainForm::Rectangle1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y) { oldX = X; oldY = Y; isDown = true; } //--------------------------------------------------------------------------- void __fastcall TMainForm::Rectangle1MouseMove(TObject *Sender, TShiftState Shift, float X, float Y) { if(!isDown) return; Rectangle1->Postion->Y = Rectangle1->Postion->Y + Y - oldY; Rectangle1->Postion->X = Rectangle1->Postion->X + X - oldX; } //--------------------------------------------------------------------------- void __fastcall TMainForm::RectangleMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y) { isDown = false; } //--------------------------------------------------------------------------- Вот и всё.
Таким же образом можно перетаскивать форму и т.д,
-
Axbor получил реакцию от fac в С помощью какого компонента проще всего реализовать Rating Bar?
Можно использовать шрифт с звёздочкой и полузвездочкой потом написать несколько строчек кода. Звёздочки можно найти в шрифте FontAwesome.ttf. Думаю это не так уж и сложно...
-
Axbor получил реакцию от Brovin Yaroslav в Перетаскивание компонентов в ран тайм.
Когда я перетаскивал компонентов было проблема когда мышка двигалось очень быстро компонент которая я передвигал отставал от мышки. Что бы избавиться от этого нужно AutoCapture этого компонента сделать true. Тогда пока мышка не отпущена фокус остается на этом компоненте. Пример:
Добавляем в форму один компонент (в моем случае Rectangle).
В конструкторе формы запишем:
__fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { Rectangle1->AutoCapture = true; isDown = false; } //--------------------------------------------------------------------------- Потом запишем на OnMouseDown, OnMouseMove, OnMouseUp запишем как обычно.
void __fastcall TMainForm::Rectangle1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y) { oldX = X; oldY = Y; isDown = true; } //--------------------------------------------------------------------------- void __fastcall TMainForm::Rectangle1MouseMove(TObject *Sender, TShiftState Shift, float X, float Y) { if(!isDown) return; Rectangle1->Postion->Y = Rectangle1->Postion->Y + Y - oldY; Rectangle1->Postion->X = Rectangle1->Postion->X + X - oldX; } //--------------------------------------------------------------------------- void __fastcall TMainForm::RectangleMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y) { isDown = false; } //--------------------------------------------------------------------------- Вот и всё.
Таким же образом можно перетаскивать форму и т.д,
-
Axbor получил реакцию от AngryOwl в Как задать windowborderstyle
Еще для перетаскивания формы или что угодно. Просто ставьте значение элемента с чем перетаскиваете AutoCapture = true; и всё. Как хотите так и двигайте. хоть быстро хоть медленно, то что вы перетаскиваете никогда не будет оставаться. Я тоже очень долго думал.
-
Axbor получил реакцию от Равиль Зарипов (ZuBy) в Перетаскивание компонентов в ран тайм.
Когда я перетаскивал компонентов было проблема когда мышка двигалось очень быстро компонент которая я передвигал отставал от мышки. Что бы избавиться от этого нужно AutoCapture этого компонента сделать true. Тогда пока мышка не отпущена фокус остается на этом компоненте. Пример:
Добавляем в форму один компонент (в моем случае Rectangle).
В конструкторе формы запишем:
__fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { Rectangle1->AutoCapture = true; isDown = false; } //--------------------------------------------------------------------------- Потом запишем на OnMouseDown, OnMouseMove, OnMouseUp запишем как обычно.
void __fastcall TMainForm::Rectangle1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y) { oldX = X; oldY = Y; isDown = true; } //--------------------------------------------------------------------------- void __fastcall TMainForm::Rectangle1MouseMove(TObject *Sender, TShiftState Shift, float X, float Y) { if(!isDown) return; Rectangle1->Postion->Y = Rectangle1->Postion->Y + Y - oldY; Rectangle1->Postion->X = Rectangle1->Postion->X + X - oldX; } //--------------------------------------------------------------------------- void __fastcall TMainForm::RectangleMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y) { isDown = false; } //--------------------------------------------------------------------------- Вот и всё.
Таким же образом можно перетаскивать форму и т.д,
-
-
Axbor отреагировална Brovin Yaroslav в Фоновое выполнение операции без "замораживания" отрисовки
Вся отрисовка выполняется в главном потоке приложения. Поэтому, если вы пытаетесь выполнить скачивание файла в основном потоке, то вся отрисовка приостановится до момента окончания вашей операции. Поэтому правило хорошего тона - это вынесение долгих операций (загрузка, ответ авторизации и тд) в отдельный поток.
Примерный код приведен ниже:
1. Создаем отдельный поток, в котором вы будите скачивать файл (я поставил для эмуляции скачивания просто паузу на 5 секунд):
type TMyTask = class (TThread) protected FOnTaskStarted: TThreadMethod; FOnTaskFinished: TThreadMethod; procedure DoStarted; procedure DoFinished; procedure Execute; override; public property OnTaskStarted: TThreadMethod read FOnTaskStarted write FOnTaskStarted; property OnTaskFinished: TThreadMethod read FOnTaskFinished write FOnTaskFinished; end; Реализация:
{ TMyTask } procedure TMyTask.DoFinished; begin if Assigned(OnTaskFinished) then OnTaskFinished; end; procedure TMyTask.DoStarted; begin if Assigned(OnTaskStarted) then OnTaskStarted; end; procedure TMyTask.Execute; begin Synchronize(DoStarted); try Sleep(5000); // Эмуляция выполнения 5 Секундной задачи finally Synchronize(DoFinished); end; end; Само использование такого потока будет следующим (в моем примере после выполнения операции, появится сообщение):
TForm3 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private FMyTask: TMyTask; public procedure DoTaskStarted; // Callback, вызываемый в начале старта операции procedure DoTaskFinished; // Callback, вызываемый в конце выполнения операции. Аналог OnTerminate procedure StartMyTask; // Запуск задачи end; procedure TForm3.Button1Click(Sender: TObject); begin StartMyTask; end; procedure TForm3.DoTaskStarted; begin end; procedure TForm3.DoTaskFinished; begin ShowMessage('Выполнение задачи окончено'); end; procedure TForm3.StartMyTask; begin if FMyTask <> nil then begin FMyTasl.OnTaskStarted := nil; FMyTasl.OnTaskFinished := nil; FMyTask.Free; end; FMyTask := TMyTask.Create(True); FMyTask.OnTaskStarted := DoTaskStarted; FMyTask.OnTaskFinished := DoTaskFinished; FMyTask.Start; end; При таком подходе главный поток не будет блокироваться и будет корректно отрисовываться и работать.
-
Axbor отреагировална Axbor в Получение координат при нажатии и движении мышки
Извиняюсь, не посмотрел форум! нужно было всего лишь Screen->MousePos() использовать!
-
Axbor получил реакцию от Alex7wrt в Получение координат при нажатии и движении мышки
Извиняюсь, не посмотрел форум! нужно было всего лишь Screen->MousePos() использовать!