Автор: Maks150988
Дата сообщения: 18.08.2012 20:56
Frodo_Torbins
A_V
Да вот хотел на простом примере проконсультироваться тут. Не все так просто. Вот рекорд и функции из моего проекта.
[more=Дальше]
type
PACCOUNT_INFO_EX = ^ACCOUNT_INFO_EX;
ACCOUNT_INFO_EX = record
bUpdateState : Boolean;
clsid : TGUID;
dwEqualIndex : Integer;
pszAccount : LPWSTR;
cchAccountMax : Integer;
pszLogin : LPWSTR;
cchLoginMax : Integer;
pszPassword : LPWSTR;
cchPasswordMax : Integer;
fBalance : Double;
fOverdraft : Double;
pszTarif : LPWSTR;
cchTarifMax : Integer;
pszUpdated : LPWSTR;
cchUpdatedMax : Integer;
dwTarifDays : Integer;
dwTarifDaysLeft: Integer;
dwErrorCode : Integer;
pszError : LPWSTR;
cchErrorMax : Integer;
bYellowAlert : Boolean;
fYellowAlert : Double;
bRedAlert : Boolean;
fRedAlert : Double;
end;
type
TAccountInfoExArr = Array of ACCOUNT_INFO_EX;
//
procedure AllocDataItem(var ptrInfo: ACCOUNT_INFO_EX);
begin
GetMem(ptrInfo.pszAccount, ptrInfo.cchAccountMax);
GetMem(ptrInfo.pszLogin, ptrInfo.cchLoginMax);
GetMem(ptrInfo.pszPassword, ptrInfo.cchPasswordMax);
GetMem(ptrInfo.pszTarif, ptrInfo.cchTarifMax);
GetMem(ptrInfo.pszUpdated, ptrInfo.cchUpdatedMax);
GetMem(ptrInfo.pszError, ptrInfo.cchErrorMax);
end;
//
procedure FreeDataItem(var ptrInfo: ACCOUNT_INFO_EX);
begin
FreeMem(ptrInfo.pszAccount, ptrInfo.cchAccountMax);
FreeMem(ptrInfo.pszLogin, ptrInfo.cchLoginMax);
FreeMem(ptrInfo.pszPassword, ptrInfo.cchPasswordMax);
FreeMem(ptrInfo.pszTarif, ptrInfo.cchTarifMax);
FreeMem(ptrInfo.pszUpdated, ptrInfo.cchUpdatedMax);
FreeMem(ptrInfo.pszError, ptrInfo.cchErrorMax);
ptrInfo.pszAccount := nil;
ptrInfo.pszLogin := nil;
ptrInfo.pszPassword := nil;
ptrInfo.pszTarif := nil;
ptrInfo.pszUpdated := nil;
ptrInfo.pszError := nil;
end;
//
procedure CopyDataItem(var DestInfo: ACCOUNT_INFO_EX; const SrcInfo: ACCOUNT_INFO_EX);
begin
lstrcpynW(DestInfo.pszAccount, SrcInfo.pszAccount, DestInfo.cchAccountMax);
lstrcpynW(DestInfo.pszLogin, SrcInfo.pszLogin, DestInfo.cchLoginMax);
lstrcpynW(DestInfo.pszPassword, SrcInfo.pszPassword, DestInfo.cchPasswordMax);
lstrcpynW(DestInfo.pszTarif, SrcInfo.pszTarif, DestInfo.cchTarifMax);
lstrcpynW(DestInfo.pszUpdated, SrcInfo.pszUpdated, DestInfo.cchUpdatedMax);
lstrcpynW(DestInfo.pszError, SrcInfo.pszError, DestInfo.cchErrorMax);
end;
//
procedure CopyArrayItem(var DestInfo: ACCOUNT_INFO_EX; const SrcInfo: ACCOUNT_INFO_EX);
begin
CopyMemory(@DestInfo, @SrcInfo, SizeOf(ACCOUNT_INFO_EX));
AllocDataItem(DestInfo);
CopyDataItem(DestInfo, SrcInfo);
end;
//
function InsertArrayItem(var DynArray: TAccountInfoExArr; const IdItemIndex: Integer; InfoEx: ACCOUNT_INFO_EX): Integer;
var
IdItem: Integer;
iCount: Integer;
begin
iCount := Length(DynArray);
if (IdItemIndex = -1) and (iCount = 0) then
Result := 0
else
if (IdItemIndex = -1) and (iCount <> 0) then
Result := iCount
else
Result := IdItemIndex;
SetLength(DynArray, iCount + 1);
for IdItem := iCount downto (Result + 1) do
DynArray[IdItem] := DynArray[IdItem - 1];
CopyArrayItem(DynArray[Result], InfoEx);
end;
//
function DeleteArrayItem(var DynArray: TAccountInfoExArr; const IdItemIndex: Integer): Integer;
var
bRet : Boolean;
IdItem: Integer;
iCount: Integer;
begin
Result := -1;
bRet := (IdItemIndex >= Low(DynArray)) and (IdItemIndex <= High(DynArray));
if bRet then
begin
FreeDataItem(DynArray[IdItemIndex]);
iCount := Length(DynArray);
for IdItem := (IdItemIndex + 1) to (iCount - 1) do
DynArray[IdItem - 1] := DynArray[IdItem];
SetLength(DynArray, iCount - 1);
Result := Length(DynArray);
end;
end;
//
function UpdateArrayItem(var DynArray: TAccountInfoExArr; const IdItemIndex: Integer; InfoEx: ACCOUNT_INFO_EX): Boolean;
var
bRet : Boolean;
tmpInfo: ACCOUNT_INFO_EX;
IdItem : Integer;
begin
Result := FALSE;
bRet := (IdItemIndex >= Low(DynArray)) and (IdItemIndex <= High(DynArray));
if bRet then
begin
{
FreeDataItem( DynArray[IdItemIndex] );
CopyArrayItem( DynArray[IdItemIndex], InfoEx );
Result := True;
}
CopyArrayItem(tmpInfo, InfoEx);
DeleteArrayItem(DynArray, IdItemIndex);
IdItem := InsertArrayItem(DynArray, IdItemIndex, tmpInfo);
FreeDataItem(tmpInfo);
Result := IdItem <> -1;
end;
end;
[/more]
Функция UpdateArrayItem с закомментированным кодом не отрабатывает как положено. Почему-то в указателях появляется мусор в конце. Вот и удаляю я элемент в списке и заного его добавляю. Хочется просто тупо сделать аналог сообщения, например, LVM_INSERTITEM, где заполняем структуру и контрол сам копирует себе то что нужно и орудует выделенными буферами с текстом. А дальше я достаю инфу из этого массива и отображаю пользователю...