Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.07;
Скачать: [xml.tar.bz2];




Вниз

Кто-нибудь занимался интерфейсами на Дельфи? 


star   (2002-01-17 12:32) [0]

Люди, помогите! Разбирался с интерфейсами - ничего не понял! Вроде документация на русском, и сам вроде не тупой, но ничего не понял !!! Нужно работать с нитерфейсом IHTMLDocument2. На мои жалкие попытки Дельфи ругались разными словами. Может кто-нибудь сможет объяснить на элементарных примерах, что такое эти интерфейсы, и как с ними работать ...
Не могу уже, голова опухла ...



Digitman   (2002-01-17 12:46) [1]

Интерфейс - это, по сути, некий класс, все методы которого явл-ся абстрактными и являются public-методами (хотя это явно не оговаривается в декларации интерфейсных методов).
Лекция на тему интерфейсов затянется надолго, поверь. Лучше приведи фрагменты своего кода, на который Делфи "ругается" (и какими словами - дословно) с твоими комментариями (что ты делаешь в каждой строчке)



star   (2002-01-17 15:09) [2]

Собственно код этот был лишь проба. Я объявил переменную типа этого интерфейса - дельфи не понял. Я объявил переменную типа IUnknown и попробовал применить метод Query... - результат тот же ... Я про них вообще ничего не понял ...



Digitman   (2002-01-17 15:17) [3]

Чтобы Делфи "понял", он должен знать, где находится декларация интерфейса.



Romkin   (2002-01-17 15:20) [4]

Help -> Developing COM-based applications



Digitman   (2002-01-17 15:25) [5]

>Romkin
Тоже верно)



yaJohn   (2002-01-17 15:25) [6]

Izvinite, no mne sozdanie ekzempliara interfeysa kajetsia neskolko strannim zaniatiem.... Eto vse ravno, chto sozdavat ekzempliari TObject.
>Интерфейс - это, по сути, некий класс
Ne sovsem tak.
Interface eto, esli ugodno, deklaracia nekotorogo nabora metodov. Esli class realizuet interface, eto znachit, chto on perekrivaet vse abstraktnie metodi etogo interfeisa.



Digitman   (2002-01-17 15:37) [7]

>yaJohn
Не перекрывает, а РЕАЛИЗУЕТ ! Не вноси терминологическую путаницу.

И создание экземпляра интерфейса, как ты говоришь, - тоже нонсенс.



yaJohn   (2002-01-17 16:00) [8]

2 Digitman
Soglasen, soglasen...
Kstati, putanica chasto voznikaet mejdu COM poniatiem interfeysa i ObjectPascal. Oni hot i pohoji, no... O poslednem (Interface v "chistom" Pascal ponimanii) informacii voobshe prakticheski net. Esli ne prav - nastavte na put" istinniy. Naprimer, ya mogu obiavit v interface nekoe property i ego metodi read/write. V realizacii realizuem metodi read/write, a o samom property mojno i ne vspominat". No i obratitsia k nemu nelzia.
IInt = interface
procedure setx(xxx:integer);
function getx:integer;
property x: integer read getx write setx;
end;

TInt = class (TInterfacedObject,IInt)
private
fx:integer;
procedure setx(xxx:integer);
function getx:integer;
end;
.....
{ TInt }

function TInt.getx: integer;
begin
result:=fx;
end;

procedure TInt.setx(xxx: integer);
begin
fx:=xxx;
end;

......

procedure TForm1.Button1Click(Sender: TObject);
var i:TInt;
begin
i.x:=1; -- ERROR
end;

Pochemu????



vuk   (2002-01-17 16:05) [9]

Все правильно. Свойство-то объявлено в интерфейсе, а не в классе. Где объявили там и используем.



yaJohn   (2002-01-17 16:05) [10]

Pardon, nado utochnit"....
Oshibka kompiliacii. T.e. property u interfeysov ne nasleduutsia???? A zachem oni togda nujni????



yaJohn   (2002-01-17 16:09) [11]

>Где объявили там и используем
Kak? Esli u interfeysa koda po opredeleniu net.



Romkin   (2002-01-17 16:15) [12]


IInt = interface
procedure set_x(xxx:integer);
function get_x:integer;
property x: integer read get_x write set_x;
end;

TInt = class (TInterfacedObject,IInt)
public
fx:integer;
procedure set_x(xxx:integer);
function get_x:integer;
end;
.....
{ TInt }

function TInt.get_x: integer;
begin
result:=fx;
end;

procedure TInt.set_x(xxx: integer);
begin
fx:=xxx;
end;

......

procedure TForm1.Button1Click(Sender: TObject);
var i:IInt;
begin
i := TInt.Create;
i.x:=1;
Label1.Caption := IntToStr(i.x);
end;


Должно пройти. У меня работает



Digitman   (2002-01-17 16:20) [13]

>yaJohn
Наследуются. Но переопределить в интерфейсе-наследнике св-во, объявленное в интерфейсе-предке, нельзя. Эдак знаешь сколько умников найдется, желающих переделать тот же IHTMLDocument2 ?

А на основание чего ты, кстати, ассоциируешь некую ошибку компиляции строки i.x:=1 с каким-то там вымышленным "наследованием" ? Что такое i.x в соответствии с твоим примером кода ? Где и как сие декларировано ? Где, что и как наследуется в дан.примере ?

Если ты про строчку
TInt = class (TInterfacedObject,IInt),

то говорят, что "объявленный класс TInt наследует класс TInterfacedObject и реализует интерфейсы IUnknown и IInt"



Romkin   (2002-01-17 16:24) [14]

Вся соль - в особенности Delphi:

var i:IInt;
begin
i := TInt.Create;

То есть переменная - интерфейс, а создается объект, компилятор сам делает QueryInterface



vuk   (2002-01-17 16:32) [15]

>Kak? Esli u interfeysa koda po opredeleniu net
Кода нет, а определение-то есть. Свойство применимо только к интерфейсу, посколько свойство в нем определено. В классе свойство не определено и применено к классу быть не может.



Axel   (2002-01-17 16:42) [16]

> star © (17.01.02 12:32)
maybe it helps you
http://www.optim.ru/cs/Topics/TopicCom.asp
http://www.rsdn.ru/summary/?266
http://www.rusdoc.ru/material/lang/other/activex/active.shtml
http://www.interface.ru/fset.asp?Url=/borland/com_dcom.htm
http://www.sei.cmu.edu/str/descriptions/com_body.html
http://www.rkstudio.narod.ru/comyou/comyou.html
good luck



yaJohn   (2002-01-17 16:55) [17]

2 Romkin
VAU!!! Rabotaet!!! Ili
var i: TInt;
begin
i := TInt.Create;
IInt(i).x:=1;

No (i as IInt).x - ne idet.
Vse ravno - spasibo OGROMNOE!

2 Digitman
>А на основание чего ты, кстати, ассоциируешь некую ошибку компиляции строки i.x:=1 с каким-то там вымышленным "наследованием" ?
---8<---
Интерфейс - это, по сути, некий класс, все методы которого явл-ся абстрактными и являются public-методами
© Digitman
---8<---
I krome togo, mehanizmi realizacii interface i override metodov realizovani v Delphi nastolko pohoje, chto voznikaet oshushenie (vozmojno oshibochnoe), chto eto odno i toje. Ya ne hochu vpadat v polemiku. Etot vopros deystvitelno ochen interesniy i malo izuchenniy. Risknu skazat, chto i malo prorabotanniy Borland.
Interface - moshneyshiy mehanizm, odnako v VCL ispolzuetsia krayne epizodicheski.
Ya budu krayne priznatelen vsem za lubuu informaciu po etomu voprosu napriamuu ili v linkah, zdes" ili na milo. Jelatelno, konechno, na russkom. I ne o COM, a imenno o Interface v kontekste OOP & Delphi.



Romkin   (2002-01-17 17:10) [18]

2yaJohn
Не извращайся, объявление var i:TInt; означает, что тебе надо вызвать i.Free... После всего. при var i:IInt; этого не надо - выйдет из области видимости, и вызовется Release, а TInterfacedObject при обнулении счетчика себя уничножает.



Digitman   (2002-01-17 17:13) [19]

>yaJohn
>>Interface - moshneyshiy mehanizm, odnako v VCL ispolzuetsia >>krayne epizodicheski

Не в VCL, а в примитивных букварях (и - кажущихся на первый взгляд - более серьезных изданиях) по программирования в среде Делфи. Все это на поверку не перекрывает диапазона познаний "чайника", которому какие-то там интерфейсы не нужны вовсе, чтобы "накидать батонов".
А вот загляни-ка ты, скажем, в демо-проект scktsrvr.dpr, где реализован Borland Socket Server (BSS). Серьезный ведь бизнес-продукт, согласись ? Так вот он просто пронизан насквозь использованием интерфейсов ! Ну чем не пособие ? Взамен книжкам по "киданию батонов" ?



vuk   (2002-01-17 17:35) [20]

>I krome togo, mehanizmi realizacii interface i override metodov
>realizovani v Delphi nastolko pohoje
В каком смысле "похоже"? Я бы не сказал. Это разные вещи как по сути, так и по результату на выходе. Возможно Вас сбивает с толку то, что реализуемые интерфейсы перечисляются в одном списке с классом-предком...



Владимир Васильев   (2002-01-17 19:19) [21]

Фрагмент фильтрует теги <В> и покозывает сам текст


Var
Doc : IHTMLDocument2;
All : IHTMLElementCollection;
Item : OleVariant;
Len,i : Integer;
S : String;
.....

Doc := WebBrowser1.Document as IHTMLDocument2;
while doc.readyState<>"complete"
do application.ProcessMessages;

All := Doc.All;
Len := All.Length;
for i := 0 to Len - 1 do
begin
Item := All.Item(i, varEmpty);
if Item.Tagname="B" then
begin
S:=Item.InnerText;// что там у меня такое "жирное" в тексте ?
end;
end;

Doc:=nil;
All:=nil;



oomneeq   (2002-01-17 21:09) [22]

http://195.162.48.134/Doc/Delphi/2001_05_delphi_com/#01



star   (2002-01-18 09:21) [23]

To Владимир Васильев:
Огромное спасибо за практический пример. Мне действительно нужно вытащить ХТМЛ, но не из WebBrowser, а из чужого окна класса Internet Explorer_Server. Попробую воспользоваться Вашим примером. Единственное, что меня смущает: Дельфи кричал, что не знает что такое IHTMLDocument2. Где объявлен этот интерфейс?

Вот что мне не нравится в той документации, что я читал, так это то, что нет нормальных практических примеров использования интерфейсов. Везде начинают с "создадим свой интерфейс ..." и сюсюкаются с этим своим интерфейсом не несущим никакой полезной информации, а в следующей главе рвут с места в карьер, приводя дикое нагромождение непонятного кода и ничего не поясняя ...



Владимир Васильев   (2002-01-18 11:05) [24]

Если ВСЁ ОЧЕНЬ УПРОСТИТЬ то когда вы работаете с "чужими" интерфейсами - то вы их скорее не "создаёте" - точнее будет сказать вы их их получаете :
(хотя в справке конечно вы прочтёте напр. : "Creates a single uninitialized object ... ").

Напр, для работы с WinMediaPlayer вам,сначала, нужно получить у COM сервера интерфейс IGraphBuilder

Объявляем
GB : IGraphBuilder

Проверяем, а поддерживается ли наш интерфейс есди да то GB содержит ссылку на него
hr:=CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC, IID_IGraphBuilder, GB);
if (FAILED(hr)) then
begin
messagebox(self.Handle,pchar(geterror(hr)),"Error",MB_OK);
end;

И далее уже получаем другие нужные интерфейсы используя полученный ранее GB

MC : IMediaControl
hr := GB.QueryInterface(IID_IMediaControl, MC) ;
if failed(hr) then ...

Вернёмся к IE. Вам необходимо импортировать две библиотеки типов:

Type Lib: C:\WINNT\System32\shdocvw.dll

Type Lib: C:\WINNT\System32\mshtml.tlb //IHTMLDocument2 описан здесь

Ваши шаги (предварительно прочтите хелп на команды меню)
Из Delphi:
1 : Component->Import ActiveX Control
2 : Project-> Import Type Library

Практическая работа с интерфейсами лучше всего описана
у Чарльза Калверта в его замечательных книгах Delphi UnLeashed 2
(Direct X ) и Delphi UnLeashed 4 (IE, Word, Excel ). Они, конечно, дорогие - но это лучшее, что есть в продаже.

Удачи.



iZEN   (2002-01-19 19:03) [25]

Отличная книжка: "Разработка COM-приложений в среде Delphi", Хармон, издательство: Вильямс, вышла в апреле 2000, 464 страниц.

Аннотация.
Книга посвящена методике разработки приложений на базе модели составных объектов (СОМ) в среде Delphi. В первых пяти главах детально рассматриваются основные идеи модели СОМ и способы ее реализации в среде Delphi. Здесь же достаточно подробно описаны два распространенных программных продукта, которые могут служить основой для создания разнообразных прикладных СОМ-приложений — Microsoft ADO и Microsoft Agent. В последующих четырех главах возможности СОМ-технологии рассматриваются более углубленно. Читатель знакомится с методикой создания сетевых взаимодействующих приложений, средствами хранения структурированных данных в едином файле, наборами свойств и контейнерами OLE, использованием модели СОМ для расширения возможностей оболочки Windows. Книга рассчитана на читателей, имеющих опыт работы в среде Delphi.

[ http://www.books.ru/shop/books/6414]



star   (2002-01-21 12:28) [26]

Вот пример из MSDN на С++, как получить IHTMLDocument2 из окна класса Internet Explorer_Server (в окно такого класса вводится текст письма в Outlook Express, такое окно создается так же IE). Я попытался переделать его на Дельфи - костьми лег, ничего не получается. В дельфи есть и IHTMLDocument2, и IHtmlWindow2 и прочее. Борланды позаботились, но как я не бился - ничего не получается. До сих пор я считал, что Дельфи ничуть не хуже С++ (а в некоторых случаях даже лучше). Теперь сомнения берут ... Может, конечно, просто знаний нехватает...
Может здесь есть знатоки обоих языков, помогут перевести?
(Просто разработана здоровенныя программа, одной из функций которой будет вытаскивание хтмл-а из IE-серверов. Она написана на дельфи, и я не в состоянии перевести ее всю на С++)

#include <mshtml.h>
#include <atlbase.h>
#include <oleacc.h>

BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
TCHAR buf[100];

::GetClassName( hwnd, (LPTSTR)&buf, 100 );
if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
{
*(HWND*)lParam = hwnd;
return FALSE;
}
else
return TRUE;
};

//You can store the interface pointer in a member variable
//for easier access
void CDlg::OnGetDocInterface(HWND hWnd)
{
CoInitialize( NULL );

// Explicitly load MSAA so we know if it"s installed
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
if ( hInst != NULL )
{
if ( hWnd != NULL )
{
HWND hWndChild=NULL;
// Get 1st document window
::EnumChildWindows( hWnd, EnumChildProc, (LPARAM)
&hWndChild );

if ( hWndChild )
{
CComPtr<IHTMLDocument2> spDoc;
LRESULT lRes;

UINT nMsg = ::RegisterWindowMessage(
_T("WM_HTML_GETOBJECT") );

::SendMessageTimeout( hWndChild, nMsg, 0L, 0L,
SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );

LPFNOBJECTFROMLRESULT pfObjectFromLresult =
(LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst,
_T("ObjectFromLresult") );

if ( pfObjectFromLresult != NULL )
{
HRESULT hr;
hr = (*pfObjectFromLresult)( lRes,
IID_IHTMLDocument, 0, (void**)&spDoc );

if ( SUCCEEDED(hr) )
{
CComPtr<IDispatch> spDisp;
CComQIPtr<IHTMLWindow2> spWin;
spDoc->get_Script( &spDisp );
spWin = spDisp;
spWin->get_document( &spDoc.p );
// Change background color to red
spDoc->put_bgColor( CComVariant("red") );
}
}
} // else document not ready
} // else Internet Explorer is not running
::FreeLibrary( hInst );
} // else Active Accessibility is not installed
CoUninitialize();
}



nikkie   (2002-01-21 15:35) [27]

сорри, а у тебя oleacc.dll есть?



star   (2002-01-23 10:20) [28]

Есть, конечно.



Romkin   (2002-01-23 11:43) [29]

Переводить не советую - это пример, как обращаться с интерфейсом "вручную", обычно пользуются функциями OLE.
Может, тебе нужно что-то подобное?

uses
..., shdocvw;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
Browser: Variant;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses MSHTML, COMObj;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
Doc: Variant;
begin
Browser := CoInternetExplorer.Create; //or GetActiveOleObject(CLASS_InternetExplorer);
Browser.Navigate(Edit1.Text);
Browser.Visible := true;
Doc := (Browser.Document);
Memo1.Text := Doc.Body.InnerHTML;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Browser.Quit;
end;



nikkie   (2002-01-23 12:35) [30]

>Romkin
нее... это не то. star же говорит: "одной из функций программы будет вытаскивание хтмл-а из IE-серверов" - то есть не только из IE, а из любого приложения, хостящего MSHTML.

>star
а у меня такой dll и нет... ну покажи как переводишь или конкретно - в чем проблема?



Romkin   (2002-01-23 14:03) [31]

А здесь что? Пример - загрузка документа и получение в Memo1 его боди
Browser.Visible := true; - можно выкинуть, и тогда никто не догадается, откуда HTML :-))
А из любого приложения - у каждого сервера COM свой интерфейс... Здесь - что-то, предоставляющее IWebBrowser, у меня это IE4



nikkie   (2002-01-23 14:33) [32]

>А из любого приложения - у каждого сервера COM свой интерфейс...
вот именно. твой пример работает только с IE. с тем же Outlook"ом он работать не будет, понятное дело. а пример, приведенный star"ом видимо претендует на то, что сможет это сделать. посмотри, что он делает - это вовсе не обычный пример использования интерфейсов в си.

честно говоря, про эту Active Accessibility я первый раз услышал, поэтому весьма любопытно.



Romkin   (2002-01-23 15:16) [33]

Сдаюсь. Для перевода надо бы полное описание функции ObjectFromLresult - было бы удобней
Итак:

BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
TCHAR buf[100];

::GetClassName( hwnd, (LPTSTR)&buf, 100 );
if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
{
*(HWND*)lParam = hwnd;
return FALSE;
}
else
return TRUE;
};

Лучше перевести так

uses ComObj; //там потребуется, чтобы CoInitialize не вызывать...

function EnumChildProc(Handle:HWND; Param: LParam): BOOL; stdcall;
var
Buffer: string;
nSize: integer;
begin
nSize := GetClassName(Handle, nil, 0);
SetLength(Buffer, nSize);
GetClassName(Handle, PChar(Buffer), nSize);
if AnsiCompareText(Buffer,"Internet Explorer_Server") = 0 then
begin
HWND(Param) := Handle;
Result := False; //found
end
else Result := True; //continue Enum
end;

Вроде ошибок нет... Поправьте, если чо



Romkin   (2002-01-23 16:22) [34]

полностью star © (21.01.02 12:28) переводится примерно так
(могут быть неточности в прототипах.... ObjectFromLresult)

uses MSHTML, ActiveX;

{$R *.DFM}

function EnumChildProc(Handle:HWND; Param: LParam): BOOL; stdcall;
var
Buffer: string;
nSize: integer;
begin
nSize := GetClassName(Handle, nil, 0);
SetLength(Buffer, nSize);
GetClassName(Handle, PChar(Buffer), nSize);
if AnsiCompareText(Buffer,"Internet Explorer_Server") = 0 then
begin
HWND(Param) := Handle;
Result := False; //found
end
else Result := True; //continue Enum
end;

{
STDAPI ObjectFromLresult(
LRESULT lResult,
REFIID riid,
WPARAM wParam,
void** ppvObject
);
}


type
TObjectFromLResultProc =
function(ALRes: LResult; const IID: TGuid; WPar: WParam; out Obj): HResult; stdcall;

//Вообще-то это событие OnGetDocInterface объекта CDlg - ???

procedure GetDocInterface(AHandle: HWND);
var
hInst: HModule;
ObjectFromLResultProc:TObjectFromLResultProc;
spDoc: IHTMLDocument;
spDoc2: IHTMLDocument2;
nMsg: Cardinal;
lRes: LResult;
hWndChild: HWND;
hr: HResult;
spDisp: IDispatch;
spWin: IHTMLWindow2;
begin
if AHandle = 0 then exit;
hWndChild := 0;
//Get 1st document window
EnumChildWindows(AHandle, @EnumChildProc, hWndChild);
if hWndChild = 0 then exit; //Document not ready

hInst := LoadLibrary("OLEACC.DLL");
if hInst = 0 then exit; //не загрузилось...
CoInitialize(nil);
try
nMsg := RegisterWindowMessage("WM_HTML_GETOBJECT");
SendMessageTimeout(hWndChild, nMsg, 0, 0, SMTO_ABORTIFHUNG,
1000, DWORD(lRes));
ObjectFromLResultProc := nil;
ObjectFromLResultProc := GetProcAddress(hInst,"ObjectFromLresult");
if @ObjectFromLResultProc <> nil then begin
hr := ObjectFromLResultProc(lRes, IID_IHTMLDocument, 0, spDoc);
if succeeded(hr) then
begin
spDisp := spDoc.Script;
spWin := IHTMLWindow2(spDisp);
spDoc2 := spWin.Document; //????
//change color
spDoc2.bgColor := clRed;
end;
end;
finally
ObjectFromLResultProc := nil;
FreeLibrary(hInst);
CoUninitialize;
end;
end;

2nikkie: и все равно это вызовы к IE



Romkin   (2002-01-23 16:26) [35]

ессно, подразумевается uses Windows, Messages :-))
CoInitialize/CoUninitialize - в принципе не нужно, это делается в ActiveX.pas



nikkie   (2002-01-23 16:55) [36]

>Romkin
большой пирожок тебе от star"a должен быть :)))

я бы только сказал, что вместо
spDoc2.bgColor := clRed
должно быть
spDoc2.bgColor := "red"
но к сути дела эта строчка никакого отношения не имеет :)

>и все равно это вызовы к IE
смотря, что ты под IE подразумеваешь. если iexplore.exe - то я не согласен.

честно говоря, в этом коде мне непонятны манипуляции

if succeeded(hr) then
begin
spDisp := spDoc.Script;
spWin := IHTMLWindow2(spDisp);
spDoc2 := spWin.Document;
end

поскольку исходный код - микрософтовский, то надо верить, что были на то причины. но я бы все же попробовал просто
spDoc2 = (spDoc as IHTMLDocument2)



Romkin   (2002-01-23 17:02) [37]

Мда, точно, spDoc2.bgColor := "red"
А насчет манипуляции - получаем IHTMLDocument, потом его окно, а потом оттуда- IHTMLDocument2
Впрочем, как видно в Romkin © (23.01.02 11:43)
просто делаешь все Variant и работаешь в нем... (spDoc: Variant), и все должно работать...



star   (2002-01-23 18:07) [38]

To Romkin: Будете в Смоленске - с меня пиво! Пойду пробовать, завтра сообщу о результатах ...



star   (2002-01-24 19:30) [39]

Урррррра! Работает! Вытаскивает и текст, и ХТМЛ из IE и из Outlook Express, и даже из Проводника. Классно!

ОГРОМНОЕ СПАСИБО Romkin, ВЫ МНЕ ОЧЕНЬ ПОМОГЛИ! (Предложение про пиво остается в силе :-)))))

Спасибо так же всем, кто пытался объяснить мне, что такое интерфейсы и как с ними работать. Я, правда, еще не совсем въехал, но въеду, это точно.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.07;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.83 MB
Время: 0.032 c
1-18913           Reals                 2002-01-21 19:53  2002.02.07  
Как подцепить в процедуру копирования файла ProgressBar...


1-18863           dim2001               2002-01-22 21:44  2002.02.07  
Как распечатать StringGrid на лазерном принтере?


14-18951          paul_shmakov          2001-12-17 16:28  2002.02.07  
сортировка по датам в поиске


1-18896           Song                  2002-01-23 21:15  2002.02.07  
Распечатать StringGrid!!!!


4-19017           Андрей                2001-08-20 22:08  2002.02.07  
Как увеличить и уменшить громкость звука!!!!