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

antarey

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

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

  • Посещение

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

    2

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

  1. Добрый день.

    Помогите побороть access violation

    Есть главная форма frmMain, на ней лежит панелька rootLayout.

    По кнопкам создаю фреймы:

    private: // User declarations
        TFrame *WorkFrame;
        TPanel* FrameLayout;
    
    // --------------------------------------------------------------------------
    void TfrmMain::CreateFrame(String FrameName)
    {
        if (FrameLayout != NULL) {
            delete FrameLayout;
        }
    
        FrameLayout              = new TPanel(Application);
        FrameLayout->StyleLookup = "pushpanel";
        FrameLayout->Name        = "FrameLayout";
        FrameLayout->Parent      = rootLayout;
        FrameLayout->Align       = TAlignLayout::Client;
    
        if (FrameName == "frmParam") {
            WorkFrame = new TfrmParam(FrameLayout);
        }
        if (FrameName == "frmEditor") {
                WorkFrame                 = new TfrmEditor(FrameLayout);
                WorkFrame->Tag            = 1;
        }
    
        if (FrameName == "frmAdmin") {
                WorkFrame = new TfrmAdmin(FrameLayout);
        }
    
        WorkFrame->Parent = FrameLayout;
        WorkFrame->Align  = TAlignLayout::Client;
    }
    
    // --------------------------------------------------------------------------

    На фрейме frmEditor тоже есть панелька ItemsListRootLayout и в етом фрейме я создаю дополнительные фреймы

        TFrame *EditorWorkFrame;
        TPanel* EditorFrameLayout;
    // ---------------------------------------------------------------------------
    void TfrmEditor::CreateFrame(String FrameName)
    {
    
        if (EditorFrameLayout != NULL) {
            delete EditorFrameLayout;
        }
    
        EditorFrameLayout              = new TPanel(Application);
        EditorFrameLayout->StyleLookup = "pushpanel";
        EditorFrameLayout->Name        = "EditorFrameLayout";
        EditorFrameLayout->Parent      = ItemsListRootLayout;
        EditorFrameLayout->Align       = TAlignLayout::Client;
    
        if (FrameName == "frmNewArticleList") {
            EditorWorkFrame = new TfrmNewArticleList(Application);
    ..................
        }
    
    ...............................
        EditorWorkFrame->Parent = EditorFrameLayout;
        EditorWorkFrame->Align  = TAlignLayout::Client;
    
    }
    
    // --------------------------------------------------------------------------

    На фрейме frmNewArticleList лежит ListBox привязан к таблице( пробовал через грид таже ошибка) и есть обработчик

    //---------------------------------------------------------------------------
    void __fastcall TfrmNewArticleList::NewArticleListItemClick(TCustomListBox * const Sender, TListBoxItem * const Item)
    {
        frmEditor->Label2->Text = dm->qLocalContent->FieldByName("title")->AsString;
    }
    //---------------------------------------------------------------------------

    В результате при клике на итеме получаю access violation 

    er.png.ad82701ec0ce0c3062422075854e1715.png

    Подскажите где я накосячил.

    Заранее благодарен

  2. Есть картинки *.png,*.jpg в основном.

    На примере темы  написал код, для начала только уменьшение качестка

        if (FileExists("d:\\Work\\Project\\Tmp\\11.JPG"))
            TFile::Delete("d:\\Work\\Project\\Tmp\\11.JPG");
    
        TStream *Stream = new TMemoryStream();
        TBitmapSurface *Surface = new TBitmapSurface();
        TBitmapCodecSaveParams *SaveParam = new TBitmapCodecSaveParams();
        TBitmap *SrcBitmap = new TBitmap();
        TBitmap *DstBitmap = new TBitmap();
        SrcBitmap->LoadFromFile("d:\\Work\\Project\\Tmp\\1.JPG");
        Surface->Assign(SrcBitmap);
        SaveParam->Quality = 50;
        TBitmapCodecManager::SaveToStream(Stream, Surface, ".jpg", SaveParam);
        Stream->Position = 0;
    
        DstBitmap->LoadFromStream(Stream);
        DstBitmap->SaveToFile("d:\\Work\\Project\\Tmp\\11.JPG");

    Исходное изображение 2,5Мб а конечное DstBitmap 3,7 Мб.

    Ето так надо? Где я ошибся?

    Кроме изменения размеров изображения и качества - что еще можно оптимизировать?

    Спасибо

  3. Добрый день.

    Есть TDateEdit подключенный к базе через LiveBindings. Поле дати имеет значение по умолчанию "0000-00-00 00:00"

    DateEdit отображает ето значение как 30.12.1899 . На доквики написано что можно использовать логические операторы, но нет примера как.

    Подскажите как будет выглядеть строка CustomFormat для условия - if (query1->FieldByName("DateB")->AsString == "0000-00-00 00:00")DateEdit1->Date = ""/NULL или же  DateEdit1->Text = "0000-00-00 00:00".

     

  4. Добрый день. Как програмно прокрутить TListBox на последний итем?

        TListBoxItem *logItem = new TListBoxItem(Application);
        logItem->Parent = cbLog;
        logItem->Name = "item" + IntToStr(itemIndex);
        logItem->Text = Now().FormatString("dd:mm:yy") + " : " + text; ;
        logItem->ImageIndex = ImageIndex;
        logItem->TextSettings->WordWrap = true;
    
        cbLog->ItemIndex = cbLog->Items->Count - 1;
        cbLog->ScrollToItem(logItem);

    последние две строки, по идее должны прокрутить на последний елемент списка, но последний елемент выделяется а прокрутка в начале списка

  5. Есть библиотека для парсинга .

    сторики 177,178

        property Nodes[const Name: AnsiString]: TALXMLNode read GetNodeByName; default;
        property Nodes[const Index: integer]: TALXMLNode read GetNodeByIndex; default;

    Я добавил ALXmlDoc.pas в проект, билдер сам создал ALXmlDoc.hpp и сгенирировал
     

        __property TALXMLNode* Nodes[const System::AnsiString Name] = {read=GetNodeByName/*, default*/};
        __property TALXMLNode* Nodes[const int Index] = {read=GetNodeByIndex};

    и естественно получаю ошибку о дублировании - как исправить сие недоразумение?

    И второй вопрос.

    строка 705
       

    property OnParseText: TAlXMLParseTextEvent read FonParseText Write FonParseText; // [added from TXMLDocument]

    в  ALXmlDoc.hpp

     __property _di_TAlXMLParseTextEvent OnParseText = {read=FonParseText, write=FonParseText};
    __interface TAlXMLParseTextEvent  : public System::IInterface 
    {
        virtual void __fastcall Invoke(System::TObject* Sender, const System::AnsiString Path, const System::AnsiString Str) = 0 ;
    };
    
    private:
        _di_TAlXMLParseTextEvent FonParseText;
    protected:
        void __fastcall DoParseText(const System::AnsiString Path, const System::AnsiString Str);

    Делал по демке

    *. hpp
     

    void __fastcall OnParseText(System::TObject* Sender,const System::AnsiString Path, const System::AnsiString Str);

    *.cpp

    void __fastcall TForm1::OnParseText(System::TObject* Sender, const System::AnsiString Path, const System::AnsiString Str) {
    
    }
    // ---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender) {
        TALXMLDocument* aXMLDocument = new TALXMLDocument("root");
        aXMLDocument->OnParseText = OnParseText;
    }

    и получаю ошибку

    [bcc32 Error] Unit1.cpp(30): E2235 Member function must be called or its address taken

    Как правильно объявить событие?

    Спасибо

  6. В 25.01.2020 в 13:22, Maximus сказал:

    Попробуйте так

    
            title = dm->qExpContent->FieldByName("title")->AsWideString;
            introtext = dm->qExpContent->FieldByName("introtext")->AsWideString;
            fulltext = dm->qExpContent->FieldByName("fulltext")->AsWideString;

     

    Без результатов

    Пробовал тупо так

            dm->qProc->SQL->SaveToFile("1.sql",TEncoding::UTF8);
            dm->qProc->SQL->LoadFromFile("1.sql", TEncoding::UTF8);
            dm->qProc->ExecSQL();

    Файл сохраняется в UTF8, но в я так понимаю что TFDQuery переконвертирует скорее всего в АНСИ.

    Можно как-то заставить работать TFDQuery на юникоде ?

  7. Помогите разобраться к кодировками
    Есть проект на C++Builder 10.3 использую VCL но думаю что для FMX будет та же проблема

    Использую Firedac
    Есть две базы - SQLite - UTF8  и MYSQL - UTF8. 
    Надо експортировать таблицу из SQLite в MYSQL 
    В базе SQLite все нормально видно, Девекспресовский грид нормально показывает данные
    Формирую скрипт в TFDQuery - qProc

            dm->qExpContent->Open();
            dm->qProc->SQL->Clear();
            UTF8String title,introtext,fulltext;
    
            do {
            title = dm->qExpContent->FieldByName("title")->AsString;
            introtext = dm->qExpContent->FieldByName("introtext")->AsString;
            fulltext = dm->qExpContent->FieldByName("fulltext")->AsString;
                dm->qProc->SQL->Add("insert ignore into " _content(...alias,introtext,'fulltext'... 
                           values('" + "','" + title + "','" +introtext + "','" +fulltext..."');");
                dm->qExpContent->Next();
            }
        while (!dm->qExpContent->Eof);
            dm->qProc->ExecSQL();
    

    И в результате в MYSQL  вижу крякозябры. 
    Игрался с типом строковых переменных, тупо создавал файл в UTF8 и делал загрузку в qProc
    результат тот же
    Как правильно синхронизировать таблицы? и победить кодировки
    Заранее всем спасибо
     

  8. На пару лет выпал из темы.

    Проблема со стандартным гридом TGrid и  TTMSFMXLiveGrid. Запускаю по F9 - нормально запускается, но при Build project по Shift F9

    получаю ошибку  Class TTMSFMXLiveGrid not found ну или  Class TGrid not found

    Подскажите что надо подшаманить. Раньше таких проблем не было.

  9. Документ открываю, но сохранять  в упор не хочет

                vVarApp = CreateOleObject("Word.Application");
                fStart = true;
                vVarApp.OlePropertySet("Visible", true);
                vVarDocs = vVarApp.OlePropertyGet("Documents");
                vVarDocs.OleProcedure("Open",WordFileName);
                vVarDocs=vVarDocs.OleFunction("Item",1);
                vVarDocs.OleProcedure("Activate");
    
                vVarApp.OlePropertyGet("ActiveDocument").OleProcedure(L"SaveAs2", HtmlFileName, L"FileFormat:=_wdFormatFilteredHTML");
                vVarApp.OlePropertyGet("ActiveWindow").OleProcedure(L"Close");
                vVarApp.OleProcedure("Quit");

    Точнее сохраняет, но не в _wdFormatFilteredHTML формате

  10. Добрый день.

    Помогите побороть OLE сервер ворда.
    Есть простая задача - открыть документ ворд и сохранить его в html, но что-то лыжи не едут

    Вот код

    unit1.h

    public: // User declarations
        Variant  vVarApp,vVarDocs;
        bool fStart;

    unit1.cpp
     

    #include      <ComObj.hpp>
    #include      <utilcls.h>
    
    
        if (!fStart) {
            try {
                vVarApp = CreateOleObject("Word.Application");
                fStart = true;
    
                vVarDocs = vVarApp.OlePropertyGet("Documents");
                vVarDocs.OleProcedure("ChangeFileOpenDirectory", "\"D:\\\"");
                vVarDocs.OleProcedure("Open", "f1.docx");
                vVarApp.OlePropertySet("Visible", true);
            }
            catch (...) {
                ShowMessage("Ошибка при открытии сервера Word");
                return;
            }
        }

    И получаю ошибку - Unknown name

  11. 33 минуты назад, Равиль Зарипов (ZuBy) сказал:

    в билдере есть умный указатель, unique_ptr, который сам чистит объекты которые больше никем не используются

    Но это не точно

    Вот как раз об unique_ptr тоже вопрос, как умные указатели ведут себя на мобильных платформах? Для винды написано что объекты уничтожаются когда их никто не использует, или же когда объект выходит за пределы видимости - если я правильно понял - если объект локальный и внутри какого-то обработчика, то объект будет уничтожен по завершению обработчика.
    Но как сие на практике и для винды и мобильных платформ - вопрос к Ярославу и Ембарсадеро

  12. А как быть с С++  - кругом в документации пишеться , что вместо Free необходимо использовать delete, но в андроиде delete не удаляет объект - тоже юзать FreeAndNil? 

  13. Подскажите, как в FMX реализовать типа нативное приложение под Вынь 10 - когда заходиш в настройки, потом в какой-то подпункт и в левом верхнем углу в капшине появляется стрелка назад. 
    Убрать капшин , кинуть панель плюс три стандартные кнопки можно, но тогда форма ведет себя не совсем по нативному, когда пристыковываеш ее к краям экрана, она автоматически не ресайзится

    app.png

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