You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

额外注意事项

  1. 你原来的C风格字符串操作存在风险:edit_n初始化后没有明确设为空字符串,strcat操作可能导致内存越界,用VCL的AnsiString处理字符串拼接更安全可靠。
  2. 务必检查文件是否成功打开,防止因路径错误、权限不足等问题导致后续操作崩溃。

内容的提问来源于stack exchange,提问作者Kenneth Wood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 04:13:20