Перейти к содержанию
Fire Monkey от А до Я

Axbor

Пользователи
  • Постов

    159
  • Зарегистрирован

  • Посещение

  • Победитель дней

    6

Активность репутации

  1. Like
    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
  2. Like
    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; Держи
  3. Like
    Axbor отреагировална Равиль Зарипов (ZuBy) в Динамическая подгрузка картинок в ListView   
    Привет Всем!
    Как принято в современных приложениях, догружать контент(обычно это картинки) при скролинге.
    я взял картинки пользователей этого форума

    Seattle LVdynamicLoadBitmap.zip
    Berlin LVdynamicLoadBitmap(Berlin).zip
  4. Thanks
    Axbor получил реакцию от FireMy в Прочитать item'ы из listView   
    for(int i = 0; i < ListView1->Items->Count; i ++) { Memo1->Lines->Add(ListView1->Items->AppearanceItem[i]->Text); }
  5. Like
    Axbor отреагировална Равиль Зарипов (ZuBy) в TListViewHorz   
    Давно не хватало TListView в горизонтальной ориентации, например чтобы сделать вот такую картинку

     
    zairkz сделал стиль с применением 9-patch png "технологии"
     
    С помощью жестов показано как сделать "сквозной скрол"
    как писал dreamix
     
     
    P.S. по компоненту TListViewHorz, не успел все протестить как следует со всеми параметрами
    не правильно будет отображаться Header'ы и Поиск, основной функционал сохранен
    UPDATE:  LVStyledhorz.7z
  6. Like
    Axbor получил реакцию от Kitty в SQLite Mac OS, Кодировка   
    Незнаю как на делфи. Но на с++ такая:
    Query->ParamByName('Title')->AsString = L"Заголовок";
  7. Like
    Axbor получил реакцию от Равиль Зарипов (ZuBy) в С помощью какого компонента проще всего реализовать Rating Bar?   
    Можно использовать шрифт с звёздочкой и полузвездочкой потом написать несколько строчек кода. Звёздочки можно найти в шрифте FontAwesome.ttf. Думаю это не так уж и сложно...
  8. Like
    Axbor отреагировална GASCHE в Какие статьи вы хотели бы видеть в блогах?   
    OC: Android. Многопоточные приложения, синхронизация потоков, создание потоконезависимых компонентов.
  9. Like
    Axbor отреагировална #WAMACO в Какие статьи вы хотели бы видеть в блогах?   
    Обновление базы данных в фоновом режиме.
    Есть сеть - обновляем БД! Нет, работаем в оффлайн режиме!
    ОС: iOS, Android
  10. Like
    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; }
  11. Like
    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; }
  12. Like
    Axbor получил реакцию от Kitty в Загрузка файлов из интернета   
    Stream:=TMemoryStream.Create; IdHTTP1.Get('http://devdelphi.ru/files/VK_APImodul.rar',Stream); Stream.SaveToFile('C:\1.rar'); Stream.Free; Что бы программа не завис при загрузки файла, нужно использовать поток.
  13. Like
    Axbor получил реакцию от Равиль Зарипов (ZuBy) в Почему не возможно искать с ключевым словом из трех букв?   
    В нашем форуме можно добавлять теги из трех букв но искать теги из трех букв невозможно. Например я хочу искать FGX он не дает мне искать. Исправьте это пожалуйста. 
  14. Like
    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; На компьютере работает нормально, но на андроиде вот такая проблема...
  15. Like
    Axbor получил реакцию от AgrikBus в RichEdit в FMX   
    Добрый день. Хотел сделать High-Lighter в FMX но никак немогу найти аналог RichEdit. Rad Studio Seatle.
  16. Like
    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
  17. Like
    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; } //--------------------------------------------------------------------------- Вот и всё.
    Таким же образом можно перетаскивать форму и т.д,
  18. Like
    Axbor получил реакцию от fac в С помощью какого компонента проще всего реализовать Rating Bar?   
    Можно использовать шрифт с звёздочкой и полузвездочкой потом написать несколько строчек кода. Звёздочки можно найти в шрифте FontAwesome.ttf. Думаю это не так уж и сложно...
  19. Like
    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; } //--------------------------------------------------------------------------- Вот и всё.
    Таким же образом можно перетаскивать форму и т.д,
  20. Like
    Axbor получил реакцию от AngryOwl в Как задать windowborderstyle   
    Еще для перетаскивания формы или что угодно. Просто ставьте значение элемента с чем перетаскиваете AutoCapture = true; и всё. Как хотите так и двигайте. хоть быстро хоть медленно, то что вы перетаскиваете никогда не будет оставаться. Я тоже очень долго думал. 
  21. Like
    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; } //--------------------------------------------------------------------------- Вот и всё.
    Таким же образом можно перетаскивать форму и т.д,
  22. Like
    Axbor отреагировална Равиль Зарипов (ZuBy) в Как реализовать это?   
    что-то типа этого?

    demoLV.zip
  23. Like
    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; При таком подходе главный поток не будет блокироваться и будет корректно отрисовываться и работать.
  24. Like
    Axbor отреагировална Axbor в Получение координат при нажатии и движении мышки   
    Извиняюсь, не посмотрел форум! нужно было всего лишь Screen->MousePos() использовать!
  25. Like
    Axbor получил реакцию от Alex7wrt в Получение координат при нажатии и движении мышки   
    Извиняюсь, не посмотрел форум! нужно было всего лишь Screen->MousePos() использовать!
×
×
  • Создать...