Skip to content

TextEdit 删除文字BUG #270

@zhaozheng0612

Description

@zhaozheng0612

存在问题的函数:

LCUI/src/font/textlayer.c

Lines 962 to 967 in ea409f1

/** 删除指定行列的文字及其右边的文本 */
static int TextLayer_TextDeleteEx(LCUI_TextLayer layer, int char_y, int char_x,
int n_char)
{
int end_x, end_y, i, j, len;

  1. TextEdit启用多行文本
  2. 添加多行文本(‘\n’),如:123\n123\n123\n
  3. 用退格键(backspace)删除最后一行文本的最后一个字是出现异常,
		/* 如果当前行为空,也不是第一行,并且上一行没有结束符 */
		if (len <= 0 && end_y > 0 &&
		    prev_txtrow->eol != LCUI_EOL_NONE) {
			TextRowList_RemoveRow(&layer->text_rows, end_y);
			return 0;    <<这里添加return可以解决bug
		}
		/* 调整起始行的容量 */
		TextRow_SetLength(txtrow, len);    <<< 这里异常因为txtrow已经被释放掉了TextRowList_RemoveRow
  1. 在第二行最后一个字符处使用删除键(delete),出现异常:
	i = char_x;
	j = end_x;  <<< 原始代码这里为end_x + 1这里不应该+1
	end_y = char_y + 1;
	/* 将结束行的内容拼接至起始行 */
	for (; i < len && j < end_txtrow->length; ++i, ++j) {
		txtrow->string[i] = end_txtrow->string[j];      <<< **这里吧下一行的字符数据与当前行进行拼接**
	}
	TextLayer_UpdateRowSize(layer, txtrow);
	TextLayer_InvalidateRowRect(layer, end_y, 0, -1);
	/* 移除结束行 */
	TextRowList_RemoveRow(&layer->text_rows, end_y);   <<< **这里释放掉原来行的LCUI_TextRow形成空指针**
	/* 如果起始行无内容,并且上一行没有结束符(换行符),则
	 * 说明需要删除起始行 */
	if (len <= 0 && char_y > 0 && prev_txtrow->eol != LCUI_EOL_NONE) {
		TextLayer_InvalidateRowRect(layer, char_y, 0, -1);
		TextRowList_RemoveRow(&layer->text_rows, char_y);
	}
	TextLayer_AddUpdateTypeset(layer, char_y);

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions