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

antarey

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

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

  • Посещение

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

    2

Сообщения, опубликованные antarey

  1. В некоторых приложения на Андроиде и на некоторых сайтах( сейчас к сожалению не могу вспомнить где видел) используется прикольная анимация TextPromt.
    На словах - TextPromt внутри едита, когда кликаеш на едите -TextPromt подымается над едитом и меняет цвет.

    Я реализовал так - Для едита чилдреном добавил лейбл, а для лейбл чилдреном FloatAnimation и вот код

    // ---------------------------------------------------------------------------
    void __fastcall TForm1::Edit1Enter(TObject *Sender) {
        TEdit * LEdit = dynamic_cast<TEdit*>(Sender);
    
        if (LEdit) {
    
            if (LEdit->ChildrenCount >= 3) {
                if (LEdit->Children->Items[2]->ClassName() == "TLabel") {
                    TLabel * LLabel = dynamic_cast<TLabel*>(LEdit->Children->Items[2]);
                    if (LLabel && LLabel->Children->Items[1]->ClassName() == "TFloatAnimation") {
                        TFloatAnimation * animation = dynamic_cast<TFloatAnimation*>(LLabel->Children->Items[1]);
                        if (animation) {
                            animation->StopValue = -20;
                            if (LEdit->Text == "" || LLabel->Position->Y == 0) {
                                animation->Start();
                                _di_ITextSettings Settings;
                                if (LLabel->GetInterface(Settings)) {
                                    Settings->TextSettings->FontColor = TAlphaColor(claBlue);
                                    Settings->StyledSettings = Settings->StyledSettings >> TStyledSetting::ssFontColor;
                                }
    
                            }
                        }
                    }
                }
            }
        }
    
    }
    
    // ---------------------------------------------------------------------------
    void __fastcall TForm1::Edit1Exit(TObject *Sender) {
        TEdit * LEdit = dynamic_cast<TEdit*>(Sender);
    
        if (LEdit) {
    
            if (LEdit->ChildrenCount >= 3) {
    
                if (LEdit->Children->Items[2]->ClassName() == "TLabel") {
    
                    TLabel * LLabel = dynamic_cast<TLabel*>(LEdit->Children->Items[2]);
                    if (LLabel && LLabel->Children->Items[1]->ClassName() == "TFloatAnimation") {
    
                        TFloatAnimation * animation = dynamic_cast<TFloatAnimation*>(LLabel->Children->Items[1]);
                        if (animation) {
    
                            animation->StopValue = 2;
                            if (LEdit->Text == "") {
                                animation->Start();
                                _di_ITextSettings Settings;
                                if (LLabel->GetInterface(Settings)) {
                                    Settings->TextSettings->FontColor = TAlphaColor(claBlack);
                                    Settings->StyledSettings = Settings->StyledSettings >> TStyledSetting::ssFontColor;
                                }
    
                            }
                        }
                    }
                }
            }
        }
    }
    
    // ---------------------------------------------------------------------------

    Все отлично работает, но есть один нюанс - когда подвязываешь едит к полю таблички - лейбл перекрывает текст едита, оно то и правильно - я по едиту не кликал.
    Посему вопрос - как заставить переместиться все лейбелы всех едитов у которых не пустой текст  после открытия таблицы .
    Не хочется  делать для всех едитов Control->EnumControls
    Может кто знает лучший способ?

    Пример в атаче, структура проекта на скрине 

    TextPrompAnamation.zip

    Знімок екрана (43).png

  2. Поставил, и на ресайз тоже. Я вроде где-то читал/слышал что в 10 добавили изменение высоты итема в свойства но в упор не нахожу такого.

    22 часа назад, Rusland сказал:

    try FTextLayout.Text:='m'; finally FTextLayout.EndUpdate; end;

    Зачем етот код?
    К сожалению не работает. У меня итем создается отдельной процедурой с пустым текстом. В другой процедуре прописывается текст.

  3. Согласно мануалу  реализовал код
     

    void TfrmMain::CalculateItemHeight(TObject *Sender)
    {
        TTextLayout* FTextLayout = TTextLayoutManager::TextLayoutForClass(TTextLayoutManager::DefaultTextLayout);
        TListBoxItem *ListItem = dynamic_cast<TListBoxItem*>(Sender);
    
            FTextLayout->BeginUpdate();
            try
            {
                FTextLayout->Text = ListItem->Text;
                FTextLayout->MaxSize = TPointF(ListItem->Width, 1000);
                FTextLayout->WordWrap = ListItem->WordWrap;
                FTextLayout->Font = ListItem->Font;
                FTextLayout->HorizontalAlign = ListItem->TextAlign;
                FTextLayout->VerticalAlign = ListItem->VertTextAlign;
            }
            __finally
            {
                FTextLayout->EndUpdate();
            }
    
                ListItem->Height = FTextLayout->Height;
    }

    Прописал события для итема, итемы создаю в рантайме, и ничего :( 
    Как автоматически подгонять высоту итема под текст? Что я не так сделал? 

  4. Как в провести синхронизацию для задачи?
    Есть NetHTTPClient

    void __fastcall TfrmMain::NetHTTPClientReceiveData(TObject * const Sender, __int64 AContentLength, __int64 AReadCount, bool &Abort) {
        if (AContentLength > 0)
        {
            pbMain->Value = ((float)AReadCount / (float)AContentLength) * 100.f;
        } else pbMain->Value = AReadCount;
    
    }
    //--------------------------------------------------------------------
    void __fastcall TfrmMain::SpeedButton1Click(TObject *Sender)
    {
        _di_ITask tsLoadNewComp = TTask::Create([&](){
                  std::auto_ptr<TStream> inputStream(new TFileStream(System::Ioutils::TPath::Combine(TDirectory::GetParent(ParamStr(0)), "index.dat"), fmCreate));
                  NetHTTPClient->AcceptEncoding = "gzip, deflate";
                  NetHTTPClient->Get("..............", inputStream.get());
        });
        tsLoadNewComp->Start();
    }
    

    Как сделать, чтобы в задаче tsLoadNewComp отрабатывалась процедура NetHTTPClientReceiveData?  

  5. Есть необходимость прочитать личные сообщения для сайта forum.ru-board.com.
     

        TStringList *DataList = new TStringList();
        DataList->Add("action=dologin&inmembername=USER&inpassword=PASSWORD=http%3A%2F%2Fforum.ru-board.com%2F");
    
        TStringStream *DataStream     = new TStringStream(DataList->Text);
        TStringStream *ResponseStream = new TStringStream();
        try {
            NetHTTPClient->Accept         = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
            NetHTTPClient->AcceptEncoding = "gzip, deflate, lzma";
            NetHTTPClient->AcceptLanguage = "ru,en-US;q=0.8,en;q=0.6,uk;q=0.4";
            NetHTTPClient->ContentType    = "application/x-www-form-urlencoded";
    
            NetHTTPClient->UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36 OPR/40.0.2308.52 (Edition beta)";
            
            NetHTTPClient->Post("http://forum.ru-board.com/misc.cgi", DataStream, ResponseStream);
    
            NetHTTPClient->Get("http://forum.ru-board.com/messanger.cgi?action=inbox", ResponseStream);
        }
        __finally {
    
            Memo1->Lines->Clear();
            Memo1->Lines->Add(ResponseStream->DataString);
    
        }

    И в мемо получаю - незарегеный пользователь.
    Если убрать строку
     

    NetHTTPClient->Get("http://forum.ru-board.com/messanger.cgi?action=inbox", ResponseStream);

    в мемо видно что авторизация успешная.

    Что я не так делаю? Как правильно со страницы логина перейти и прочитать данные со страницы личных сообщений?
     

×
×
  • Создать...