首页 > 其他分享 >Delphi换行_这里只换一行

Delphi换行_这里只换一行

时间:2024-07-03 17:22:30浏览次数:14  
标签:end 换行 Delphi Vcl Height Font Top 只换 Left

开发环境DelphiXe11;

这个代码不适用于Delphi7,一般不适用于Delphi2007之前的版本;

这个图片:12个字(汉字)换行;2数字和2字母认为等于1汉字;

这个换行不大行,全是小写的字母占占用的位置比较少,如果要效果好的,请自己写;

 

 

--Unit-- 

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Math;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function f_GetLineBreakPosition(const AStr: string;
  ACutoffCount: DWord): Integer;
var
  vStrlen, vCount_A, vCount_B, i, j, vChineseCharacterCount, vSubInt, vSubInt2,
  vTempInt_A, vTempInt_B: Integer;
  vDouble: Double;
  vChineseCharacterBool: Boolean;
begin
  //只是粗略计算,不要太较真
  Result := 0;
  if ACutoffCount < 4 then //最少四个字
    Exit;
  if AStr = '' then
    Exit;

  vStrlen := Length(AStr);

  if vStrlen <= ACutoffCount then //ACutoffCount截断的汉字位置  只能显示两行,第一行多少个汉字截断(两个数字或者连个数字或者字符默认为一个汉字)
    Exit;
  vCount_A := 0;
  vCount_B := 0;
  for i := 1 to vStrlen do
  begin
    if Ord(Astr[i]) < 256 then
      inc(vCount_A) //字符个数
    else
      inc(vCount_B); //汉字个数


    j := i + 1;
    if j <= vStrlen then
    begin
      if Ord(Astr[j]) < 256 then //小于256都认为非汉字
        vChineseCharacterBool := False
      else
        vChineseCharacterBool := True;
      vTempInt_B := vCount_B * 2;
      vTempInt_A := vCount_A;
      if vChineseCharacterBool then//下一个是汉字
      begin
        vTempInt_B := (vCount_B + 1) * 2;
      end
      else
      begin
        vTempInt_A := vCount_A + 1;
      end;

      vDouble := (vTempInt_A + vTempInt_B) / 2.0;
      vSubInt := Trunc(vDouble);
      vSubInt2 := Ceil(vDouble);
      if vSubInt = vSubInt2 then //没有小数
      begin
        if vSubInt = ACutoffCount then
        begin
          Result := j;
          Exit;
        end;
      end
      else
      begin
        if vChineseCharacterBool  then
        begin
          if (vSubInt <= ACutoffCount) and (ACutoffCount < vSubInt2) then
          begin
            Result := j;
            Exit;
          end;
        end
        else
        begin
          if ACutoffCount = vSubInt then
          begin
            Result := j;
            Exit;
          end;
        end;
      end;
    end
    else
      Result := i;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  vStr1, vStr2: string;
begin
  Memo1.Clear;
  i :=f_GetLineBreakPosition(Edit1.Text, StrToIntDef(Edit2.Text, 10));
  if i = 0 then
    Memo1.Text := Edit1.Text
  else
  begin
    vStr1 := Copy(Edit1.Text,1, i);
    vStr2 := Copy(Edit1.Text,i + 1, 10000);
    Memo1.Lines.Add(vstr1);
    Memo1.Lines.Add(vstr2);
  end;
end;

end.

 

--Form-- 

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 389
  ClientWidth = 449
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -12
  Font.Name = 'Segoe UI'
  Font.Style = []
  TextHeight = 15
  object Button1: TButton
    Left = 151
    Top = 37
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Edit1: TEdit
    Left = 16
    Top = 8
    Width = 337
    Height = 23
    TabOrder = 1
    Text = #25216#26415#30340#22797#27963#33410#22307#35806#33410#24674'0123456789'
  end
  object Memo1: TMemo
    Left = 16
    Top = 80
    Width = 401
    Height = 281
    Lines.Strings = (
      'Memo1')
    ScrollBars = ssBoth
    TabOrder = 2
  end
  object Edit2: TEdit
    Left = 16
    Top = 37
    Width = 57
    Height = 23
    TabOrder = 3
    Text = '12'
  end
end

  

标签:end,换行,Delphi,Vcl,Height,Font,Top,只换,Left
From: https://www.cnblogs.com/dmqhjp/p/18282216

相关文章

  • delphi Image32 变形控制
    先看动画:  代码:1unituFrmTransform;23interface45uses6Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,7System.Types,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,8Vcl.Dialogs,Vcl.Menus,Vc......
  • delphi Image32 图像采样
    图像数据采样  代码:1unituFrmImageResampling;23interface45uses6Winapi.Windows,Winapi.Messages,Winapi.ShellAPI,//7System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,8Vcl.Forms,Vcl.Dialo......
  • 【Shell脚本】 Shell索引数组变量:定义-获取-拼接-删除、alisa内置命令、默认输出换行
    目录 Shell索引数组变量:定义-获取-拼接-删除 数组的获取 数组的拼接数组的删除 alisa内置命令默认输出换行语法 read内置命令 declare内置命令获取指定key的值使用declare定义一普通数组,并获取打印元素数据的值 expr命令 算术运算符 布尔运算符 逻辑......
  • Python 遍历文件每一行判断是否只有一个换行符详解
    前言在文件处理过程中,判断文件每一行是否只有一个换行符是一个常见需求。作为测试工程师,我们经常需要对文件的格式进行验证,确保数据的完整性和规范性。本文将详细介绍如何使用Python遍历文件的每一行,并判断每一行是否只有一个换行符。需求分析我们需要编写一个Python程序,......
  • Delphi 生成随机验证码
    Delphi生成随机验证码functionCodeImg(img:Timage):string; var  I,j,k: Integer;  vPoint: TPoint;  vLeft: Integer;  arrStr:array[1..36]ofstring;  strResult:string; begin  strResult:='';  arrStr[1]:=......
  • delphi:利用定时器读取串口返回数据
    定时器20毫秒运行一次,单字符读取,如果读取到就保存到全局变量receData中,否则就输出到文本框中,并重置receData。优点:单字符读取,解决了按长度读取的弊端,如果按长度读取,很多时候并不知道究竟要读取多长,有的时候能读取完整,有的时候只读取了部分。procedureTfrmLC.tmrReceDataTimer(S......
  • 回车和换行
    在学计算机的时候,总是会遇到回车和换行,但一直没去深究;在学习字符编码相关知识的时候,觉得得深入去搞懂下,除了编码,在我们日常工作中也是经常会遇到的。因此去网上查阅了相关博客,有了今天这篇文章。我们先从回车和换行的起源说起‍起源:打字机在计算机还没有出现之前,有一种叫做电......
  • delphi Image32 图片转换成SVG
    image32中有2种算法转换图像为svg,一种是按透明度计算找边缘,另一种是分析像素梯度找边缘,demo代码整理后如下:unituFrmImageToSVG;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.......
  • delphi Image32 SVG图形查看器
    DELPHI 中没有SVG显示组件,需要用到第三方组件,高版本可以使用skia(但必须带上skia.dll).最新版Image32修改了很多,SVGIconImageList 也因此换成了Image32做为基础库,安装了 SVGIconImageList 就可以不用再单独安装Image32了(基本上是绿色不用安装包,直接引用就行)。unituFrmSVGSh......
  • delphi Image32 图形处理 图层
    图形图层处理是Image32的主要功能,矢量图形,分层类似Photoshop看人图层,直接上代码效果。unituFrmLayer;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Types,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,V......