netease-kit / NIM_PC_Demo

云信Windows(PC) C/C++ Demo源码仓库
Other
275 stars 174 forks source link

请问通讯录选择器的转发人数上限在哪里修改。 #97

Open yipyeukyi opened 2 years ago

yipyeukyi commented 2 years ago

转发消息给千人时失败,转发消息给千人时失败,拉群时同样。表现为消息未转发通信录选择器崩溃

yipyeukyi commented 2 years ago

请问是超出数组场长度导致的的吗 或者是其他的原因改如何修改

nmgwddj commented 2 years ago

没有设置上限,崩溃有源码可以尝试调试查找原因。

yipyeukyi commented 2 years ago

没有设置上限,崩溃有源码可以尝试调试查找原因。

不是崩溃只是选择器千人后通讯录选择器按下确定,界面关闭未转发。

nmgwddj commented 2 years ago

没有设置上限,崩溃有源码可以尝试调试查找原因。

不是崩溃只是选择器千人后通讯录选择器按下确定,界面关闭未转发。

可以在转发代码逻辑位置下断点观察代码走向。

yipyeukyi commented 2 years ago

没有设置上限,崩溃有源码可以尝试调试查找原因。

不是崩溃只是选择器千人后通讯录选择器按下确定,界面关闭未转发。

可以在转发代码逻辑位置下断点观察代码走向。

XD请教下转发逻辑代码在那个文件。

nmgwddj commented 2 years ago

https://github.com/netease-kit/NIM_PC_Demo/blob/a3a504a33c957922edcdfdfbccbbbc36bc729cc4/tool_kits/ui_component/ui_kit/gui/contact_select_form/contact_select_form_ui.cpp#L246

yipyeukyi commented 2 years ago

实测转发上千人时候程序无响应闪退失败,原因位置,思路是多添加按钮,换成500或者300一组的,原因或许绘画list存在上限?

yipyeukyi commented 2 years ago

//注意以下代码是存在错误的,似乎无法获取数值arraylistitem的长度,原因未知,对循环的理解是根据首字母不同分组循环联系人列表,选取其中的全部项目,试图将全部项目转移到新数值统计长度失败。或许整个思路有误。

bool ContactSelectForm::OnBtnCancelClick(ui::EventArgs* param) { int iiname;

UTF8String* arrayid = new UTF8String[3000];

UTF8String* arrayidlove = new UTF8String[3000];

auto arraylistitem = new ContactListItemUI*[3000];

auto arraylistitemlove = new ContactListItemUI*[3000];

int ii = 0;

for (auto& it : tree_node_ver_) {
    for (int i = 0; i < it->GetCount(); i++) {
        auto listitem = (ContactListItemUI*)(it->GetItemAt(i));
        UTF8String id = listitem->GetUTF8DataID();

        // auto* arraylistitem = new ContactListItemUI*[3000];

        // UTF8String* arrayid = new UTF8String[3000];

        arraylistitem[i] = listitem;

        arrayid[i] = id;

        /*
         for (int m = 0; m <= 300; m++) {
ui::CheckBox* checkbox = (ui::CheckBox*)arraylistitem[m]->FindSubControl(L"checkbox");
if (!checkbox->IsSelected()) {
    checkbox->Selected(true, true);

    arraylistitem[m]->Selected(true, true);

    OnCheckBox(arrayid[m], arraylistitem[m]->IsTeam(), checkbox->IsSelected());
}

} */ }

    // int iiname = sizeof(arraylistitem) / sizeof(arraylistitem[0]);

    iiname = sizeof(arraylistitem);

    int length = sizeof(arraylistitem) / sizeof(int);

    int llove = length;

    merge(arraylistitemlove, arraylistitem, 0, 4);

    merg(arrayidlove, arrayid, 0, 4);
    int ii = ii + iiname;
}

int lovename = sizeof(arraylistitemlove);

cout << lovename << endl;

int ff = iiname - 1;

if (lovename <= 300) {
    for (int m = 0; m <= 1; m++) {
        ui::CheckBox* checkbox = (ui::CheckBox*)arraylistitemlove[m]->FindSubControl(L"checkbox");
        if (!checkbox->IsSelected()) {
            checkbox->Selected(true, true);

            arraylistitemlove[m]->Selected(true, true);

            OnCheckBox(arrayidlove[m], arraylistitemlove[m]->IsTeam(), checkbox->IsSelected());
        }
    }
}

/*
 if (lovename <= 300) {
  for (int m = 0; m <= lovename; m++) {
      ui::CheckBox* checkbox = (ui::CheckBox*)arraylistitemlove[m]->FindSubControl(L"checkbox");
      if (!checkbox->IsSelected()) {
          checkbox->Selected(true, true);

          arraylistitemlove[m]->Selected(true, true);

          OnCheckBox(arrayidlove[m], arraylistitemlove[m]->IsTeam(), checkbox->IsSelected());
      }
  }

} */

/*

else {
    for (int m = 0; m <= 300; m++) {
        ui::CheckBox* checkbox = (ui::CheckBox*)arraylistitem[m]->FindSubControl(L"checkbox");
        if (!checkbox->IsSelected()) {
            checkbox->Selected(true, true);

            arraylistitem[m]->Selected(true, true);

            OnCheckBox(arrayidlove[m], arraylistitem[m]->IsTeam(), checkbox->IsSelected());
        }
    }
}

*/
return true;

}

void ContactSelectForm::merge(ContactListItemUI a[], ContactListItemUI b[], int beg, int size) { for (int i = 0; i < size; ++i) a[beg + i] = b[i]; }

void ContactSelectForm::merg(UTF8String a[], UTF8String b[], int beg, int size) { for (int i = 0; i < size; ++i) a[beg + i] = b[i]; }