Maks150988
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору A_V Строки Delphi не устроили тем, что впоследствии я расчитывал на использование плагинов, написанных на других языках. Приложение у меня поддерживает полностью Юникод, вроде как можно было напрямую WideString передавать, но я хотел еще сделать Ansi варинат для устаревших систем. Так что потом можно было легко поменять PWideChar на PAnsiChar. Вобщем так, кода многовато, поехали... Будем считать, что у меня уже запущена программа и массив pAccountData (TAccountInfoExArr это Array of ACCOUNT_INFO_EX) заполнен необходимыми значениями. Для манипуляции с массивом используется тот код функций из предыдущего сообщения. Для примера обновим 3 элемент массива значениями из структурки ptrInfo. Эту структуру заполняет функция UpdateItemInfo, в которую плагин передает некоторые значения. Если UpdateItemInfo вернула True, значит обновим столбцы и строки ListView и обновим элемент в массиве pAccountData. var bRet : Boolean; ptrInfo : ACCOUNT_INFO_EX; begin bRet := UpdateItemInfo(3, ptrInfo); if bRet then begin UpdateListItem(hListView, 3, ptrInfo); UpdateArrayItem(pAccountData, 3, ptrInfo); end; end; Сам код функции UpdateListItem приводить не буду полностью. Он грубо говоря примерно такой. Вобщем здесь ошибок уж точно не должно быть... ZeroMemory(@lvi, SizeOf(TLVItemW)); lvi.mask := LVIF_TEXT; lvi.iItem := nDestItem; lvi.iSubItem := IdItem; lvi.pszText := ptrInfo.pszAccount; SendMessageW(hListView, LVM_SETITEMW, 0, Integer(@lvi)); Код функции UpdateArrayItem в предыдущем сообщении. Приведу лучше код функций UpdateItemInfo (заполняет инфой от плагина заветную структуру). Может и тут косячок... function UpdateItemInfo(const IdItem: Integer; var ptrInfo: ACCOUNT_INFO_EX): Boolean; var dwInfoIndex: Integer; ai : ACCOUNT_INFO; exec : TPluginExecute; st : TSystemTime; pszText : WideString; begin Result := FALSE; ZeroMemory(@ai, SizeOf(ACCOUNT_INFO)); ai.pszLogin := pAccountData[IdItem].pszLogin; ai.pszPassword := pAccountData[IdItem].pszPassword; ai.cchPasswordMax := pAccountData[IdItem].cchPasswordMax; ai.fBalance := pAccountData[IdItem].fBalance; ai.fOverdraft := pAccountData[IdItem].fOverdraft; ai.pszTarif := pAccountData[IdItem].pszTarif; ai.cchTarifMax := pAccountData[IdItem].cchTarifMax; ai.dwTarifDays := pAccountData[IdItem].dwTarifDays; ai.dwTarifDaysLeft := pAccountData[IdItem].dwTarifDaysLeft; ai.dwErrorCode := pAccountData[IdItem].dwErrorCode; ai.pszError := pAccountData[IdItem].pszError; ai.cchErrorMax := pAccountData[IdItem].cchErrorMax; dwInfoIndex := pAccountData[IdItem].dwEqualIndex; if (dwInfoIndex <> -1) then begin exec := pPluginData[dwInfoIndex].exec; Result := exec(ai); end; if Result then begin GetLocalTime(st); pszText := FormatUpdateTimeDateW(st); ptrInfo.bUpdateState := pAccountData[IdItem].bUpdateState; ptrInfo.clsid := pAccountData[IdItem].clsid; ptrInfo.dwEqualIndex := pAccountData[IdItem].dwEqualIndex; ptrInfo.pszAccount := pAccountData[IdItem].pszAccount; ptrInfo.cchAccountMax := pAccountData[IdItem].cchAccountMax; ptrInfo.pszLogin := pAccountData[IdItem].pszLogin; ptrInfo.cchLoginMax := pAccountData[IdItem].cchLoginMax; ptrInfo.pszPassword := pAccountData[IdItem].pszPassword; ptrInfo.cchPasswordMax := pAccountData[IdItem].cchPasswordMax; ptrInfo.fBalance := ai.fBalance; ptrInfo.fOverdraft := ai.fOverdraft; ptrInfo.pszTarif := ai.pszTarif; ptrInfo.cchTarifMax := ai.cchTarifMax; ptrInfo.pszUpdated := LPWSTR(pszText); ptrInfo.cchUpdatedMax := (lstrlenW(ptrInfo.pszUpdated) + 1) * SizeOf(WideChar); ptrInfo.dwTarifDays := ai.dwTarifDays; ptrInfo.dwTarifDaysLeft:= ai.dwTarifDaysLeft; ptrInfo.dwErrorCode := ai.dwErrorCode; ptrInfo.pszError := ai.pszError; ptrInfo.cchErrorMax := ai.cchErrorMax; ptrInfo.bYellowAlert := pAccountData[IdItem].bYellowAlert; ptrInfo.fYellowAlert := pAccountData[IdItem].fYellowAlert; ptrInfo.bRedAlert := pAccountData[IdItem].bRedAlert; ptrInfo.fRedAlert := pAccountData[IdItem].fRedAlert; end; end; Тут собственно просто. Заполняем структуру ACCOUNT_INFO (не ACCOUNT_INFO_EX!) данными из текущей ACCOUNT_INFO_EX (ну нужен логин и пароль просто) и подаем ее в функцию PluginExecute. Она выдает данные и мы присваиваем их в структуре ptrInfo. Ну а вот и сама родимая PluginExecute из плагина... function PluginExecute(out ai: ACCOUNT_INFO): BOOL; stdcall; type TBillingInfo = record errorCode : Integer; msgError : LPWSTR; balanceMoney: Double; balanceDraft: Double; tarifName : LPWSTR; tarifDays : Integer; daysLeft : Integer; end; const pszTarif: LPWSTR = 'Обычный тарифный план'; pszError: LPWSTR = 'Ошибок не обнаружено'; var binfo: TBillingInfo; begin ZeroMemory(@binfo, SizeOf(TBillingInfo)); binfo.errorCode := NO_ERROR; binfo.msgError := pszError; binfo.balanceMoney:= 250.00; binfo.balanceDraft:= 30.00; binfo.tarifName := pszTarif; binfo.tarifDays := -1; binfo.daysLeft := -1; ai.fBalance := binfo.balanceMoney; ai.fOverdraft := binfo.balanceDraft; ai.pszTarif := binfo.tarifName; ai.cchTarifMax := (lstrlenW(ai.pszTarif) + 1) * SizeOf(WideChar); ai.dwTarifDays := binfo.tarifDays; ai.dwTarifDaysLeft := binfo.daysLeft; ai.dwErrorCode := binfo.errorCode; ai.pszError := binfo.msgError; ai.cchErrorMax := (lstrlenW(ai.pszError) + 1) * SizeOf(WideChar); Result := TRUE; end; Вобщем-то у меня попутно вопрос. Может теряются указатели после UpdateListItem перед UpdateArrayItem? Или данные в ptrInfo становятся невалидными... |