Borland环境下循环批量导出TEdit控件内容至文件的问题
问题描述
我有数百个TEdit控件,需要将它们的数据导出到文件中。如果逐个编写如下代码很简单:
fprintf(data_fptr, "%s", Form1->Edit1->Text); fprintf(data_fptr, "%s", Form1->Edit2->Text); fprintf(data_fptr, "%s", Form1->Edit3->Text); // ...以此类推
但我不想这么做,尝试了一个循环来节省代码量:edit_n是拼接后的字符串,buffer用于存储数字(1-99),第一个拼接后的字符串为"Form1->Edit1->Text"。
data_fptr = fopen("c:\\test\\test.ini", "w+"); char edit_n[80]; char buffer[80]; int n = 1; do { sprintf(buffer, "%d", n); strcat(edit_n, "Form1->Edit"); // 字符串第一部分 strcat(edit_n, buffer); // Edit控件的编号 strcat(edit_n, "->Text"); // 字符串最后部分 fprintf(data_fptr, "%ls\n", edit_n); // 将字符串(数据)写入文件 n++; // 递增编号 sprintf(edit_n, ""); // 清空字符串供下次使用 } while (n < 100); fclose(data_fptr);
这段代码能运行,但并未将Edit1中的数据写入文件,而是输出了拼接后的字符串"Form1->Edit1->Text"。我不是专业程序员,试过自己会的方法但没用,请问遗漏了什么?该如何正确实现需求?
解决方案
你的代码问题在于:拼接出来的"Form1->Edit1->Text"只是一串普通字符串,程序不会自动把它当成控件的属性去解析,所以写入的只是字符串字面量,而非控件的实际内容。
以下是两种正确的实现方式:
方式一:通过控件名称精准查找
利用VCL的FindComponent方法,通过控件的Name属性直接定位到目标TEdit,然后读取它的Text:
FILE* data_fptr = fopen("c:\\test\\test.ini", "w+"); // 一定要判断文件是否打开成功,避免后续出错 if (data_fptr == NULL) { return; } for (int n = 1; n < 100; n++) { // 构造控件名称,比如Edit1、Edit2 AnsiString editName = "Edit" + IntToStr(n); // 在Form1中查找对应名称的控件 TEdit* targetEdit = dynamic_cast<TEdit*>(Form1->FindComponent(editName)); if (targetEdit != NULL) { // 找到有效控件,写入它的文本内容 fprintf(data_fptr, "%s\n", targetEdit->Text.c_str()); } // 若没找到对应控件,直接跳过即可 } fclose(data_fptr);
方式二:遍历Form上所有控件筛选
如果你的TEdit控件都直接放在Form上(没有嵌套在Panel、GroupBox这类容器里),可以遍历Form的所有控件,筛选出符合命名规则的TEdit:
FILE* data_fptr = fopen("c:\\test\\test.ini", "w+"); if (data_fptr == NULL) { return; } for (int i = 0; i < Form1->ControlCount; i++) { TControl* currCtrl = Form1->Controls[i]; // 判断是否是TEdit控件,且名称以Edit开头 if (currCtrl->ClassNameIs("TEdit") && currCtrl->Name.Pos("Edit") == 1) { // 转成TEdit类型,写入文本 fprintf(data_fptr, "%s\n", dynamic_cast<TEdit*>(currCtrl)->Text.c_str()); } } fclose(data_fptr);
额外注意事项
- 你原来的C风格字符串操作存在风险:
edit_n初始化后没有明确设为空字符串,strcat操作可能导致内存越界,用VCL的AnsiString处理字符串拼接更安全可靠。 - 务必检查文件是否成功打开,防止因路径错误、权限不足等问题导致后续操作崩溃。
内容的提问来源于stack exchange,提问作者Kenneth Wood
相关产品推荐
相关产品推荐

