【问题标题】:Fmx TMemo unable to show a base64 string appropriatelyFmx TMemo 无法正确显示 base64 字符串
【发布时间】:2016-01-31 22:53:24
【问题描述】:

我需要在 TMemo 中显示 base64 键。不幸的是,不可能适当地显示这个 base64 字符串:它在每个“/”处被回车符截断,或者在系统地开始新行的任何“+”处被截断! 我尝试了我所知道的一切,用一个长短语(没有回车)来制作这个字符串,但没有成功。 如果可能在调整表单和 TMemo 的大小时自动调整大小,如何获得 base64 中的扁平字符串(没有回车)? 非常感谢。

【问题讨论】:

    标签: firemonkey tmemo


    【解决方案1】:

    对于那些感兴趣的人,下面的代码:一个带有 TMemo(备忘录)的 TForm。该解决方案适用于扁平 Base64 字符串。最后不再在每个 / 或 + 处截断字符串。 也许下面的解决方案需要调整,但它对我来说已经足够了。当然,在应用程序中处理 b64 字符串之前,需要对其进行过滤以消除 CR-LF,但这没关系。 我使用事件:TMemo 的 OnKeyDown、OnResize、OnPainting。 我编写了一个特定的函数 formatMemo(..) 来适当地对齐行。 该代码只接受真正的 B64 字符,如果有错误字符,则过滤掉。

    #define IS_B64(c) (isalnum(c) || (c == '/') || (c == '+') || (c == '='))
    
    //Adjustments work for Courier New, standard size:
    const float FW=7.2;//Font width
    const diff=25;//Room for vert. scroll bar
    
    //Gives the number of characters in one line of the TMemo:
    //  width : width in pixels where to put the line of chars
    //  font_sz : the average width of a character
    //  returns the number of characters by line of the TMemo
    inline int nchars(int width, float font_sz)
    {
        return int(float(width-diff)/font_sz);
    }//nchars
    //---------------------------------------------------------------------------
    
    //Formats the memo to a certain length of characters:
    //  *p : the memo to format
    //  nc : the number of characters for each line.
    void formatMemo(TMemo *p, int nc)
    {
        if(p==0) return;
        AnsiString src, dest;//UnicodeString is less fast...
        //Filter everything as B64 only:
        for(int i=1; i<=p->Text.Length(); ++i) {//Indexing is "1-based" like on Delphi (except on mobiles)
            if(IS_B64(p->Text[i])) dest += p->Text[i];
        }
        p->Lines->Clear();//Erases everyting
        int length=dest.Length(), units=length/nc, remain=length%nc;
        for( int k=0 ; k<units ; ++k) {
            p->Lines->Append( dest.SubString(1+k*nc, nc) );
        }
        if(remain) {
            p->Lines->Append( dest.SubString(1+units*nc, remain) );
        }
    }//formatMemo
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::memoKeyDown(TObject *Sender, WORD &Key, System::WideChar  &KeyChar,
              TShiftState Shift)
    {
        //This event is triggered before the character is sent in Text.
        //Saves caret position:
        TCaretPosition p={memo->CaretPosition.Line, memo->CaretPosition.Pos};
        memo->Tag=0;//Don't do a format.
    
        if(Key==0 && !IS_B64(KeyChar))//Printable KeyChar
        {
            //Changes the entry into '0':
            KeyChar='0';
            KeyDown(Key,KeyChar,Shift);
    
            //Put a backspace to erase:
            Key=vkBack; KeyChar=0;
            KeyDown(Key,KeyChar,Shift);
        }
        else memo->Tag=1;//Programs a format in the OnPainting
        memo->SetFocus();
        memo->CaretPosition=p;//Repositions the caret
    }
    //---------------------------------------------------------------------------
    
    //In case of resize, reformat the TMemo
    void __fastcall TForm1::memoResize(TObject *Sender)
    {
        formatMemo(memo, nchars(memo->Width,FW));
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::memoPainting(TObject *Sender, TCanvas *Canvas, const TRectF &ARect)
    {
        //We will use the Tag of the memo as a parameter, to plan a reformat.
        if(memo->Tag){//A format is asked by OnKeyDown.
            TCaretPosition p={memo->CaretPosition.Line, memo->CaretPosition.Pos};
            formatMemo(memo, nchars(memo->Width,FW));
            memo->SetFocus();
            memo->CaretPosition=p;
            memo->Tag=0;//Done
        }
    }
    //---------------------------------------------------------------------------
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2017-05-08
      • 2021-11-24
      • 1970-01-01
      • 2018-10-18
      • 2023-03-12
      • 2014-02-14
      相关资源
      最近更新 更多