Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2018.04.22;
Скачать: CL | DM;

Вниз

массив из oleacc.IAccessible через TList   Найти похожие ветки 

 
istok20 ©   (2016-04-22 10:49) [0]

подскажите, как организовать запись\чтение множества переменных типа oleacc.IAccessible  используя TList ?


 
sniknik ©   (2016-04-22 11:17) [1]

в смысле "организовать"? создаешь список, добавляешь туда указатели на интерфейсы... обычная работа с TList. не работает что то?


 
istok20 ©   (2016-04-22 11:21) [2]


> добавляешь туда указатели на интерфейсы


угу, весь вопрос как добавлять указатель и читать его, можете показать?


 
sniknik ©   (2016-04-22 11:44) [3]

без проверок/гарантий, и на других обьектах
procedure TForm1.Button1Click(Sender: TObject);
var
 PRecordset: ^_Recordset;
begin
 List:= TList.Create;
 New(PRecordset);
 PRecordset^:= CoRecordset.Create;
 List.Add(PRecordset);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 Recordset: _Recordset;
begin
 Recordset:= _Recordset(List.Items[0]^);
 List.Delete(0);
 if Recordset.State = 0 then Caption:= "Closed"
 List.Free;
end;


 
sniknik ©   (2016-04-22 11:45) [4]

ну да, Dispose забыл.  точно без гарантий.


 
sniknik ©   (2016-04-22 11:49) [5]

ну и да, я бы лучше не с указателями, а на объектах бы сделал (TObjectList)...  проблем меньше, освобождать не нужно, только свой объект описать и вместо New его создавать.


 
istok20 ©   (2016-04-22 11:53) [6]

у меня

aia: oleacc.IAccessible;

как с ним будет выглядеть? тоже отдельный указатель объявлять?


 
istok20 ©   (2016-04-22 17:55) [7]

вот норм решение предложили)

function AddAccessible(AList: TList; AAccessible: IAccessible): Integer; inline;
begin
 Result := AList.Add(Pointer(AAccessible));
 AAccessible._AddRef;
end;

procedure DeleteAccessible(AList: TList; AIndex: Integer); inline;
var
 Accessible: IAccessible;
begin
 Accessible := IAccessible(AList[AIndex]);
 Accessible._Release;
 AList.Delete(AIndex);
end;

function GetAccessible(AList: TList; AIndex: Integer): IAccessible; inline;
begin
 Result := IAccessible(AList[AIndex]);
end;


 
sniknik ©   (2016-04-23 00:12) [8]

интерфейс размерность 16 байт, поинтер 4, да уж "норм" решение.


 
KilkennyCat ©   (2016-04-23 09:46) [9]

зачем использовать нетипизированный указатель, когда тип известен?


 
istok20 ©   (2016-04-23 22:33) [10]


> sniknik ©   (23.04.16 00:12) [8]


т.е. такой код потенциально опасен? погонял, пока что не было проблем...


> KilkennyCat ©   (23.04.16 09:46) [9]


можете показать пример, как сделать на типизированном указателе?


 
sniknik ©   (2016-04-25 11:00) [11]

> т.е. такой код потенциально опасен? погонял, пока что не было проблем...
ну, размерность не совпадает, очевидно. а нет проблем может от того что память выделяется минимальными блоками в 16 байт, т.е. даже с выходом хватает, мало данных и случайно еще не пересекаются, не заметил, или еще чего...

но я бы не рискнул так писать.


 
sniknik ©   (2016-04-25 11:01) [12]

> можете показать пример, как сделать на типизированном указателе?
пример sniknik ©   (22.04.16 11:44) [3]
как раз типизированный.



Страницы: 1 вся ветка

Текущий архив: 2018.04.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.004 c
4-1289311489
neversleep
2010-11-09 17:04
2018.04.22
Своё сообщение в EventLog Windows


2-1459763922
Dmk
2016-04-04 12:58
2018.04.22
Вращение


4-1288182533
Morgan128
2010-10-27 16:28
2018.04.22
Запуск процесса


4-1285868805
ProgRAMmer Dimonych
2010-09-30 21:46
2018.04.22
Метафайлы тормозят при ресайзе


2-1461353048
BondFx
2016-04-22 22:24
2018.04.22
MD5